/*
Unit tests for webpage covering buildWebPageNode. It also guards the documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-1311: Compass header sweep — declares the webpage suite's contract for test-file scaffold coverage.
*/
import { describe, expect, it } from "vitest";
import { buildWebPageNode } from "../webpage.ts";
import { createJsonLdContext } from "../context.ts";
import { makePage } from "../../tests/helpers.ts";
describe("buildWebPageNode", () => {
it("builds WebPage node for content type", () => {
const page = makePage({ type: "content" });
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node["@type"]).toEqual(["WebPage"]);
expect(node["@id"]).toBe(ctx.webpageId);
expect(node.url).toBe(page.url);
expect(node.name).toBe("Test Page");
expect(node.description).toBe("A test page description");
expect(node.inLanguage).toBe("de");
});
it("uses heading for name when available", () => {
const page = makePage({ heading: "Custom Heading" });
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node.headline).toBe("Custom Heading");
});
it("uses title for headline", () => {
const page = makePage({ title: "Page Title" });
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node.name).toBe("Page Title");
});
it("emits CollectionPage for collection type", () => {
const page = makePage({ type: "collection" });
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node["@type"]).toEqual(["WebPage", "CollectionPage"]);
});
it("emits AboutPage for about type", () => {
const page = makePage({ type: "about" });
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node["@type"]).toEqual(["WebPage", "AboutPage"]);
});
it("emits ProfilePage for person type", () => {
const page = makePage({ type: "person" });
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node["@type"]).toEqual(["WebPage", "ProfilePage"]);
});
it("links to organization via publisher", () => {
const page = makePage();
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node.publisher).toEqual({ "@id": ctx.ids.organization });
});
it("links to breadcrumb when breadcrumbs > 1", () => {
const page = makePage({
breadcrumbs: [
{ name: "Home", url: "https://example.com/de/" },
{ name: "Page", url: "https://example.com/de/page/" },
],
});
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node.breadcrumb).toEqual({ "@id": ctx.breadcrumbId });
});
it("omits breadcrumb when only one crumb", () => {
const page = makePage({
breadcrumbs: [{ name: "Home", url: "https://example.com/de/" }],
});
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node.breadcrumb).toBeUndefined();
});
it("emits primaryImage when present", () => {
const page = makePage({
primaryImage: { url: "https://example.com/img.jpg" },
});
const ctx = createJsonLdContext(page);
const node = buildWebPageNode(ctx);
expect(node.primaryImageOfPage).toEqual({
"@type": "ImageObject",
url: "https://example.com/img.jpg",
});
});
});