/** * Page Context Tests * * Tests the public page context builder for: * - Astro-like input handling * - URL string and object input * - Default pageType resolution * - Null normalization for optional fields */ import { describe, it, expect } from "vitest"; import { createPublicPageContext } from "../../../src/page/context.js"; describe("createPublicPageContext", () => { it("accepts Astro-like input and extracts url/path/locale", () => { const result = createPublicPageContext({ Astro: { url: new URL("https://example.com/blog/hello"), currentLocale: "en", }, kind: "content", title: "Hello", pageTitle: "Hello", }); expect(result.url).toBe("https://example.com/blog/hello"); expect(result.path).toBe("/blog/hello"); expect(result.locale).toBe("en"); expect(result.title).toBe("Hello"); expect(result.pageTitle).toBe("Hello"); }); it("accepts URL string input", () => { const result = createPublicPageContext({ url: "https://example.com/about", kind: "custom", locale: "fr", }); expect(result.url).toBe("https://example.com/about"); expect(result.path).toBe("/about"); expect(result.locale).toBe("fr"); }); it("accepts URL object input", () => { const urlObj = new URL("https://example.com/products?page=2"); const result = createPublicPageContext({ url: urlObj, kind: "custom", }); expect(result.url).toBe("https://example.com/products?page=2"); expect(result.path).toBe("/products"); }); it('defaults pageType to "article" for content kind', () => { const result = createPublicPageContext({ url: "https://example.com/post/1", kind: "content", }); expect(result.pageType).toBe("article"); }); it('defaults pageType to "website" for custom kind', () => { const result = createPublicPageContext({ url: "https://example.com/", kind: "custom", }); expect(result.pageType).toBe("website"); }); it("normalizes undefined locale to null", () => { const result = createPublicPageContext({ Astro: { url: new URL("https://example.com/"), // currentLocale not set }, kind: "custom", }); expect(result.locale).toBeNull(); }); it("normalizes undefined pageTitle to null", () => { const result = createPublicPageContext({ url: "https://example.com/about", kind: "custom", title: "About | My Site", }); expect(result.pageTitle).toBeNull(); }); it("normalizes content slug undefined to null", () => { const result = createPublicPageContext({ url: "https://example.com/post/1", kind: "content", content: { collection: "posts", id: "abc123" }, }); expect(result.content).toBeDefined(); expect(result.content!.slug).toBeNull(); expect(result.content!.collection).toBe("posts"); expect(result.content!.id).toBe("abc123"); }); it("sets content to undefined for custom kind", () => { const result = createPublicPageContext({ url: "https://example.com/about", kind: "custom", }); expect(result.content).toBeUndefined(); }); it("passes breadcrumbs through verbatim when provided", () => { const result = createPublicPageContext({ url: "https://example.com/blog/hello", kind: "content", breadcrumbs: [ { name: "Home", url: "/" }, { name: "Blog", url: "/blog/" }, { name: "Hello", url: "/blog/hello" }, ], }); expect(result.breadcrumbs).toEqual([ { name: "Home", url: "/" }, { name: "Blog", url: "/blog/" }, { name: "Hello", url: "/blog/hello" }, ]); }); it("leaves breadcrumbs undefined when not provided", () => { const result = createPublicPageContext({ url: "https://example.com/about", kind: "custom", }); expect(result.breadcrumbs).toBeUndefined(); }); it("preserves explicit empty breadcrumbs array (opt-out signal)", () => { const result = createPublicPageContext({ url: "https://example.com/", kind: "custom", breadcrumbs: [], }); expect(result.breadcrumbs).toEqual([]); }); });