refactor(api): extract management level support

This commit is contained in:
2026-03-31 13:52:24 +02:00
parent 6f69021fe5
commit b920fa271d
3 changed files with 189 additions and 38 deletions
@@ -0,0 +1,71 @@
import { TRPCError } from "@trpc/server";
import { describe, expect, it, vi } from "vitest";
import {
assertManagementLevelDeletable,
assertManagementLevelGroupNameAvailable,
assertManagementLevelNameAvailable,
buildManagementLevelCreateData,
buildManagementLevelGroupCreateData,
buildManagementLevelGroupUpdateData,
buildManagementLevelUpdateData,
} from "../router/management-level-support.js";
describe("management level support", () => {
it("rejects duplicate group names outside the ignored id", async () => {
const db = {
managementLevelGroup: {
findUnique: vi.fn().mockResolvedValue({ id: "group_existing", name: "Team Leads" }),
},
} as never;
await expect(assertManagementLevelGroupNameAvailable(db, "Team Leads")).rejects.toBeInstanceOf(TRPCError);
});
it("rejects duplicate level names outside the ignored id", async () => {
const db = {
managementLevel: {
findUnique: vi.fn().mockResolvedValue({ id: "level_existing", name: "Senior Team Lead" }),
},
} as never;
await expect(assertManagementLevelNameAvailable(db, "Senior Team Lead")).rejects.toBeInstanceOf(TRPCError);
});
it("builds create and sparse update payloads", () => {
expect(buildManagementLevelGroupCreateData({
name: "Team Leads",
targetPercentage: 0.72,
sortOrder: 10,
})).toEqual({
name: "Team Leads",
targetPercentage: 0.72,
sortOrder: 10,
});
expect(buildManagementLevelGroupUpdateData({
targetPercentage: 0.8,
})).toEqual({
targetPercentage: 0.8,
});
expect(buildManagementLevelCreateData({
name: "Senior Team Lead",
groupId: "group_1",
})).toEqual({
name: "Senior Team Lead",
groupId: "group_1",
});
expect(buildManagementLevelUpdateData({
groupId: "group_2",
})).toEqual({
groupId: "group_2",
});
});
it("rejects deletion when a level is still assigned", () => {
expect(() => assertManagementLevelDeletable({
_count: { resources: 2 },
})).toThrow(TRPCError);
});
});