import { expect, test } from "bun:test";
import { renderDocument } from "../src/index.ts";

test("escapes metadata and script URLs while preserving trusted rendered body", () => {
  const html = renderDocument({
    meta: { title: '</title><script>alert("x")</script>', description: '" onload="x' },
    body: "<main>trusted</main>",
    scripts: ['"><script>alert(1)</script>'],
  });
  expect(html).not.toContain('</title><script>alert("x")</script>');
  expect(html).toContain("&lt;/title&gt;");
  expect(html).toContain("<main>trusted</main>");
  expect(html).not.toContain("<script>alert(1)</script>");
});

test("deduplicates runtime scripts and module preloads", () => {
  const html = renderDocument({
    meta: { title: "Page" },
    body: "",
    scripts: ["/app.js", "/app.js"],
  });
  expect(html.match(/rel="modulepreload"/g)).toHaveLength(1);
  expect(html.match(/src="\/app\.js"/g)).toHaveLength(1);
});

test("always emits a document language and preserves an explicit language", () => {
  const fallback = renderDocument({ meta: {}, body: "" });
  expect(fallback).toContain('<html lang="en">');

  const explicit = renderDocument({
    meta: {},
    body: "",
    htmlAttrs: ' data-theme="dark" lang="fr"',
  });
  expect(explicit).toContain('<html data-theme="dark" lang="fr">');
  expect(explicit).not.toContain('lang="en"');
});
