|
|
|
@ -14,6 +14,11 @@ const fetch = require("node-fetch") |
|
|
|
const RestIntegration = require("../rest") |
|
|
|
const { AuthType } = require("../rest") |
|
|
|
|
|
|
|
const HEADERS = { |
|
|
|
"Accept": "application/json", |
|
|
|
"Content-Type": "application/json" |
|
|
|
} |
|
|
|
|
|
|
|
class TestConfiguration { |
|
|
|
constructor(config = {}) { |
|
|
|
this.integration = new RestIntegration.integration(config) |
|
|
|
@ -35,9 +40,7 @@ describe("REST Integration", () => { |
|
|
|
const query = { |
|
|
|
path: "api", |
|
|
|
queryString: "test=1", |
|
|
|
headers: { |
|
|
|
Accept: "application/json", |
|
|
|
}, |
|
|
|
headers: HEADERS, |
|
|
|
bodyType: "json", |
|
|
|
requestBody: JSON.stringify({ |
|
|
|
name: "test", |
|
|
|
@ -47,9 +50,7 @@ describe("REST Integration", () => { |
|
|
|
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?test=1`, { |
|
|
|
method: "POST", |
|
|
|
body: '{"name":"test"}', |
|
|
|
headers: { |
|
|
|
Accept: "application/json", |
|
|
|
}, |
|
|
|
headers: HEADERS, |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
@ -86,9 +87,7 @@ describe("REST Integration", () => { |
|
|
|
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?test=1`, { |
|
|
|
method: "PUT", |
|
|
|
body: '{"name":"test"}', |
|
|
|
headers: { |
|
|
|
Accept: "application/json", |
|
|
|
}, |
|
|
|
headers: HEADERS, |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
@ -107,13 +106,98 @@ describe("REST Integration", () => { |
|
|
|
const response = await config.integration.delete(query) |
|
|
|
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?test=1`, { |
|
|
|
method: "DELETE", |
|
|
|
headers: { |
|
|
|
Accept: "application/json", |
|
|
|
}, |
|
|
|
headers: HEADERS, |
|
|
|
body: '{"name":"test"}', |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
describe("request body", () => { |
|
|
|
const input = { a: 1, b: 2 } |
|
|
|
|
|
|
|
it("should allow no body", () => { |
|
|
|
const output = config.integration.addBody("none", null, {}) |
|
|
|
expect(output.body).toBeUndefined() |
|
|
|
expect(Object.keys(output.headers).length).toEqual(0) |
|
|
|
}) |
|
|
|
|
|
|
|
it("should allow text body", () => { |
|
|
|
const output = config.integration.addBody("text", "hello world", {}) |
|
|
|
expect(output.body).toEqual("hello world") |
|
|
|
// gets added by fetch
|
|
|
|
expect(Object.keys(output.headers).length).toEqual(0) |
|
|
|
}) |
|
|
|
|
|
|
|
it("should allow form data", () => { |
|
|
|
const FormData = require("form-data") |
|
|
|
const output = config.integration.addBody("form", input, {}) |
|
|
|
expect(output.body instanceof FormData).toEqual(true) |
|
|
|
expect(output.body._valueLength).toEqual(2) |
|
|
|
// gets added by fetch
|
|
|
|
expect(Object.keys(output.headers).length).toEqual(0) |
|
|
|
}) |
|
|
|
|
|
|
|
it("should allow encoded form data", () => { |
|
|
|
const { URLSearchParams } = require("url") |
|
|
|
const output = config.integration.addBody("encoded", input, {}) |
|
|
|
expect(output.body instanceof URLSearchParams).toEqual(true) |
|
|
|
expect(output.body.toString()).toEqual("a=1&b=2") |
|
|
|
// gets added by fetch
|
|
|
|
expect(Object.keys(output.headers).length).toEqual(0) |
|
|
|
}) |
|
|
|
|
|
|
|
it("should allow JSON", () => { |
|
|
|
const output = config.integration.addBody("json", input, {}) |
|
|
|
expect(output.body).toEqual(JSON.stringify(input)) |
|
|
|
expect(output.headers["Content-Type"]).toEqual("application/json") |
|
|
|
}) |
|
|
|
|
|
|
|
it("should allow XML", () => { |
|
|
|
const output = config.integration.addBody("xml", input, {}) |
|
|
|
expect(output.body.includes("<a>1</a>")).toEqual(true) |
|
|
|
expect(output.body.includes("<b>2</b>")).toEqual(true) |
|
|
|
expect(output.headers["Content-Type"]).toEqual("application/xml") |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
describe("response", () => { |
|
|
|
function buildInput(json, text, header) { |
|
|
|
return { |
|
|
|
status: 200, |
|
|
|
json: json ? async () => json : undefined, |
|
|
|
text: text ? async () => text : undefined, |
|
|
|
headers: { get: key => key === "content-length" ? 100 : header, raw: () => ({ "content-type": header }) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
it("should be able to parse JSON response", async () => { |
|
|
|
const input = buildInput({a: 1}, null, "application/json") |
|
|
|
const output = await config.integration.parseResponse(input) |
|
|
|
expect(output.data).toEqual({a: 1}) |
|
|
|
expect(output.info.code).toEqual(200) |
|
|
|
expect(output.info.size).toEqual("100B") |
|
|
|
expect(output.extra.raw).toEqual(JSON.stringify({a: 1})) |
|
|
|
expect(output.extra.headers["content-type"]).toEqual("application/json") |
|
|
|
}) |
|
|
|
|
|
|
|
it("should be able to parse text response", async () => { |
|
|
|
const text = "hello world" |
|
|
|
const input = buildInput(null, text, "text/plain") |
|
|
|
const output = await config.integration.parseResponse(input) |
|
|
|
expect(output.data).toEqual(text) |
|
|
|
expect(output.extra.raw).toEqual(text) |
|
|
|
expect(output.extra.headers["content-type"]).toEqual("text/plain") |
|
|
|
}) |
|
|
|
|
|
|
|
it("should be able to parse XML response", async () => { |
|
|
|
const text = "<root><a>1</a><b>2</b></root>" |
|
|
|
const input = buildInput(null, text, "application/xml") |
|
|
|
const output = await config.integration.parseResponse(input) |
|
|
|
expect(output.data).toEqual({a: "1", b: "2"}) |
|
|
|
expect(output.extra.raw).toEqual(text) |
|
|
|
expect(output.extra.headers["content-type"]).toEqual("application/xml") |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
describe("authentication", () => { |
|
|
|
const basicAuth = { |
|
|
|
_id: "c59c14bd1898a43baa08da68959b24686", |
|
|
|
|