import { expect, test } from "bun:test";
import { bundlePolicy, previewHeaders, sha256, verifyBundle } from "./policy";
import type { PreviewManifest } from "./policy";
let html =
'';
let bytes = new TextEncoder().encode(html);
let manifest: PreviewManifest = {
version: 1,
specimen: "decision-card-v1",
bundle: { bytes: bytes.byteLength, sha256: sha256(bytes) },
baseline: { optionPadding: 6, selectedColor: "#E1ECEF" },
csp: bundlePolicy(html),
};
test("the immutable bundle and exact hash policy must match the manifest", () => {
expect(verifyBundle(manifest, bytes)).toEqual(manifest);
expect(() => verifyBundle(manifest, new TextEncoder().encode(`${html} `))).toThrow();
expect(() => verifyBundle({ ...manifest, csp: "default-src *" }, bytes)).toThrow();
expect(() =>
verifyBundle(
{ ...manifest, bundle: { ...manifest.bundle, url: "https://untrusted.test" } },
bytes,
)
).toThrow();
expect(() =>
verifyBundle({ ...manifest, baseline: { ...manifest.baseline, optionPadding: 8 } }, bytes)
).toThrow();
});
test("preview responses permit only the configured ancestor and no network capabilities", () => {
let headers = new Headers(previewHeaders(verifyBundle(manifest, bytes), "https://chopin.test"));
let csp = headers.get("content-security-policy")!;
for (
let directive of [
"connect-src 'none'",
"img-src data:",
"sandbox allow-scripts",
"frame-ancestors https://chopin.test",
"frame-src 'none'",
"form-action 'none'",
]
) expect(csp).toContain(directive);
expect(csp).not.toContain("unsafe-inline");
expect(csp).not.toContain("allow-same-origin");
expect(headers.has("set-cookie")).toBe(false);
expect(headers.get("access-control-allow-origin")).toBe("https://chopin.test");
expect(headers.has("access-control-allow-credentials")).toBe(false);
});