chore(repo): initialize planarchy workspace
This commit is contained in:
@@ -0,0 +1,178 @@
|
||||
import { AllocationStatus } from "@planarchy/shared";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { updateAllocationEntry } from "../index.js";
|
||||
|
||||
describe("allocation entry resolution helpers", () => {
|
||||
it("updates an explicit demand requirement", async () => {
|
||||
const existingDemand = {
|
||||
id: "demand_1",
|
||||
projectId: "project_1",
|
||||
startDate: new Date("2026-03-16"),
|
||||
endDate: new Date("2026-03-20"),
|
||||
hoursPerDay: 4,
|
||||
percentage: 50,
|
||||
role: "FX Artist",
|
||||
roleId: "role_fx",
|
||||
headcount: 1,
|
||||
status: AllocationStatus.PROPOSED,
|
||||
metadata: {},
|
||||
createdAt: new Date("2026-03-13"),
|
||||
updatedAt: new Date("2026-03-13"),
|
||||
project: { id: "project_1", name: "Project One", shortCode: "PRJ" },
|
||||
roleEntity: { id: "role_fx", name: "FX Artist", color: "#222222" },
|
||||
};
|
||||
const updatedDemand = {
|
||||
...existingDemand,
|
||||
headcount: 2,
|
||||
status: AllocationStatus.CONFIRMED,
|
||||
metadata: { source: "entry-test" },
|
||||
updatedAt: new Date("2026-03-14"),
|
||||
};
|
||||
|
||||
const demandRequirementFindUnique = vi.fn().mockResolvedValue(existingDemand);
|
||||
const demandRequirementUpdate = vi.fn().mockResolvedValue(updatedDemand);
|
||||
const assignmentFindUnique = vi.fn().mockResolvedValue(null);
|
||||
const assignmentUpdate = vi.fn();
|
||||
const auditLogCreate = vi.fn().mockResolvedValue({});
|
||||
|
||||
const result = await updateAllocationEntry(
|
||||
{
|
||||
demandRequirement: {
|
||||
findUnique: demandRequirementFindUnique,
|
||||
update: demandRequirementUpdate,
|
||||
},
|
||||
assignment: {
|
||||
findUnique: assignmentFindUnique,
|
||||
update: assignmentUpdate,
|
||||
},
|
||||
auditLog: { create: auditLogCreate },
|
||||
} as never,
|
||||
{
|
||||
id: "demand_1",
|
||||
demandRequirementUpdate: {
|
||||
headcount: 2,
|
||||
status: AllocationStatus.CONFIRMED,
|
||||
metadata: { source: "entry-test" },
|
||||
},
|
||||
assignmentUpdate: {},
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.strategy).toBe("explicit_demand");
|
||||
expect(result.allocation.id).toBe("demand_1");
|
||||
expect(result.allocation.isPlaceholder).toBe(true);
|
||||
expect(result.allocation.headcount).toBe(2);
|
||||
expect(demandRequirementUpdate).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
where: { id: "demand_1" },
|
||||
data: expect.objectContaining({
|
||||
headcount: 2,
|
||||
status: AllocationStatus.CONFIRMED,
|
||||
}),
|
||||
}),
|
||||
);
|
||||
expect(assignmentUpdate).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("updates an explicit assignment", async () => {
|
||||
const existingAssignment = {
|
||||
id: "assignment_1",
|
||||
demandRequirementId: null,
|
||||
resourceId: "resource_1",
|
||||
projectId: "project_1",
|
||||
startDate: new Date("2026-03-16"),
|
||||
endDate: new Date("2026-03-20"),
|
||||
hoursPerDay: 4,
|
||||
percentage: 50,
|
||||
role: "Compositor",
|
||||
roleId: "role_comp",
|
||||
dailyCostCents: 20000,
|
||||
status: AllocationStatus.PROPOSED,
|
||||
metadata: {},
|
||||
createdAt: new Date("2026-03-13"),
|
||||
updatedAt: new Date("2026-03-13"),
|
||||
resource: {
|
||||
id: "resource_1",
|
||||
displayName: "Alice",
|
||||
eid: "E-001",
|
||||
lcrCents: 5000,
|
||||
},
|
||||
project: { id: "project_1", name: "Project One", shortCode: "PRJ" },
|
||||
roleEntity: { id: "role_comp", name: "Compositor", color: "#111111" },
|
||||
demandRequirement: null,
|
||||
};
|
||||
const updatedAssignment = {
|
||||
...existingAssignment,
|
||||
hoursPerDay: 6,
|
||||
percentage: 75,
|
||||
dailyCostCents: 30000,
|
||||
status: AllocationStatus.ACTIVE,
|
||||
updatedAt: new Date("2026-03-14"),
|
||||
};
|
||||
|
||||
const demandRequirementFindUnique = vi.fn().mockResolvedValue(null);
|
||||
const assignmentFindUnique = vi.fn().mockResolvedValue(existingAssignment);
|
||||
const assignmentUpdate = vi.fn().mockResolvedValue(updatedAssignment);
|
||||
const auditLogCreate = vi.fn().mockResolvedValue({});
|
||||
|
||||
const result = await updateAllocationEntry(
|
||||
{
|
||||
demandRequirement: {
|
||||
findUnique: demandRequirementFindUnique,
|
||||
},
|
||||
assignment: {
|
||||
findUnique: assignmentFindUnique,
|
||||
update: assignmentUpdate,
|
||||
},
|
||||
auditLog: { create: auditLogCreate },
|
||||
} as never,
|
||||
{
|
||||
id: "assignment_1",
|
||||
demandRequirementUpdate: {},
|
||||
assignmentUpdate: {
|
||||
hoursPerDay: 6,
|
||||
percentage: 75,
|
||||
dailyCostCents: 30000,
|
||||
status: AllocationStatus.ACTIVE,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.strategy).toBe("explicit_assignment");
|
||||
expect(result.allocation.id).toBe("assignment_1");
|
||||
expect(assignmentUpdate).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
where: { id: "assignment_1" },
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
it("throws NOT_FOUND when the id does not match any demand or assignment", async () => {
|
||||
const demandRequirementFindUnique = vi.fn().mockResolvedValue(null);
|
||||
const assignmentFindUnique = vi.fn().mockResolvedValue(null);
|
||||
|
||||
await expect(
|
||||
updateAllocationEntry(
|
||||
{
|
||||
demandRequirement: {
|
||||
findUnique: demandRequirementFindUnique,
|
||||
},
|
||||
assignment: {
|
||||
findUnique: assignmentFindUnique,
|
||||
},
|
||||
} as never,
|
||||
{
|
||||
id: "nonexistent_id",
|
||||
demandRequirementUpdate: {
|
||||
status: AllocationStatus.CONFIRMED,
|
||||
},
|
||||
assignmentUpdate: {},
|
||||
},
|
||||
),
|
||||
).rejects.toMatchObject({
|
||||
code: "NOT_FOUND",
|
||||
message: "Allocation not found",
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user