Files
CapaKraken/packages/api/src/__tests__/project-planning-read-model.test.ts
T
Hartmut cd78f72f33 chore: full technical rename planarchy → capakraken
Complete rename of all technical identifiers across the codebase:

Package names (11 packages):
- @planarchy/* → @capakraken/* in all package.json, tsconfig, imports

Import statements: 277 files, 548 occurrences replaced

Database & Docker:
- PostgreSQL user/db: planarchy → capakraken
- Docker volumes: planarchy_pgdata → capakraken_pgdata
- Connection strings updated in docker-compose, .env, CI

CI/CD:
- GitHub Actions workflow: all filter commands updated
- Test database credentials updated

Infrastructure:
- Redis channel: planarchy:sse → capakraken:sse
- Logger service name: planarchy-api → capakraken-api
- Anonymization seed updated
- Start/stop/restart scripts updated

Test data:
- Seed emails: @planarchy.dev → @capakraken.dev
- E2E test credentials: all 11 spec files updated
- Email defaults: @planarchy.app → @capakraken.app
- localStorage keys: planarchy_* → capakraken_*

Documentation: 30+ .md files updated

Verification:
- pnpm install: workspace resolution works
- TypeScript: only pre-existing TS2589 (no new errors)
- Engine: 310/310 tests pass
- Staffing: 37/37 tests pass

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-27 13:18:09 +01:00

94 lines
3.1 KiB
TypeScript

import { AllocationStatus } from "@capakraken/shared";
import { describe, expect, it, vi } from "vitest";
import { loadProjectPlanningReadModel } from "../router/project-planning-read-model.js";
describe("loadProjectPlanningReadModel", () => {
it("applies active-only filters to demand and assignment loaders", async () => {
const demandFindMany = vi.fn().mockResolvedValue([]);
const assignmentFindMany = vi.fn().mockResolvedValue([]);
await loadProjectPlanningReadModel(
{
demandRequirement: { findMany: demandFindMany },
assignment: { findMany: assignmentFindMany },
} as never,
{ projectId: "project_1", activeOnly: true },
);
expect(demandFindMany).toHaveBeenCalledWith(
expect.objectContaining({
where: { projectId: "project_1", status: { not: AllocationStatus.CANCELLED } },
}),
);
expect(assignmentFindMany).toHaveBeenCalledWith(
expect.objectContaining({
where: { projectId: "project_1", status: { not: AllocationStatus.CANCELLED } },
}),
);
});
it("builds a split read model from demand and assignment rows", async () => {
const result = await loadProjectPlanningReadModel(
{
demandRequirement: {
findMany: vi.fn().mockResolvedValue([
{
id: "demand_1",
projectId: "project_1",
startDate: new Date("2026-03-17"),
endDate: new Date("2026-03-18"),
hoursPerDay: 8,
percentage: 100,
role: "FX",
roleId: "role_fx",
headcount: 2,
status: AllocationStatus.PROPOSED,
metadata: {},
createdAt: new Date("2026-03-13"),
updatedAt: new Date("2026-03-13"),
},
]),
},
assignment: {
findMany: vi.fn().mockResolvedValue([
{
id: "assignment_1",
resourceId: "resource_1",
projectId: "project_1",
startDate: new Date("2026-03-17"),
endDate: new Date("2026-03-18"),
hoursPerDay: 8,
percentage: 100,
role: "Lead",
roleId: "role_lead",
dailyCostCents: 32000,
status: AllocationStatus.ACTIVE,
metadata: {},
createdAt: new Date("2026-03-13"),
updatedAt: new Date("2026-03-13"),
resource: {
id: "resource_1",
displayName: "Alice",
eid: "E-001",
chapter: "CGI",
lcrCents: 5000,
availability: { monday: 8 },
},
},
]),
},
} as never,
{ projectId: "project_1" },
);
expect(result.readModel.demands.map((entry) => entry.sourceAllocationId)).toEqual(["demand_1"]);
expect(result.readModel.assignments.map((entry) => entry.sourceAllocationId)).toEqual([
"assignment_1",
]);
expect(result.readModel.allocations.map((entry) => entry.id)).toEqual([
"demand_1",
"assignment_1",
]);
});
});