import { expect, test } from "bun:test";
import { COMPONENT_CONTRACTS, CORE_DESIGN_SYSTEMS } from "@wrnexus/design-system";
import { runWithRequestContext } from "@wrnexus/core";
import { gallerySample, previewSlots, previewSampleMarkup } from "../src/gallery.ts";
import { previewIconCss } from "../src/preview-assets.ts";
import { previewDocument } from "../src/preview.ts";
test("every contracted gallery component has an explicit populated standalone sample", () => {
for (const name of Object.keys(COMPONENT_CONTRACTS)) {
const sample = gallerySample(name);
expect(Object.keys(sample.props).length).toBeGreaterThan(0);
expect(sample.hint).toBeTruthy();
expect(JSON.stringify(sample.props)).not.toContain("/showcase-images/");
}
for (const name of ["Accordion", "DataMap", "Tabs", "TreeView", "FeatureGrid", "MetricGrid"]) {
expect((gallerySample(name).props.items as unknown[]).length).toBeGreaterThan(0);
}
expect(gallerySample("DrawflowCanvas").props.nodes).toHaveLength(2);
expect(gallerySample("Map").props.imageSrc).toMatch(/^data:image\/svg\+xml,/);
expect(gallerySample("DeviceFrame").content).toContain("Sample mobile page");
expect(gallerySample("BackToTop").props.alwaysVisible).toBe(true);
});
test("sample slot insertion preserves nested markup and fallback labels", () => {
const html =
'
Body
', ); expect(result).toContain(""); expect(result).toContain("Body
"); expect(result).toContain('name="footer">Fallback'); expect(previewSlots('Sample
", "")), ).not.toThrow(); }); test("icons embed real local SVG masks, including upstream icon aliases", () => { const css = previewIconCss("icon-[lucide--code-2] icon-[lucide--check-circle-2]"); expect(css).toContain("data:image/svg+xml,"); expect(css).toContain("stroke"); expect(css).toContain("icon-[lucide--code-2]"); expect(css).not.toMatch(/https?:\/\/[^"\s]*\.svg/); }); test("all gallery pages include real browser functions and fully rendered nested components", async () => { let count = 0; for (let page = 0; page < 7; page++) { const html = await previewDocument(CORE_DESIGN_SYSTEMS.square, { content: "catalog", page }); count += [...html.matchAll(/