Files
CapaKraken/packages/api/src/__tests__/rate-card-match-support.test.ts
T

77 lines
1.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
pickBestRateCardLineMatch,
scoreRateCardLineMatch,
} from "../router/rate-card-match-support.js";
describe("rate card match support", () => {
it("scores weighted matches with optional case-insensitive keys", () => {
expect(scoreRateCardLineMatch({
roleId: "role_1",
chapter: "Delivery",
seniority: "Senior",
}, {
criteria: {
roleId: "role_1",
chapter: "delivery",
seniority: "senior",
},
weights: {
roleId: 4,
chapter: 2,
seniority: 1,
},
caseInsensitiveKeys: ["chapter", "seniority"],
})).toEqual({
line: {
roleId: "role_1",
chapter: "Delivery",
seniority: "Senior",
},
score: 7,
mismatch: false,
});
});
it("marks mismatches when a populated criterion conflicts with a populated line field", () => {
expect(scoreRateCardLineMatch({
roleId: "role_pm",
chapter: "Project Management",
}, {
criteria: {
roleId: "role_3d",
chapter: "Project Management",
},
weights: {
roleId: 4,
chapter: 2,
},
})).toEqual({
line: {
roleId: "role_pm",
chapter: "Project Management",
},
score: 2,
mismatch: true,
});
});
it("picks the highest-scoring non-mismatching line", () => {
const lines = [
{ id: "generic", roleId: null, chapter: null, location: null, seniority: null, workType: null },
{ id: "specific", roleId: "role_3d", chapter: "Delivery", location: null, seniority: null, workType: null },
];
expect(pickBestRateCardLineMatch(lines, {
criteria: {
roleId: "role_3d",
chapter: "Delivery",
},
weights: {
roleId: 4,
chapter: 2,
},
})).toEqual(lines[1]);
});
});