Files
CapaKraken/packages/api/src/__tests__/assistant-tools-resource-detail.test.ts
T

127 lines
3.8 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import { SystemRole } from "@capakraken/shared";
import { createToolContext, executeTool } from "./assistant-tools-resource-test-helpers.js";
describe("assistant resource detail tool", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("routes resource detail reads through the resource router path", async () => {
const db = {
resource: {
findUnique: vi.fn()
.mockResolvedValueOnce(null)
.mockResolvedValueOnce({
id: "res_1",
eid: "EMP-001",
displayName: "Bruce Banner",
chapter: "Delivery",
isActive: true,
})
.mockResolvedValueOnce({
id: "res_1",
eid: "EMP-001",
displayName: "Bruce Banner",
email: "bruce@example.com",
chapter: "Delivery",
fte: 1,
lcrCents: 8_500,
ucrCents: 10_500,
chargeabilityTarget: 80,
isActive: true,
availability: { monday: 8 },
skills: [{ name: "Houdini", level: 5 }],
postalCode: "80331",
federalState: "BY",
areaRole: { name: "Pipeline TD", color: "#112233" },
country: { code: "DE", name: "Germany", dailyWorkingHours: 8 },
metroCity: { name: "Munich" },
managementLevelGroup: { name: "Senior", targetPercentage: 75 },
orgUnit: { name: "Operations", level: 5 },
_count: { assignments: 4, vacations: 2 },
}),
findFirst: vi.fn(),
},
};
const ctx = createToolContext(db, { userRole: SystemRole.CONTROLLER });
const detailResult = await executeTool(
"get_resource",
JSON.stringify({ identifier: "EMP-001" }),
ctx,
);
expect(db.resource.findUnique).toHaveBeenNthCalledWith(1, {
where: { id: "EMP-001" },
select: {
id: true,
eid: true,
displayName: true,
chapter: true,
isActive: true,
},
});
expect(db.resource.findUnique).toHaveBeenNthCalledWith(2, {
where: { eid: "EMP-001" },
select: {
id: true,
eid: true,
displayName: true,
chapter: true,
isActive: true,
},
});
expect(db.resource.findUnique).toHaveBeenNthCalledWith(3, {
where: { id: "res_1" },
select: {
id: true,
eid: true,
displayName: true,
email: true,
chapter: true,
fte: true,
lcrCents: true,
ucrCents: true,
chargeabilityTarget: true,
isActive: true,
availability: true,
skills: true,
postalCode: true,
federalState: true,
areaRole: { select: { name: true, color: true } },
country: { select: { code: true, name: true, dailyWorkingHours: true } },
metroCity: { select: { name: true } },
managementLevelGroup: { select: { name: true, targetPercentage: true } },
orgUnit: { select: { name: true, level: true } },
_count: { select: { assignments: true, vacations: true } },
},
});
expect(JSON.parse(detailResult.content)).toEqual({
id: "res_1",
eid: "EMP-001",
name: "Bruce Banner",
email: "bruce@example.com",
chapter: "Delivery",
role: "Pipeline TD",
country: "Germany",
countryCode: "DE",
countryHours: 8,
metroCity: "Munich",
fte: 1,
lcr: "85,00 EUR",
ucr: "105,00 EUR",
chargeabilityTarget: "80%",
managementLevel: "Senior",
orgUnit: "Operations",
postalCode: "80331",
federalState: "BY",
active: true,
totalAssignments: 4,
totalVacations: 2,
skillCount: 1,
topSkills: ["Houdini (5)"],
});
});
});