dodil/erp-ui
tests/contract.test.ts
import { checkModules, extensionsFor, type ModuleUI } from "../src";
const C = () => null;
const bp: ModuleUI = { name: "bp", version: "0.1.0",
screens: [{ path: "/partners", title: "Partners", component: C }, { path: "/partners/:bpId", title: "Partner", component: C }],
offers: [{ id: "bp.partner.panels", context: ["bpId"], description: "panels on a partner" }] };
const activity: ModuleUI = { name: "activity", version: "0.1.0", screens: [],
extensions: [{ point: "bp.partner.panels", title: "Timeline", component: C }] };
test("modules that fit together have no problems", () => {
expect(checkModules([bp, activity])).toEqual([]);
});
test("a panel for an extension point nobody offers is refused — the brick it needs is missing", () => {
expect(checkModules([activity])).toEqual(['activity: "Timeline" plugs into bp.partner.panels, which no module offers']);
});
test("collisions are refused", () => {
const twin: ModuleUI = { ...bp, name: "bp2", offers: [{ id: "bp.partner.panels", context: [], description: "" }] };
expect(checkModules([bp, twin])).toContain('bp2: extension point bp.partner.panels must start with "bp2."');
expect(checkModules([{ ...bp, screens: [...bp.screens, bp.screens[0]] }])).toContain("bp: two screens at /partners");
});
test("a panel the caller may not see is not offered", () => {
const secret = { ...activity, extensions: [{ point: "bp.partner.panels", title: "Margins", permission: "x:y:z", component: C }] };
expect(extensionsFor([bp, activity, secret], "bp.partner.panels", (p) => !p).map((e) => e.title)).toEqual(["Timeline"]);
});