141 lines
5.8 KiB
TypeScript
141 lines
5.8 KiB
TypeScript
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 },
|
|
});
|
|
});
|
|
});
|