129 lines
3.8 KiB
TypeScript
129 lines
3.8 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
vi.mock("@capakraken/application", () => ({
|
|
buildSplitAllocationReadModel: vi.fn(),
|
|
createAssignment: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("../sse/event-bus.js", () => ({
|
|
emitAllocationCreated: vi.fn(),
|
|
}));
|
|
|
|
import {
|
|
buildSplitAllocationReadModel,
|
|
createAssignment,
|
|
} from "@capakraken/application";
|
|
import { emitAllocationCreated } from "../sse/event-bus.js";
|
|
import {
|
|
createTimelineBatchQuickAssignments,
|
|
createTimelineQuickAssignment,
|
|
} from "../router/timeline-allocation-assignment-procedure-support.js";
|
|
|
|
const buildSplitAllocationReadModelMock = vi.mocked(buildSplitAllocationReadModel);
|
|
const createAssignmentMock = vi.mocked(createAssignment);
|
|
const emitAllocationCreatedMock = vi.mocked(emitAllocationCreated);
|
|
|
|
describe("timeline allocation assignment procedure support", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it("creates a quick assignment and emits the allocation created event", async () => {
|
|
const db = {
|
|
$transaction: vi.fn(async (callback: (tx: unknown) => unknown) => callback(db)),
|
|
} as never;
|
|
|
|
createAssignmentMock.mockResolvedValueOnce({ id: "assignment_1" } as never);
|
|
buildSplitAllocationReadModelMock.mockReturnValueOnce({
|
|
allocations: [
|
|
{
|
|
id: "allocation_1",
|
|
projectId: "project_1",
|
|
resourceId: "resource_1",
|
|
},
|
|
],
|
|
} as never);
|
|
|
|
await expect(
|
|
createTimelineQuickAssignment(db, {
|
|
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,
|
|
role: "Team Member",
|
|
status: "PROPOSED",
|
|
source: "quickAssign",
|
|
}),
|
|
).resolves.toEqual({
|
|
id: "allocation_1",
|
|
projectId: "project_1",
|
|
resourceId: "resource_1",
|
|
});
|
|
|
|
expect(createAssignmentMock).toHaveBeenCalledOnce();
|
|
expect(emitAllocationCreatedMock).toHaveBeenCalledWith({
|
|
id: "allocation_1",
|
|
projectId: "project_1",
|
|
resourceId: "resource_1",
|
|
});
|
|
});
|
|
|
|
it("creates batch quick assignments and emits events for each result", async () => {
|
|
const db = {
|
|
$transaction: vi.fn(async (callback: (tx: unknown) => unknown) => callback(db)),
|
|
} as never;
|
|
|
|
createAssignmentMock
|
|
.mockResolvedValueOnce({
|
|
id: "assignment_1",
|
|
projectId: "project_1",
|
|
resourceId: "resource_1",
|
|
} as never)
|
|
.mockResolvedValueOnce({
|
|
id: "assignment_2",
|
|
projectId: "project_2",
|
|
resourceId: "resource_2",
|
|
} as never);
|
|
|
|
await expect(
|
|
createTimelineBatchQuickAssignments(db, {
|
|
assignments: [
|
|
{
|
|
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,
|
|
role: "Team Member",
|
|
status: "PROPOSED",
|
|
source: "batchQuickAssign",
|
|
},
|
|
{
|
|
resourceId: "resource_2",
|
|
projectId: "project_2",
|
|
startDate: new Date("2026-04-06T00:00:00.000Z"),
|
|
endDate: new Date("2026-04-10T00:00:00.000Z"),
|
|
hoursPerDay: 6,
|
|
role: "Lead",
|
|
status: "PROPOSED",
|
|
source: "batchQuickAssign",
|
|
},
|
|
],
|
|
}),
|
|
).resolves.toEqual({ count: 2 });
|
|
|
|
expect(createAssignmentMock).toHaveBeenCalledTimes(2);
|
|
expect(emitAllocationCreatedMock).toHaveBeenNthCalledWith(1, {
|
|
id: "assignment_1",
|
|
projectId: "project_1",
|
|
resourceId: "resource_1",
|
|
});
|
|
expect(emitAllocationCreatedMock).toHaveBeenNthCalledWith(2, {
|
|
id: "assignment_2",
|
|
projectId: "project_2",
|
|
resourceId: "resource_2",
|
|
});
|
|
});
|
|
});
|