Implement create custom recommendations

This commit is contained in:
adilallo
2026-04-20 12:41:10 -06:00
parent e9dab04b34
commit 45bbbb8a35
75 changed files with 6403 additions and 1452 deletions
+77
View File
@@ -0,0 +1,77 @@
import { describe, expect, it } from "vitest";
import {
methodSlugFromTitle,
templateMethodsFromBody,
} from "../../lib/server/templateMethods";
describe("methodSlugFromTitle", () => {
it.each([
["Consensus Decision-Making", "consensus-decision-making"],
["Consent (Sociocracy)", "consent-sociocracy"],
["Mutual aid", "mutual-aid"],
["Workers Cooperative", "workers-cooperative"],
[" Multiple spaces ", "multiple-spaces"],
])("%s -> %s", (input, expected) => {
expect(methodSlugFromTitle(input)).toBe(expected);
});
});
describe("templateMethodsFromBody", () => {
it("extracts (section, slug) pairs and skips Values", () => {
const body = {
sections: [
{
categoryName: "Values",
entries: [{ title: "Mutuality" }],
},
{
categoryName: "Communication",
entries: [
{ title: "In-Person Meetings" },
{ title: "Loomio" },
],
},
{
categoryName: "Decision-making",
entries: [{ title: "Consensus Decision-Making" }],
},
{
categoryName: "Conflict management",
entries: [{ title: "Restorative Justice" }],
},
{
categoryName: "Membership",
entries: [{ title: "Peer Sponsorship" }],
},
],
};
const result = templateMethodsFromBody(body);
expect(result).toEqual([
{ section: "communication", slug: "in-person-meetings" },
{ section: "communication", slug: "loomio" },
{ section: "decisionApproaches", slug: "consensus-decision-making" },
{ section: "conflictManagement", slug: "restorative-justice" },
{ section: "membership", slug: "peer-sponsorship" },
]);
});
it("dedupes within a template", () => {
const body = {
sections: [
{
categoryName: "Communication",
entries: [{ title: "Loomio" }, { title: "Loomio" }],
},
],
};
expect(templateMethodsFromBody(body)).toEqual([
{ section: "communication", slug: "loomio" },
]);
});
it("returns [] for malformed bodies", () => {
expect(templateMethodsFromBody(null)).toEqual([]);
expect(templateMethodsFromBody({})).toEqual([]);
expect(templateMethodsFromBody({ sections: "nope" })).toEqual([]);
});
});