refactor(api): extract timeline entry response support

This commit is contained in:
2026-03-31 17:30:04 +02:00
parent 7d3792e9dc
commit acb4ec5243
6 changed files with 273 additions and 249 deletions
@@ -0,0 +1,153 @@
import { describe, expect, it } from "vitest";
import {
buildTimelineEntriesDetailResponse,
buildTimelineEntriesViewResponse,
} from "../router/timeline-entry-response-support.js";
describe("timeline entry response support", () => {
const directory = {
config: { enabled: true, mode: "alias", domain: "example.test" },
byResourceId: new Map([
[
"resource_1",
{
displayName: "Anon Alice",
eid: "ANON-001",
email: "anon-alice@example.test",
},
],
]),
byAliasEid: new Map([["anon-001", "resource_1"]]),
};
it("builds anonymized entries view responses", () => {
const readModel = {
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
};
expect(buildTimelineEntriesViewResponse(readModel, directory as never)).toEqual({
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
});
});
it("builds detail responses with combined summary and anonymized entries", () => {
const readModel = {
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
};
const overlays = [{ id: "overlay_1", resourceId: "resource_1" }];
expect(
buildTimelineEntriesDetailResponse({
period: {
startDate: new Date("2026-04-01T00:00:00.000Z"),
endDate: new Date("2026-04-05T00:00:00.000Z"),
},
filters: {
resourceIds: ["resource_1"],
projectIds: undefined,
clientIds: undefined,
chapters: undefined,
eids: undefined,
countryCodes: undefined,
},
readModel,
directory: directory as never,
holidayOverlays: overlays,
holidaySummary: {
overlayCount: 1,
holidayResourceCount: 1,
byScope: [{ scope: "COUNTRY", count: 1 }],
},
}),
).toEqual({
period: {
startDate: "2026-04-01",
endDate: "2026-04-05",
},
filters: {
resourceIds: ["resource_1"],
projectIds: undefined,
clientIds: undefined,
chapters: undefined,
eids: undefined,
countryCodes: undefined,
},
summary: {
allocationCount: 1,
demandCount: 1,
assignmentCount: 1,
projectCount: 1,
resourceCount: 1,
overlayCount: 1,
holidayResourceCount: 1,
byScope: [{ scope: "COUNTRY", count: 1 }],
},
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
holidayOverlays: overlays,
});
});
});