94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { deriveCompactCards } from "../../app/(app)/create/hooks/useFacetRecommendations";
|
|
|
|
const methods = [
|
|
{ id: "alpha" },
|
|
{ id: "bravo" },
|
|
{ id: "charlie" },
|
|
{ id: "delta" },
|
|
{ id: "echo" },
|
|
{ id: "foxtrot" },
|
|
{ id: "golf" },
|
|
] as const;
|
|
|
|
describe("deriveCompactCards", () => {
|
|
it("falls back to authoring order with no badges when no facets selected", () => {
|
|
const result = deriveCompactCards(methods, {}, false, 5);
|
|
expect(result.compactCardIds).toEqual([
|
|
"alpha",
|
|
"bravo",
|
|
"charlie",
|
|
"delta",
|
|
"echo",
|
|
]);
|
|
expect(result.recommendedIds.size).toBe(0);
|
|
});
|
|
|
|
it("falls back to authoring order with no badges when facets selected but every score is zero", () => {
|
|
const result = deriveCompactCards(methods, {}, true, 5);
|
|
expect(result.compactCardIds).toEqual([
|
|
"alpha",
|
|
"bravo",
|
|
"charlie",
|
|
"delta",
|
|
"echo",
|
|
]);
|
|
expect(result.recommendedIds.size).toBe(0);
|
|
});
|
|
|
|
it("shows only recommended (matched) cards when fewer than the limit match", () => {
|
|
const result = deriveCompactCards(
|
|
methods,
|
|
{ bravo: 2, delta: 1 },
|
|
true,
|
|
5,
|
|
);
|
|
// Caller is responsible for pre-ranking by score (rankMethodsByScore).
|
|
// This test passes already-ranked input; the hook just respects ordering
|
|
// and tags only the matched subset — no padding with unrecommended cards.
|
|
expect(result.compactCardIds).toEqual(["bravo", "delta"]);
|
|
expect([...result.recommendedIds].sort()).toEqual(["bravo", "delta"]);
|
|
});
|
|
|
|
it("caps recommended cards at the limit when more than `limit` match", () => {
|
|
const scores = {
|
|
alpha: 4,
|
|
bravo: 3,
|
|
charlie: 3,
|
|
delta: 2,
|
|
echo: 1,
|
|
foxtrot: 1,
|
|
golf: 1,
|
|
};
|
|
const result = deriveCompactCards(methods, scores, true, 5);
|
|
expect(result.compactCardIds).toEqual([
|
|
"alpha",
|
|
"bravo",
|
|
"charlie",
|
|
"delta",
|
|
"echo",
|
|
]);
|
|
expect(result.recommendedIds.size).toBe(5);
|
|
expect([...result.recommendedIds].sort()).toEqual([
|
|
"alpha",
|
|
"bravo",
|
|
"charlie",
|
|
"delta",
|
|
"echo",
|
|
]);
|
|
});
|
|
|
|
it("returns a single card when only one method matches", () => {
|
|
const result = deriveCompactCards(methods, { charlie: 4 }, true, 5);
|
|
expect(result.compactCardIds).toEqual(["charlie"]);
|
|
expect([...result.recommendedIds]).toEqual(["charlie"]);
|
|
});
|
|
|
|
it("respects a smaller `limit` even when many methods match", () => {
|
|
const scores = { alpha: 4, bravo: 3, charlie: 3, delta: 2 };
|
|
const result = deriveCompactCards(methods, scores, true, 3);
|
|
expect(result.compactCardIds).toEqual(["alpha", "bravo", "charlie"]);
|
|
expect(result.recommendedIds.size).toBe(3);
|
|
});
|
|
});
|