Files
WRNexusJS/packages/compiler/test/inactive-null-branch.test.ts
T

50 lines
2.4 KiB
TypeScript

import { expect, test } from "bun:test";
import { compile } from "../src/index.ts";
test("inactive conditional branches do not dereference null state during server rendering", async () => {
const source = `component AddressReview {
state review = null
view { <h3>Address review</h3>{#if review}<p>{review.address}</p>{#if review.suppression.active}<button>Reactivate</button>{/if}{/if} }
}`;
const code = new Bun.Transpiler({ loader: "ts" }).transformSync(
compile(source, "AddressReview.wrn").code,
);
const mod = await import("data:text/javascript;base64," + Buffer.from(code).toString("base64"));
expect(() => mod.render({})).not.toThrow();
expect(mod.render({})).toContain("<h3>Address review</h3>");
});
test("selected branches render state while inactive nested branches remain browser templates", async () => {
const source = `component AddressReview {
props { review = { address: 'review@example.test', suppression: null } }
view { {#if review}<p>{review.address}</p>{#if review.suppression}<b>{review.suppression.reason}</b>{:else}<i>No block</i>{/if}{/if} }
}`;
const code = new Bun.Transpiler({ loader: "ts" }).transformSync(
compile(source, "ReviewedAddress.wrn").code,
);
const mod = await import("data:text/javascript;base64," + Buffer.from(code).toString("base64"));
const html = mod.render({});
expect(html).toContain('data-text="review.address">review@example.test</span>');
expect(html).toContain("<i>No block</i>");
expect(html).not.toContain("<b>null</b>");
});
test("inactive branch child components retain parent prop bindings", async () => {
const source = `component AddressReview {
props { messages = { evidence: 'Evidence', reactivate: 'Reactivate' } }
state review = null
view { {#if review}<Input label="{messages.evidence}" /><Button label="{messages.reactivate}" />{/if} }
}`;
const code = new Bun.Transpiler({ loader: "ts" }).transformSync(
compile(source, "LocalizedReview.wrn").code,
);
const mod = await import("data:text/javascript;base64," + Buffer.from(code).toString("base64"));
const html = mod.render({});
const match = /data-wrn-if="([A-Za-z0-9+/=]+)"/.exec(html)!;
const body = JSON.parse(Buffer.from(match[1]!, "base64").toString())[0].body;
expect(body).toContain("data-wrn-prop-bind-0=");
expect(body).not.toContain("data-wrn-bind-0=");
expect(body).toContain("messages.evidence");
expect(body).toContain("messages.reactivate");
});