test(compiler): prove page loop locals render, not just emit

The existing tests assert the marker is emitted. This one executes the
generated module and asserts the rendered HTML carries each item's real,
decodable values -- generated text that reads correctly can still render
wrong, and what matters is what the runtime finds in the DOM at click time.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 07:38:40 +05:30
co-authored by Claude Opus 5
parent d8305a5a14
commit 20783699ac
@@ -83,3 +83,38 @@ test("a page with no loop-local markers does not define the encoder", () => {
);
expect(code).not.toContain("__wrnexusEncodeLoopLocals");
});
// The tests above assert the marker is EMITTED. This one executes the generated
// module and asserts it RENDERS with the loop's real values -- generated text
// that reads correctly can still render wrong, and the whole point of the
// marker is what the runtime finds in the DOM at click time.
test("a page loop handler's locals render as real, decodable values", async () => {
const code = generate(
parse(`page Packs {
state packs = [{ code: "small" }, { code: "large" }]
functions { client async function pick(c) { console.log(c) } }
view {
{#each packs as pack}
<button @click="pick(pack.code)">{pack.code}</button>
{/each}
}
}`),
).replace(/^import \{ buildApiRequest[^\n]*\n/m, "");
const js = new Bun.Transpiler({ loader: "ts" }).transformSync(code);
const mod = await import("data:text/javascript;base64," + Buffer.from(js).toString("base64"));
const html: string = await mod.default({
req: new Request("http://x/"),
cookies: {},
session: {},
});
const markers = [...html.matchAll(/data-wrn-loop-locals="([^"]+)"/g)].map((m) => m[1]!);
expect(markers.length).toBe(2);
const decoded = markers.map((m) => JSON.parse(Buffer.from(m, "base64").toString("utf8")));
expect(decoded[0].pack).toEqual({ code: "small" });
expect(decoded[1].pack).toEqual({ code: "large" });
expect(decoded[0].__wi).toBe(0);
expect(decoded[1].__wi).toBe(1);
});