initial commit
This commit is contained in:
137
test/skyscannerSampleServer.test.js
Normal file
137
test/skyscannerSampleServer.test.js
Normal file
@@ -0,0 +1,137 @@
|
||||
"use strict";
|
||||
|
||||
const test = require("node:test");
|
||||
const assert = require("node:assert/strict");
|
||||
const { Readable, Writable } = require("node:stream");
|
||||
const {
|
||||
createSkyscannerSampleHandler,
|
||||
buildSampleOffers,
|
||||
} = require("../src/skyscannerSampleServer");
|
||||
|
||||
function createMockRequest({ method = "POST", url = "/skyscanner", body = "" } = {}) {
|
||||
const req = new Readable({
|
||||
read() {
|
||||
this.push(body);
|
||||
this.push(null);
|
||||
},
|
||||
});
|
||||
req.method = method;
|
||||
req.url = url;
|
||||
return req;
|
||||
}
|
||||
|
||||
function createMockResponse() {
|
||||
const chunks = [];
|
||||
let statusCode = 0;
|
||||
let headers = {};
|
||||
let resolveDone;
|
||||
const done = new Promise((resolve) => {
|
||||
resolveDone = resolve;
|
||||
});
|
||||
|
||||
const res = new Writable({
|
||||
write(chunk, _encoding, callback) {
|
||||
chunks.push(Buffer.from(chunk));
|
||||
callback();
|
||||
},
|
||||
});
|
||||
|
||||
res.writeHead = (status, responseHeaders) => {
|
||||
statusCode = status;
|
||||
headers = responseHeaders || {};
|
||||
};
|
||||
|
||||
res.end = (chunk) => {
|
||||
if (chunk) chunks.push(Buffer.from(chunk));
|
||||
resolveDone();
|
||||
};
|
||||
|
||||
return {
|
||||
res,
|
||||
done,
|
||||
getStatusCode() {
|
||||
return statusCode;
|
||||
},
|
||||
getHeaders() {
|
||||
return headers;
|
||||
},
|
||||
getJsonBody() {
|
||||
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
test("buildSampleOffers is deterministic for the same search params", () => {
|
||||
const searchParams = {
|
||||
segments: [{ from: "ICN", to: "MAD" }],
|
||||
passengers: { total: 2 },
|
||||
};
|
||||
|
||||
const first = buildSampleOffers(searchParams);
|
||||
const second = buildSampleOffers(searchParams);
|
||||
|
||||
assert.deepEqual(first, second);
|
||||
assert.equal(first[0].provider, "skyscanner");
|
||||
assert.equal(first[0].currency, "KRW");
|
||||
});
|
||||
|
||||
test("sample handler returns skyscanner offers on POST /skyscanner", async () => {
|
||||
const handler = createSkyscannerSampleHandler();
|
||||
const req = createMockRequest({
|
||||
body: JSON.stringify({
|
||||
watchId: "watch-1",
|
||||
searchParams: {
|
||||
segments: [{ from: "ICN", to: "MAD" }],
|
||||
},
|
||||
}),
|
||||
});
|
||||
const response = createMockResponse();
|
||||
|
||||
await handler(req, response.res);
|
||||
await response.done;
|
||||
|
||||
assert.equal(response.getStatusCode(), 200);
|
||||
assert.equal(response.getHeaders()["content-type"], "application/json; charset=utf-8");
|
||||
const payload = response.getJsonBody();
|
||||
assert.equal(payload.currency, "KRW");
|
||||
assert.ok(Array.isArray(payload.offers));
|
||||
assert.equal(payload.offers.length, 3);
|
||||
assert.equal(payload.offers[0].provider, "skyscanner");
|
||||
});
|
||||
|
||||
test("sample handler accepts wrapped request payload shape", async () => {
|
||||
const handler = createSkyscannerSampleHandler();
|
||||
const req = createMockRequest({
|
||||
body: JSON.stringify({
|
||||
request: {
|
||||
watchId: "watch-2",
|
||||
searchParams: {
|
||||
segments: [{ from: "ICN", to: "BCN" }],
|
||||
},
|
||||
},
|
||||
}),
|
||||
});
|
||||
const response = createMockResponse();
|
||||
|
||||
await handler(req, response.res);
|
||||
await response.done;
|
||||
|
||||
assert.equal(response.getStatusCode(), 200);
|
||||
const payload = response.getJsonBody();
|
||||
assert.equal(payload.offers[0].provider, "skyscanner");
|
||||
});
|
||||
|
||||
test("sample handler returns 404 for unsupported route", async () => {
|
||||
const handler = createSkyscannerSampleHandler();
|
||||
const req = createMockRequest({
|
||||
url: "/not-skyscanner",
|
||||
body: JSON.stringify({}),
|
||||
});
|
||||
const response = createMockResponse();
|
||||
|
||||
await handler(req, response.res);
|
||||
await response.done;
|
||||
|
||||
assert.equal(response.getStatusCode(), 404);
|
||||
assert.match(response.getJsonBody().expected, /POST \/skyscanner/);
|
||||
});
|
||||
Reference in New Issue
Block a user