// @vitest-environment node
import { registerSection, setBlocks } from "@decocms/blocks/cms";
import { setRenderShell } from "@decocms/blocks-admin";
import { renderToString } from "react-dom/server";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { createDecoPreviewPage } from "./createDecoPreviewPage";
import * as nextjs from "./index";
vi.mock("next/headers", () => ({
headers: vi.fn(
async () =>
new Headers({
host: "store.test",
"x-forwarded-proto": "https",
"user-agent": "preview-test",
}),
),
}));
const HERO = "site/sections/PreviewHero.tsx";
beforeEach(() => {
setBlocks({
"Preview Hero": { __resolveType: HERO, label: "rsc" },
});
registerSection(HERO, async () => ({
default: ({ label }: { label?: string }) =>
{`hero-${label}`}
,
}));
setRenderShell({
css: "/preview.css",
fonts: ["/font.css"],
theme: "light",
bodyClass: "preview-body",
});
});
describe("createDecoPreviewPage", () => {
it("is exposed by the Next.js binding", () => {
expect((nextjs as Record).createDecoPreviewPage).toBeTypeOf("function");
});
it("resolves and renders a section through the RSC-aware SectionRenderer", async () => {
const setup = vi.fn(async () => {});
const Page = createDecoPreviewPage({ setup });
const element = await Page({
params: Promise.resolve({ path: ["Preview Hero"] }),
searchParams: Promise.resolve({ deviceHint: "desktop" }),
});
const html = renderToString(element);
expect(setup).toHaveBeenCalledOnce();
expect(html).toContain("hero-rsc");
expect(html).toContain('data-manifest-key="site/sections/PreviewHero.tsx"');
expect(html).toContain('href="/preview.css"');
expect(html).toContain('href="/font.css"');
expect(html).toContain('data-theme="light"');
expect(html).toContain("preview-body");
expect(html).toContain("editor::inject");
});
it("renders a visible diagnostic for an unknown section", async () => {
const Page = createDecoPreviewPage();
const element = await Page({
params: Promise.resolve({ path: ["Missing"] }),
searchParams: Promise.resolve({}),
});
expect(renderToString(element)).toContain("Unknown section: Missing");
});
});