/** * Unit tests for src/lib/services/htmlRewriter.ts * * Tests HTML rewriting for the embedded-service reverse proxy: * - injection * - Path-absolute URL rewriting in , , '; const out = rewriteHtml(input, PREFIX); assertContains(out, `src="${PREFIX}/app.js"`); }); it("rewrites ", () => { const input = ''; const out = rewriteHtml(input, PREFIX); assertContains(out, `src="${PREFIX}/logo.png"`); }); it("rewrites
", () => { const input = '
'; const out = rewriteHtml(input, PREFIX); assertContains(out, `action="${PREFIX}/submit"`); }); it("rewrites '; const out = rewriteHtml(input, PREFIX); assertContains(out, `src="${PREFIX}/frame"`); }); it("rewrites ", () => { const input = ''; const out = rewriteHtml(input, PREFIX); assertContains(out, `src="${PREFIX}/video.mp4"`); }); it("does NOT rewrite img srcset with commas (multi-URL — v1 limitation)", () => { const input = ''; const out = rewriteHtml(input, PREFIX); // Original srcset must be preserved unchanged assertContains(out, 'srcset="/img.png 1x, /img@2x.png 2x"'); }); }); // ─── non-anchor markup preservation ────────────────────────────────────────── describe("rewriteHtml — preserves non-affected markup", () => { it("preserves text content inside elements", () => { const input = "

Hello World

"; const out = rewriteHtml(input, PREFIX); assertContains(out, "Hello World"); }); it("preserves existing non-rewritten attributes", () => { const input = '
x'; const out = rewriteHtml(input, PREFIX); assertContains(out, 'class="nav"'); assertContains(out, 'id="link1"'); }); it("preserves data attributes unchanged", () => { const input = '
'; const out = rewriteHtml(input, PREFIX); // data-url is not in REWRITABLE_ATTRS — stays as-is assertContains(out, 'data-url="/foo"'); }); it("preserves empty href unchanged", () => { const input = 'empty'; const out = rewriteHtml(input, PREFIX); assertContains(out, 'href=""'); }); }); // ─── edge cases ─────────────────────────────────────────────────────────────── describe("rewriteHtml — edge cases", () => { it("handles empty HTML string gracefully", () => { const out = rewriteHtml("", PREFIX); assertContains(out, ``); }); it("handles HTML fragment (no tag) — parse5 auto-completes tree", () => { const out = rewriteHtml('link', PREFIX); assertContains(out, ``); assertContains(out, `href="${PREFIX}/foo"`); }); it("multiple path-absolute URLs in same document are all rewritten", () => { const input = [ "", '', "", '1', '2', '', "", ].join(""); const out = rewriteHtml(input, PREFIX); assertContains(out, `href="${PREFIX}/a.css"`); assertContains(out, `href="${PREFIX}/page1"`); assertContains(out, `href="${PREFIX}/page2"`); assertContains(out, `src="${PREFIX}/app.js"`); }); });