test.build/core/coordinators/chapter.coordinator.test.ts

test.build/core/coordinators/chapter.coordinator.test.ts is a file in Codebase Testing. 41 lines of code and 0 definitions.

import { describe, expect, it, vi } from "vitest";
import { mkdtempSync, rmSync } from "node:fs";
import { renderSurfaces, surfacesKey } from "@banes-lab/build-scripts/core/coordinators/chapter.coordinator.ts";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { writeVerbatim } from "@govlab/canonical-write";

const mocks = vi.hoisted(() => ({ inputs: [] as string[], rendered: [] as string[] }));

vi.mock("@banes-lab/content/core/coordinators/chapter.coordinator.ts", () => ({
    renderSurface: async (shape: string) => {
        await Promise.resolve();
        mocks.rendered.push(shape);
        return { chapters: [{ file: "a.md" }], ok: true, out: `/out/${shape}`, removed: [] };
    },
}));

vi.mock("@banes-lab/content/core/loaders/chapter.loader.ts", async (importOriginal) => ({
    ...(await importOriginal<Record<string, unknown>>()),
    surfaceInputFiles: () => mocks.inputs,
}));

describe("renderSurfaces", () => {
    it("renders every shape in this process, repository first, and reports each", async () => {
        mocks.rendered.length = 0;
        const line = await renderSurfaces();
        expect(mocks.rendered).toStrictEqual(["repository", "wiki"]);
        expect(line).toContain("1 repository chapter(s) into /out/repository");
        expect(line).toContain("1 wiki chapter(s) into /out/wiki");
    });
});

describe("surfacesKey", () => {
    it("stays the same while the inputs hold and moves when one changes", () => {
        const folder = mkdtempSync(join(tmpdir(), "surfaces-"));
        const input = join(folder, "page.md");
        writeVerbatim(input, "one");
        mocks.inputs.splice(0, mocks.inputs.length, input);
        const first = surfacesKey();
        expect(surfacesKey()).toBe(first);
        writeVerbatim(input, "two");
        const moved = surfacesKey();
        rmSync(folder, { force: true, recursive: true });
        expect(moved).not.toBe(first);
    });
});