import { registerSections, setBlocks } from "@decocms/blocks/cms"; import { renderToString } from "react-dom/server"; import { describe, expect, it } from "vitest"; import { createDecoPage } from "./createDecoPage"; function Hero({ label }: { label?: string }) { return

{`hero-${label ?? "none"}`}

; } describe("createDecoPage (next)", () => { it("resolves and renders the page for the current path", async () => { // registerSections (the async-loader registry, packages/blocks/src/cms/registry.ts) // — NOT registerSectionsSync — is what resolveDecoPage's pipeline reads: // resolveRawSection() gates each raw CMS section through getSection(), // which only consults the registry registerSections populates. // registerSectionsSync populates a separate `syncComponents` map that // SectionRenderer checks first for already-rendered pages, but a section // registered ONLY via registerSectionsSync is silently dropped (with a // "[CMS] No component registered for: ..." warning) during CMS // resolution itself — confirmed by running this test against the plan's // original registerSectionsSync-based sketch. registerSections({ "site/sections/CreateDecoPageHero.tsx": async () => ({ default: Hero }) }); // Block key MUST start with "pages-" — that's the prefix getAllPages() // (packages/blocks/src/cms/loader.ts) filters on. The plan's sketch used // "pages/home.json", which getAllPages() would silently skip, so // resolveDecoPage would return null and this test would fail even with a // correct implementation. setBlocks({ "pages-home": { path: "/", sections: [{ __resolveType: "site/sections/CreateDecoPageHero.tsx", label: "home" }], seo: { __resolveType: "website/sections/Seo/SeoV2.tsx", title: "Home title", description: "Home description", }, }, }); const { generateMetadata, default: Page } = createDecoPage({ siteName: "test-site" }); const element = await Page({ params: Promise.resolve({ slug: [] }) }); const html = renderToString(element); expect(html).toContain("hero-home"); const metadata = await generateMetadata({ params: Promise.resolve({ slug: [] }) }); expect(metadata.title).toBe("Home title"); expect(metadata.description).toBe("Home description"); }); it("calls next/navigation notFound() when no page matches the path", async () => { setBlocks({ "pages-home": { path: "/", sections: [{ __resolveType: "site/sections/CreateDecoPageHero.tsx", label: "home" }], }, }); const { default: Page } = createDecoPage({ siteName: "test-site" }); await expect(Page({ params: Promise.resolve({ slug: ["missing"] }) })).rejects.toThrow(); }); });