Implement create custom recommendations
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
flattenRequestedFacets,
|
||||
methodFacetsSchema,
|
||||
parseRequestedFacetsFromSearchParams,
|
||||
resolveFacetMatch,
|
||||
} from "../../lib/server/validation/methodFacetsSchemas";
|
||||
|
||||
describe("methodFacetsSchema", () => {
|
||||
it("accepts boolean cells and partial groups", () => {
|
||||
expect(
|
||||
methodFacetsSchema.safeParse({
|
||||
size: { oneMember: true, twoToFive: false },
|
||||
orgType: { dao: { match: true, weight: 0.5 } },
|
||||
}).success,
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
it("rejects unknown facet group", () => {
|
||||
expect(
|
||||
methodFacetsSchema.safeParse({
|
||||
nonsense: { foo: true },
|
||||
}).success,
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("rejects unknown value within a known group", () => {
|
||||
expect(
|
||||
methodFacetsSchema.safeParse({
|
||||
size: { gigantic: true },
|
||||
}).success,
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveFacetMatch", () => {
|
||||
it("treats undefined as { match:false }", () => {
|
||||
expect(resolveFacetMatch(undefined)).toEqual({
|
||||
match: false,
|
||||
weight: null,
|
||||
});
|
||||
});
|
||||
it("preserves weight when given as object", () => {
|
||||
expect(resolveFacetMatch({ match: true, weight: 1.5 })).toEqual({
|
||||
match: true,
|
||||
weight: 1.5,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseRequestedFacetsFromSearchParams", () => {
|
||||
it("collects facet.* params across multiple values per group", () => {
|
||||
const params = new URLSearchParams();
|
||||
params.append("facet.size", "oneMember");
|
||||
params.append("facet.orgType", "dao");
|
||||
params.append("facet.orgType", "nonprofit");
|
||||
const out = parseRequestedFacetsFromSearchParams(params);
|
||||
expect(out.size).toEqual(["oneMember"]);
|
||||
expect(out.orgType?.sort()).toEqual(["dao", "nonprofit"]);
|
||||
});
|
||||
|
||||
it("silently drops unknown groups and values", () => {
|
||||
const params = new URLSearchParams();
|
||||
params.append("facet.size", "tiny");
|
||||
params.append("facet.unknown", "dao");
|
||||
params.append("foo", "bar");
|
||||
expect(parseRequestedFacetsFromSearchParams(params)).toEqual({});
|
||||
});
|
||||
});
|
||||
|
||||
describe("flattenRequestedFacets", () => {
|
||||
it("emits one entry per (group, value) pair", () => {
|
||||
const flat = flattenRequestedFacets({
|
||||
size: ["oneMember", "twoToFive"],
|
||||
orgType: ["dao"],
|
||||
});
|
||||
expect(flat).toEqual([
|
||||
{ group: "size", value: "oneMember" },
|
||||
{ group: "size", value: "twoToFive" },
|
||||
{ group: "orgType", value: "dao" },
|
||||
]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user