/** * registry.test.ts — unit tests for the check registry. */ import { describe, expect, it, beforeEach } from "bun:test"; import { clearChecks, getAllChecks, getCheck, registerCheck, type CheckDefinition, } from "../src/checks/registry.js"; function stubCheck(name: string): CheckDefinition { return { name, label: name, description: `${name} check`, agentName: "scanner", phaseId: "scan", buildScanTask: () => "scan", buildFixTask: () => "fix", gate: () => undefined, }; } describe("check registry", () => { beforeEach(() => clearChecks()); it("registerCheck inserts and getAllChecks returns it", () => { registerCheck(stubCheck("comments")); const all = getAllChecks(); expect(all).toHaveLength(1); expect(all[0]?.name).toBe("comments"); }); it("getCheck looks up by name", () => { registerCheck(stubCheck("complexity")); expect(getCheck("complexity")?.label).toBe("complexity"); expect(getCheck("missing")).toBeUndefined(); }); it("registerCheck throws on duplicate names", () => { registerCheck(stubCheck("dup")); expect(() => registerCheck(stubCheck("dup"))).toThrow(/Duplicate/); }); it("registerCheck throws on invalid names", () => { expect(() => registerCheck(stubCheck("Bad-Name"))).toThrow(/Invalid/); expect(() => registerCheck(stubCheck("with space"))).toThrow(/Invalid/); expect(() => registerCheck(stubCheck(""))).toThrow(/Invalid/); }); it("clearChecks empties the registry", () => { registerCheck(stubCheck("a")); clearChecks(); expect(getAllChecks()).toHaveLength(0); }); it("preserves insertion order", () => { registerCheck(stubCheck("alpha")); registerCheck(stubCheck("beta")); registerCheck(stubCheck("gamma")); expect(getAllChecks().map((c) => c.name)).toEqual([ "alpha", "beta", "gamma", ]); }); });