refactor(api): extract timeline holiday support
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
buildTimelineHolidayOverlayDetailResponse,
|
||||
buildTimelineHolidayResourceIds,
|
||||
buildTimelineHolidayResourceWhere,
|
||||
formatTimelineHolidayOverlays,
|
||||
summarizeTimelineHolidayOverlays,
|
||||
} from "../router/timeline-holiday-support.js";
|
||||
|
||||
describe("timeline holiday support", () => {
|
||||
it("builds resource filters only when holiday resource constraints are present", () => {
|
||||
expect(buildTimelineHolidayResourceWhere({})).toBeNull();
|
||||
expect(buildTimelineHolidayResourceWhere({ chapters: ["3D"] })).toEqual({
|
||||
chapter: { in: ["3D"] },
|
||||
});
|
||||
expect(
|
||||
buildTimelineHolidayResourceWhere({
|
||||
chapters: ["3D"],
|
||||
eids: ["E-001"],
|
||||
countryCodes: ["DE"],
|
||||
}),
|
||||
).toEqual({
|
||||
AND: [
|
||||
{ chapter: { in: ["3D"] } },
|
||||
{ eid: { in: ["E-001"] } },
|
||||
{ country: { code: { in: ["DE"] } } },
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("merges assignment, requested, and matched resource ids without duplicates", () => {
|
||||
expect(
|
||||
buildTimelineHolidayResourceIds({
|
||||
assignmentResourceIds: ["resource_1", null, "resource_2"],
|
||||
requestedResourceIds: ["resource_2", "resource_3"],
|
||||
matchingFilterResourceIds: ["resource_3", "resource_4"],
|
||||
}),
|
||||
).toEqual(["resource_1", "resource_2", "resource_3", "resource_4"]);
|
||||
});
|
||||
|
||||
it("formats overlays and summarizes them by scope", () => {
|
||||
const overlays = formatTimelineHolidayOverlays([
|
||||
{
|
||||
id: "overlay_1",
|
||||
resourceId: "resource_1",
|
||||
startDate: new Date("2026-04-03T00:00:00.000Z"),
|
||||
endDate: new Date("2026-04-03T00:00:00.000Z"),
|
||||
scope: "COUNTRY",
|
||||
note: "Holiday",
|
||||
},
|
||||
{
|
||||
id: "overlay_2",
|
||||
resourceId: "resource_2",
|
||||
startDate: new Date("2026-04-04T00:00:00.000Z"),
|
||||
endDate: new Date("2026-04-04T00:00:00.000Z"),
|
||||
scope: "CITY",
|
||||
note: "Holiday",
|
||||
},
|
||||
{
|
||||
id: "overlay_3",
|
||||
resourceId: "resource_1",
|
||||
startDate: new Date("2026-04-05T00:00:00.000Z"),
|
||||
endDate: new Date("2026-04-05T00:00:00.000Z"),
|
||||
note: "Holiday",
|
||||
},
|
||||
]);
|
||||
|
||||
expect(overlays).toEqual([
|
||||
expect.objectContaining({ startDate: "2026-04-03", endDate: "2026-04-03", scope: "COUNTRY" }),
|
||||
expect.objectContaining({ startDate: "2026-04-04", endDate: "2026-04-04", scope: "CITY" }),
|
||||
expect.objectContaining({ startDate: "2026-04-05", endDate: "2026-04-05", scope: null }),
|
||||
]);
|
||||
expect(summarizeTimelineHolidayOverlays(overlays)).toEqual({
|
||||
overlayCount: 3,
|
||||
holidayResourceCount: 2,
|
||||
byScope: [
|
||||
{ scope: "CITY", count: 1 },
|
||||
{ scope: "COUNTRY", count: 1 },
|
||||
{ scope: "UNKNOWN", count: 1 },
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("builds holiday detail responses from formatted overlays", () => {
|
||||
const overlays = formatTimelineHolidayOverlays([
|
||||
{
|
||||
id: "overlay_1",
|
||||
resourceId: "resource_1",
|
||||
startDate: new Date("2026-04-03T00:00:00.000Z"),
|
||||
endDate: new Date("2026-04-03T00:00:00.000Z"),
|
||||
scope: "COUNTRY",
|
||||
note: "Holiday",
|
||||
},
|
||||
]);
|
||||
|
||||
expect(
|
||||
buildTimelineHolidayOverlayDetailResponse({
|
||||
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
||||
endDate: new Date("2026-04-07T00:00:00.000Z"),
|
||||
filters: { countryCodes: ["DE"] },
|
||||
overlays,
|
||||
}),
|
||||
).toEqual({
|
||||
period: {
|
||||
startDate: "2026-04-01",
|
||||
endDate: "2026-04-07",
|
||||
},
|
||||
filters: { countryCodes: ["DE"] },
|
||||
summary: {
|
||||
overlayCount: 1,
|
||||
holidayResourceCount: 1,
|
||||
byScope: [{ scope: "COUNTRY", count: 1 }],
|
||||
},
|
||||
overlays,
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user