import { beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("../lib/anonymization.js", () => ({ getAnonymizationDirectory: vi.fn(), })); vi.mock("../router/timeline-project-load-support.js", () => ({ loadTimelineProjectContext: vi.fn(), })); vi.mock("../router/timeline-project-context-support.js", () => ({ loadTimelineProjectContextDetailArtifacts: vi.fn(), })); vi.mock("../router/timeline-project-context-response-support.js", () => ({ buildTimelineProjectContextResponse: vi.fn(), buildTimelineProjectContextDetailResponse: vi.fn(), })); import { getAnonymizationDirectory } from "../lib/anonymization.js"; import { loadTimelineProjectContextDetailArtifacts, } from "../router/timeline-project-context-support.js"; import { buildTimelineProjectContextDetailResponse, buildTimelineProjectContextResponse, } from "../router/timeline-project-context-response-support.js"; import { loadTimelineProjectContext } from "../router/timeline-project-load-support.js"; import { readTimelineProjectContextDetailResponse, readTimelineProjectContextResponse, } from "../router/timeline-project-context-procedure-support.js"; const getAnonymizationDirectoryMock = vi.mocked(getAnonymizationDirectory); const loadTimelineProjectContextMock = vi.mocked(loadTimelineProjectContext); const loadTimelineProjectContextDetailArtifactsMock = vi.mocked(loadTimelineProjectContextDetailArtifacts); const buildTimelineProjectContextResponseMock = vi.mocked(buildTimelineProjectContextResponse); const buildTimelineProjectContextDetailResponseMock = vi.mocked(buildTimelineProjectContextDetailResponse); describe("timeline project context procedure support", () => { beforeEach(() => { vi.clearAllMocks(); }); it("builds project context responses from loaded context and anonymization directory", async () => { loadTimelineProjectContextMock.mockResolvedValueOnce({ project: { id: "project_1" }, allocations: [{ id: "allocation_1" }], demands: [{ id: "demand_1" }], assignments: [{ id: "assignment_1" }], allResourceAllocations: [{ id: "booking_1" }], resourceIds: ["resource_1"], } as never); getAnonymizationDirectoryMock.mockResolvedValueOnce({ enabled: true } as never); buildTimelineProjectContextResponseMock.mockReturnValueOnce({ ok: true } as never); await expect(readTimelineProjectContextResponse({} as never, "project_1")).resolves.toEqual({ ok: true, }); expect(loadTimelineProjectContextMock).toHaveBeenCalledWith({}, "project_1"); expect(getAnonymizationDirectoryMock).toHaveBeenCalledWith({}); expect(buildTimelineProjectContextResponseMock).toHaveBeenCalledWith({ project: { id: "project_1" }, allocations: [{ id: "allocation_1" }], demands: [{ id: "demand_1" }], assignments: [{ id: "assignment_1" }], allResourceAllocations: [{ id: "booking_1" }], resourceIds: ["resource_1"], directory: { enabled: true }, }); }); it("builds project context detail responses from loaded artifacts", async () => { loadTimelineProjectContextMock.mockResolvedValueOnce({ project: { id: "project_1", startDate: new Date("2026-04-01T00:00:00.000Z"), endDate: new Date("2026-04-10T00:00:00.000Z"), }, allocations: [{ id: "allocation_1" }], demands: [{ id: "demand_1", startDate: new Date("2026-04-01T00:00:00.000Z") }], assignments: [{ id: "assignment_1", startDate: new Date("2026-04-02T00:00:00.000Z") }], allResourceAllocations: [{ id: "booking_1" }], resourceIds: ["resource_1"], } as never); getAnonymizationDirectoryMock.mockResolvedValueOnce({ enabled: true } as never); loadTimelineProjectContextDetailArtifactsMock.mockResolvedValueOnce({ period: { startDate: new Date("2026-04-01T00:00:00.000Z"), endDate: new Date("2026-04-10T00:00:00.000Z"), }, holidayOverlays: [{ id: "overlay_1" }], assignmentConflicts: [{ assignmentId: "assignment_1" }], } as never); buildTimelineProjectContextDetailResponseMock.mockReturnValueOnce({ detail: true } as never); await expect( readTimelineProjectContextDetailResponse({} as never, { projectId: "project_1", startDate: "2026-04-03", endDate: "2026-04-12", durationDays: 10, }), ).resolves.toEqual({ detail: true }); expect(loadTimelineProjectContextDetailArtifactsMock).toHaveBeenCalledWith({}, { projectId: "project_1", requestedStartDate: "2026-04-03", requestedEndDate: "2026-04-12", durationDays: 10, projectStartDate: new Date("2026-04-01T00:00:00.000Z"), projectEndDate: new Date("2026-04-10T00:00:00.000Z"), firstAssignmentStartDate: new Date("2026-04-02T00:00:00.000Z"), firstDemandStartDate: new Date("2026-04-01T00:00:00.000Z"), assignments: [{ id: "assignment_1", startDate: new Date("2026-04-02T00:00:00.000Z") }], allResourceAllocations: [{ id: "booking_1" }], resourceIds: ["resource_1"], }); expect(buildTimelineProjectContextDetailResponseMock).toHaveBeenCalledWith({ project: { id: "project_1", startDate: new Date("2026-04-01T00:00:00.000Z"), endDate: new Date("2026-04-10T00:00:00.000Z"), }, period: { startDate: new Date("2026-04-01T00:00:00.000Z"), endDate: new Date("2026-04-10T00:00:00.000Z"), }, allocations: [{ id: "allocation_1" }], demands: [{ id: "demand_1", startDate: new Date("2026-04-01T00:00:00.000Z") }], assignments: [{ id: "assignment_1", startDate: new Date("2026-04-02T00:00:00.000Z") }], allResourceAllocations: [{ id: "booking_1" }], resourceIds: ["resource_1"], assignmentConflicts: [{ assignmentId: "assignment_1" }], holidayOverlays: [{ id: "overlay_1" }], directory: { enabled: true }, }); }); });