44 lines
2.0 KiB
TypeScript
44 lines
2.0 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import { encodeControlTemplate, renderControlTemplates } from "../src/control-templates.ts";
|
|
import { runWithRequestContext } from "../src/request-context.ts";
|
|
import { createContext } from "../src/context.ts";
|
|
import { resolveRequestUrl } from "../src/headers.ts";
|
|
|
|
test("nested controls use short references and HTML-safe isolated registries", async () => {
|
|
const results = await Promise.all(["first", "second"].map((name) =>
|
|
runWithRequestContext({} as never, async () => {
|
|
let body = `</script><p>${name}</p>`;
|
|
for (let i = 0; i < 30; i++) {
|
|
body = `<template data-wrn-if="${encodeControlTemplate([{cond: null, body}])}"></template>`;
|
|
}
|
|
await Promise.resolve();
|
|
const html = renderControlTemplates();
|
|
expect(html.length).toBeLessThan(7000);
|
|
expect(html.match(/<\/script>/g)).toHaveLength(1);
|
|
return html;
|
|
}),
|
|
));
|
|
expect(results[0]).toContain("first");
|
|
expect(results[0]).not.toContain("second");
|
|
expect(results[1]).not.toContain("first");
|
|
expect(renderControlTemplates()).toBe("");
|
|
});
|
|
|
|
test("standalone rendering keeps the base64 format", () => {
|
|
expect(JSON.parse(Buffer.from(encodeControlTemplate([1]), "base64").toString())).toEqual([1]);
|
|
});
|
|
|
|
test("trusted proxy request URL and body agree with context; untrusted headers are ignored", async () => {
|
|
for (const trust of [true, false]) {
|
|
const request = new Request("http://internal:3000/api/captcha/challenge", {
|
|
method: "POST", body: '{"test":1}',
|
|
headers: { "x-forwarded-proto": "https", "x-forwarded-host": "wrnexus.com", origin: "https://evil.example" },
|
|
});
|
|
const context = createContext(request, resolveRequestUrl(request, trust));
|
|
expect(context.req.url).toBe(context.url.href);
|
|
expect(context.url.origin).toBe(trust ? "https://wrnexus.com" : "http://internal:3000");
|
|
expect(context.req.headers.get("origin")).toBe("https://evil.example");
|
|
expect(await context.req.json()).toEqual({ test: 1 });
|
|
}
|
|
});
|