99 lines
3.2 KiB
TypeScript
99 lines
3.2 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
DFW_BLQ_2026_PROMPT_DRAFT,
|
|
normalizeFlightReportRequest
|
|
} from "../src/request-normalizer.js";
|
|
|
|
test("normalizeFlightReportRequest preserves the legacy DFW-BLQ split-return structure", () => {
|
|
const result = normalizeFlightReportRequest(DFW_BLQ_2026_PROMPT_DRAFT);
|
|
|
|
assert.equal(result.readyToSearch, true);
|
|
assert.deepEqual(result.missingSearchInputs, []);
|
|
assert.deepEqual(result.missingDeliveryInputs, []);
|
|
assert.equal(result.request.preferences.marketCountry, "TH");
|
|
assert.equal(result.request.preferences.normalizeCurrencyTo, "USD");
|
|
assert.equal(result.request.legs.length, 3);
|
|
assert.equal(result.request.passengerGroups.length, 2);
|
|
assert.deepEqual(
|
|
result.request.legAssignments.find((entry) => entry.legId === "outbound")?.passengerGroupIds,
|
|
["pair", "solo"]
|
|
);
|
|
assert.equal(
|
|
result.request.preferences.requireAirlineDirectCrossCheck,
|
|
true
|
|
);
|
|
});
|
|
|
|
test("normalizeFlightReportRequest keeps email missing as a delivery gate, not a search blocker", () => {
|
|
const result = normalizeFlightReportRequest({
|
|
...DFW_BLQ_2026_PROMPT_DRAFT,
|
|
recipientEmail: null
|
|
});
|
|
|
|
assert.equal(result.readyToSearch, true);
|
|
assert.deepEqual(result.missingSearchInputs, []);
|
|
assert.deepEqual(result.missingDeliveryInputs, ["recipient email"]);
|
|
assert.match(result.warnings.join(" "), /recipient email/i);
|
|
});
|
|
|
|
test("normalizeFlightReportRequest reports missing search-critical inputs explicitly", () => {
|
|
const result = normalizeFlightReportRequest({
|
|
tripName: "Incomplete flight request",
|
|
legs: [
|
|
{
|
|
id: "outbound",
|
|
origin: "DFW",
|
|
destination: "",
|
|
label: "Outbound"
|
|
}
|
|
],
|
|
passengerGroups: [],
|
|
legAssignments: []
|
|
});
|
|
|
|
assert.equal(result.readyToSearch, false);
|
|
assert.match(result.missingSearchInputs.join(" | "), /origin and destination/i);
|
|
assert.match(result.missingSearchInputs.join(" | "), /date window/i);
|
|
assert.match(result.missingSearchInputs.join(" | "), /passenger groups/i);
|
|
assert.match(result.missingSearchInputs.join(" | "), /assignments/i);
|
|
});
|
|
|
|
test("normalizeFlightReportRequest validates marketCountry as an ISO alpha-2 code", () => {
|
|
assert.throws(
|
|
() =>
|
|
normalizeFlightReportRequest({
|
|
...DFW_BLQ_2026_PROMPT_DRAFT,
|
|
preferences: {
|
|
...DFW_BLQ_2026_PROMPT_DRAFT.preferences,
|
|
marketCountry: "Germany"
|
|
}
|
|
}),
|
|
/ISO 3166-1 alpha-2/i
|
|
);
|
|
});
|
|
|
|
test("normalizeFlightReportRequest uppercases a lowercase marketCountry code", () => {
|
|
const result = normalizeFlightReportRequest({
|
|
...DFW_BLQ_2026_PROMPT_DRAFT,
|
|
preferences: {
|
|
...DFW_BLQ_2026_PROMPT_DRAFT.preferences,
|
|
marketCountry: "th"
|
|
}
|
|
});
|
|
|
|
assert.equal(result.request.preferences.marketCountry, "TH");
|
|
});
|
|
|
|
test("normalizeFlightReportRequest flags a malformed recipient email without blocking search readiness", () => {
|
|
const result = normalizeFlightReportRequest({
|
|
...DFW_BLQ_2026_PROMPT_DRAFT,
|
|
recipientEmail: "stefano-at-example"
|
|
});
|
|
|
|
assert.equal(result.readyToSearch, true);
|
|
assert.deepEqual(result.missingDeliveryInputs, ["valid recipient email"]);
|
|
assert.match(result.warnings.join(" "), /malformed/i);
|
|
});
|