import { describe, expect, test } from "bun:test"; import { join, resolve } from "node:path"; import { runTemplateTests } from "../views/testing.ts"; import { createViews } from "../views/api.ts"; import { parse } from "../views/engine/parser.ts"; import { lex } from "../views/engine/lexer.ts"; import { compileTemplate } from "../views/engine/compiler.ts"; import { registerAmezing } from "../modules/amezing/index.ts"; const root = resolve(import.meta.dir, ".."); const sample = join(root, "samples/hello-world"); describe("template tests", () => { test("SPUG anchors emit generated relation identities", () => { const nodes = parse(lex("nav\n ul\n li@hello1() First\n li@row(item.id) Second")); const firstAnchor = nodes.nodes[0]?.kind === "element" ? nodes.nodes[0].children[0]?.kind === "element" ? nodes.nodes[0].children[0].children[0] : undefined : undefined; expect(firstAnchor).toMatchObject({ kind: "element", anchor: { name: "hello1" } }); const compiled = compileTemplate(nodes.nodes, { path: "/tmp/relations.spug", dir: "/tmp" }); expect(compiled.source).toContain('data-muddle-anchor'); expect(compiled.source).toContain('"hello1"'); expect(compiled.source).toContain('"row" + String(item.id)'); expect(compiled.source).not.toContain("__muddleRelations"); }); test("SPUG derives a dotted anchor leaf from composition scope", () => { const nodes = parse(lex("a@docs.{section.id}(href='#' + section.id) Link")); const compiled = compileTemplate(nodes.nodes, { path: "/tmp/reflective.spug", dir: "/tmp" }); expect(compiled.source).toContain('"docs." + String(section.id)'); }); test( "the assertions of the templates pass", async () => { const views = createViews({ viewsDir: join(sample, "modules/app/views") }); registerAmezing(views); const run = await runTemplateTests({ root: sample, viewRoots: [join(sample, "modules/app/views")], components: views.components, locals: { title: "muddle", nav: [{ label: "Home", href: "/" }], posts: [{ id: "test1", title: "Test1", excerpt: "Test1" }], post: { id: "test1", title: "Test1", excerpt: "Test1" }, }, }); if (run.skipped) { console.log(`muddle: template tests skipped, ${run.reason}`); return; } expect(run.tested.length).toBeGreaterThan(0); for (const failure of run.failures) { console.error(`muddle: ${failure.key}\n${failure.error.message}`); } expect(run.failures).toEqual([]); }, 30_000, ); });