/* Unit tests for jsonld webpage covering buildWebPageNode speakable cssSelector. 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: carried legacy entry — Initial test for speakable cssSelector referencing section-header__subheading (not section-header__lead). */ import { describe, expect, it } from "vitest"; import { buildWebPageNode } from "../jsonld/webpage.ts"; import { createJsonLdContext } from "../jsonld/context.ts"; import type { SemanticPageModel, SemanticOrganization } from "../models.ts"; function makeModel(overrides: Partial = {}): SemanticPageModel { const org: SemanticOrganization = { name: "Test Org", description: "Test organization", url: "https://example.com", }; return { type: "home", lang: "de", url: "https://example.com/de", title: "Test Page", description: "Test description", breadcrumbs: [], blocks: [], organization: org, ...overrides, }; } describe("buildWebPageNode speakable cssSelector", () => { it("references section-header__subheading (not section-header__lead) when page has lead", () => { const model = makeModel({ lead: "Test lead text", blocks: [{ id: "block-1", heading: "Section heading" }], }); const context = createJsonLdContext(model); const node = buildWebPageNode(context); const speakable = node.speakable as { cssSelector: string[] }; expect(speakable).toBeDefined(); expect(speakable.cssSelector).toContain("h1"); expect(speakable.cssSelector).toContain(".section-header__subheading"); expect(speakable.cssSelector).not.toContain(".section-header__lead"); }); it("emits only h1 selector when page has no lead", () => { const model = makeModel({ blocks: [{ id: "block-1", heading: "Section heading" }], }); const context = createJsonLdContext(model); const node = buildWebPageNode(context); const speakable = node.speakable as { cssSelector: string[] }; expect(speakable).toBeDefined(); expect(speakable.cssSelector).toEqual(["h1"]); }); it("omits speakable when no blocks have headings", () => { const model = makeModel({ lead: "Test lead text", blocks: [{ id: "block-1", heading: "" }], }); const context = createJsonLdContext(model); const node = buildWebPageNode(context); expect(node.speakable).toBeUndefined(); }); });