File size: 1,668 Bytes
1955a0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { describe, it, expect } from "vitest";
import { MODULES, MODULE_IDS, moduleHref, isModuleId } from "./registry";

/**
 * Naming migration gate: `modul` → `modules` everywhere, case-aware,
 * zero stragglers (acceptance criterion).
 */
describe("modules naming migration", () => {
  it("registers exactly Module E and Module S", () => {
    expect(MODULE_IDS).toEqual(["e", "s"]);
    expect(MODULES.e.label).toBe("Module E");
    expect(MODULES.s.label).toBe("Module S");
  });

  it("routes live under the /modules namespace", () => {
    expect(MODULES.e.basePath).toBe("/modules/e");
    expect(MODULES.s.basePath).toBe("/modules/s");
    expect(moduleHref("e", "campaigns")).toBe("/modules/e/campaigns");
    expect(moduleHref("s", "campaigns")).toBe("/modules/s/campaigns");
    expect(moduleHref("e")).toBe("/modules/e");
  });

  it("contains zero `modul` stragglers (case-aware) in labels, wordmarks and routes", () => {
    const strings: string[] = [];
    MODULE_IDS.forEach((id) => {
      const m = MODULES[id];
      strings.push(m.label, m.wordmark, m.basePath, m.engineLabel, m.blurb);
      m.nav.forEach((n) => strings.push(n.name, n.path));
    });
    const stragglers = strings.filter((s) => /modul(?!e)/i.test(s));
    expect(stragglers).toEqual([]);
  });

  it("wordmarks carry the migrated Module prefix", () => {
    expect(MODULES.e.wordmark).toBe("ModuleE");
    expect(MODULES.s.wordmark).toBe("ModuleS");
  });

  it("module id guard works", () => {
    expect(isModuleId("e")).toBe(true);
    expect(isModuleId("s")).toBe(true);
    expect(isModuleId("x")).toBe(false);
    expect(isModuleId(undefined)).toBe(false);
  });
});