50 lines
2.4 KiB
TypeScript
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");
|
|
});
|