77 lines
1.9 KiB
TypeScript
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]);
|
|
});
|
|
});
|