import { describe, expect, it, vi } from "vitest"; import { defineToolcraft } from "../schema/define-toolcraft"; import { getToolcraftExportRendererCoverageErrors } from "./export-renderer-coverage"; function createSchema(role?: "export-image" | "export-svg" | "export-video") { return defineToolcraft({ canvas: { enabled: true }, panels: role ? { controls: { sections: [ { controls: { actions: { actions: [{ role, value: role }], target: "actions.output", type: "panelActions", }, }, id: "actions", }, ], title: "Controls", }, } : {}, }); } describe("export renderer coverage", () => { const renderer = { baseFileName: "artifact", renderFrame: vi.fn() }; it("requires one renderer for any exported product-owned scene", () => { expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: undefined, productSceneRequired: true, schema: createSchema("export-image"), svgExportRenderer: undefined, }), ).toContain("Product-owned image/video export actions require exportRenderer."); }); it("allows runtime-only scenes to use runtime composition", () => { expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: undefined, productSceneRequired: false, schema: createSchema("export-video"), svgExportRenderer: undefined, }), ).toEqual([]); }); it("rejects dead renderers and blank filenames", () => { expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: renderer, productSceneRequired: false, schema: createSchema("export-image"), svgExportRenderer: undefined, }), ).toContain("exportRenderer requires a product-owned scene."); expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: { ...renderer, baseFileName: " " }, productSceneRequired: true, schema: createSchema("export-image"), svgExportRenderer: undefined, }), ).toContain("exportRenderer.baseFileName must not be blank."); expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: renderer, productSceneRequired: true, schema: createSchema(), svgExportRenderer: undefined, }), ).toContain("exportRenderer requires a typed image or video export action."); }); it("requires SVG actions and renderers to correspond", () => { expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: undefined, productSceneRequired: false, schema: createSchema("export-svg"), svgExportRenderer: undefined, }), ).toContain("A typed SVG export action requires svgExportRenderer."); expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: undefined, productSceneRequired: false, schema: createSchema(), svgExportRenderer: renderer, }), ).toContain("svgExportRenderer requires a typed SVG export action."); expect( getToolcraftExportRendererCoverageErrors({ exportRenderer: undefined, productSceneRequired: false, schema: createSchema("export-svg"), svgExportRenderer: { ...renderer, baseFileName: " " }, }), ).toContain("svgExportRenderer.baseFileName must not be blank."); }); });