/*
Unit tests for markdown page covering buildMarkdownPageSemantic. 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 markdown suite's contract for test-file scaffold coverage.
*/
import { describe, expect, it } from "vitest";
import { buildMarkdownPageSemantic } from "../page-builders/markdown-page.ts";
const baseInput = {
type: "content" as const,
lang: "de",
url: "https://example.com/de/page/",
title: "Test Page",
description: "A test page",
heading: "Test Heading",
blocks: [],
};
describe("buildMarkdownPageSemantic", () => {
it("builds a SemanticPageModel with canonical URL", () => {
const result = buildMarkdownPageSemantic(baseInput);
expect(result.type).toBe("content");
expect(result.lang).toBe("de");
expect(result.url).toBe("https://example.com/de/page/");
expect(result.title).toBe("Test Page");
expect(result.description).toBe("A test page");
expect(result.heading).toBe("Test Heading");
});
it("builds flat breadcrumb fallback when no breadcrumbs provided", () => {
const result = buildMarkdownPageSemantic({
...baseInput,
breadcrumbsContent: { homeLabel: "Start" },
});
expect(result.breadcrumbs).toHaveLength(2);
expect(result.breadcrumbs[0]).toEqual({ name: "Start", url: "https://example.com/de/" });
expect(result.breadcrumbs[1]).toEqual({
name: "Test Heading",
url: "https://example.com/de/page/",
});
});
it("uses provided breadcrumbs when available", () => {
const result = buildMarkdownPageSemantic({
...baseInput,
breadcrumbs: [
{ name: "Home", url: "https://example.com/de/" },
{ name: "Section", url: "https://example.com/de/section/" },
{ name: "Page", url: "https://example.com/de/section/page/" },
],
});
expect(result.breadcrumbs).toHaveLength(3);
expect(result.breadcrumbs[1]).toEqual({
name: "Section",
url: "https://example.com/de/section/",
});
});
it("passes through blocks", () => {
const blocks = [{ id: "b1", blockType: "prose", heading: "Block 1" }];
const result = buildMarkdownPageSemantic({ ...baseInput, blocks });
expect(result.blocks).toBe(blocks);
});
it("passes through people and initiatives", () => {
const result = buildMarkdownPageSemantic({
...baseInput,
people: [{ name: "Jane", role: "CEO" }],
initiatives: [{ id: "i1", name: "Project", summary: "A project" }],
});
expect(result.people).toEqual([{ name: "Jane", role: "CEO" }]);
expect(result.initiatives).toEqual([{ id: "i1", name: "Project", summary: "A project" }]);
});
it("passes through faqEntries when provided", () => {
const result = buildMarkdownPageSemantic({
...baseInput,
faqEntries: [{ id: "q1", question: "Q?", answer: "A." }],
});
expect(result.faqEntries).toEqual([{ id: "q1", question: "Q?", answer: "A." }]);
});
it("sets faqEntries to undefined when empty", () => {
const result = buildMarkdownPageSemantic({
...baseInput,
faqEntries: [],
});
expect(result.faqEntries).toBeUndefined();
});
it("includes audience when provided", () => {
const result = buildMarkdownPageSemantic({
...baseInput,
audience: "developer",
});
expect(result.audience).toBe("developer");
});
it("omits audience when not provided", () => {
const result = buildMarkdownPageSemantic(baseInput);
expect(result.audience).toBeUndefined();
});
it("uses default Home label when no breadcrumbsContent", () => {
const result = buildMarkdownPageSemantic(baseInput);
expect(result.breadcrumbs[0].name).toBe("Home");
});
});