121 lines
3.3 KiB
TypeScript
121 lines
3.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
buildTimelineBudgetStatusAllocations,
|
|
buildTimelineBudgetStatusResponse,
|
|
buildTimelineShiftPreviewDetailResponse,
|
|
buildTimelineShiftValidationBookings,
|
|
} from "../router/timeline-project-read-support.js";
|
|
|
|
describe("timeline project read support", () => {
|
|
it("builds shift preview detail payloads with formatted dates", () => {
|
|
expect(buildTimelineShiftPreviewDetailResponse({
|
|
project: {
|
|
id: "project_1",
|
|
name: "Project One",
|
|
shortCode: "PRJ",
|
|
status: "ACTIVE",
|
|
responsiblePerson: "Alice",
|
|
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-10T00:00:00.000Z"),
|
|
},
|
|
requestedShift: {
|
|
newStartDate: new Date("2026-04-03T00:00:00.000Z"),
|
|
newEndDate: new Date("2026-04-12T00:00:00.000Z"),
|
|
},
|
|
preview: { valid: true },
|
|
})).toEqual({
|
|
project: {
|
|
id: "project_1",
|
|
name: "Project One",
|
|
shortCode: "PRJ",
|
|
status: "ACTIVE",
|
|
responsiblePerson: "Alice",
|
|
startDate: "2026-04-01",
|
|
endDate: "2026-04-10",
|
|
},
|
|
requestedShift: {
|
|
newStartDate: "2026-04-03",
|
|
newEndDate: "2026-04-12",
|
|
},
|
|
preview: { valid: true },
|
|
});
|
|
});
|
|
|
|
it("maps shift validation bookings and budget status payloads", () => {
|
|
expect(
|
|
buildTimelineShiftValidationBookings([
|
|
{
|
|
id: "booking_1",
|
|
resourceId: "resource_1",
|
|
projectId: "project_1",
|
|
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-05T00:00:00.000Z"),
|
|
hoursPerDay: 8,
|
|
status: "CONFIRMED",
|
|
},
|
|
{
|
|
id: "booking_2",
|
|
resourceId: null,
|
|
projectId: "project_1",
|
|
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-05T00:00:00.000Z"),
|
|
hoursPerDay: 4,
|
|
status: "PROPOSED",
|
|
},
|
|
]),
|
|
).toEqual([
|
|
{
|
|
id: "booking_1",
|
|
resourceId: "resource_1",
|
|
projectId: "project_1",
|
|
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-05T00:00:00.000Z"),
|
|
hoursPerDay: 8,
|
|
status: "CONFIRMED",
|
|
},
|
|
]);
|
|
|
|
expect(
|
|
buildTimelineBudgetStatusAllocations([
|
|
{
|
|
status: "CONFIRMED",
|
|
dailyCostCents: 40000,
|
|
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-05T00:00:00.000Z"),
|
|
hoursPerDay: 8,
|
|
},
|
|
]),
|
|
).toEqual([
|
|
{
|
|
status: "CONFIRMED",
|
|
dailyCostCents: 40000,
|
|
startDate: new Date("2026-04-01T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-05T00:00:00.000Z"),
|
|
hoursPerDay: 8,
|
|
},
|
|
]);
|
|
|
|
expect(
|
|
buildTimelineBudgetStatusResponse({
|
|
project: {
|
|
name: "Project One",
|
|
shortCode: "PRJ",
|
|
budgetCents: 120000,
|
|
},
|
|
budgetStatus: {
|
|
withinBudget: true,
|
|
varianceCents: 2000,
|
|
},
|
|
totalAllocations: 3,
|
|
}),
|
|
).toEqual({
|
|
withinBudget: true,
|
|
varianceCents: 2000,
|
|
projectName: "Project One",
|
|
projectCode: "PRJ",
|
|
totalAllocations: 3,
|
|
budgetCents: 120000,
|
|
});
|
|
});
|
|
});
|