import { expect, test } from "bun:test";
import { mkdtemp, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { createViews } from "../views/api.ts";
import { defineHooks } from "../views/hooks.ts";
test("Spug hook registry composes render expansions with route context", async () => {
const hooks = defineHooks((hook) => {
hook.spug(
"stamp",
({ html, path, locals }) =>
`${html}`,
);
});
const html = await hooks.renderSpug({
html: "hello",
path: "/views/index.spug",
locals: { title: "Muddle" },
});
expect(html).toContain(
'',
);
});
test("Views applies Spug hooks after template composition", async () => {
const root = await mkdtemp(join(tmpdir(), "muddle-hooks-"));
try {
await writeFile(join(root, "index.spug"), "main= title\n");
const hooks = defineHooks((hook) => {
hook.spug("mark", ({ html }) => `${html}`);
});
const views = createViews({ root, viewsDir: root, hooks });
expect(
await views.render("index.spug", { title: "Muddle" } as never),
).toContain("");
} finally {
await rm(root, { recursive: true, force: true });
}
});