/*
Unit tests for breadcrumb covering buildBreadcrumbNode. 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 breadcrumb suite's contract for test-file scaffold coverage.
*/
import { describe, expect, it } from "vitest";
import { buildBreadcrumbNode } from "../breadcrumb.ts";
import { createJsonLdContext } from "../context.ts";
import { makePage } from "../../tests/helpers.ts";
describe("buildBreadcrumbNode", () => {
it("returns null when only one breadcrumb", () => {
const page = makePage({
breadcrumbs: [{ name: "Home", url: "https://example.com/de/" }],
});
const ctx = createJsonLdContext(page);
expect(buildBreadcrumbNode(ctx)).toBeNull();
});
it("builds BreadcrumbList with multiple crumbs", () => {
const page = makePage({
breadcrumbs: [
{ name: "Home", url: "https://example.com/de/" },
{ name: "About", url: "https://example.com/de/about/" },
],
});
const ctx = createJsonLdContext(page);
const node = buildBreadcrumbNode(ctx);
expect(node).not.toBeNull();
expect(node!["@type"]).toBe("BreadcrumbList");
expect(node!.itemListElement).toHaveLength(2);
expect(node as Record).toMatchObject({
itemListElement: [
{ position: 1, name: "Home" },
{ position: 2, name: "About" },
],
});
});
it("resolves relative crumb URLs against page URL", () => {
const page = makePage({
breadcrumbs: [
{ name: "Home", url: "/de/" },
{ name: "About", url: "/de/about/" },
],
});
const ctx = createJsonLdContext(page);
const node = buildBreadcrumbNode(ctx);
const items = (node as Record).itemListElement as Record[];
expect(items[0].item).toBe("https://example.com/de/");
expect(items[1].item).toBe("https://example.com/de/about/");
});
it("assigns position-scoped @id to each crumb", () => {
const page = makePage({
breadcrumbs: [
{ name: "Home", url: "https://example.com/de/" },
{ name: "About", url: "https://example.com/de/about/" },
],
});
const ctx = createJsonLdContext(page);
const node = buildBreadcrumbNode(ctx);
const items = (node as Record).itemListElement as Record[];
expect(items[0]["@id"]).toBe(`${ctx.breadcrumbId}/1`);
expect(items[1]["@id"]).toBe(`${ctx.breadcrumbId}/2`);
});
});