import { cleanup, render } from "@testing-library/react";
import { afterEach, describe, expect, it } from "vitest";
import { defineToolcraft } from "../../schema/define-toolcraft";
import { ToolcraftApp } from "./toolcraft-app";
afterEach(() => {
cleanup();
window.localStorage.clear();
});
describe("ToolcraftApp scene export boundary", () => {
it("applies composition scene bounds to the live infinite product surface", () => {
const schema = defineToolcraft({
canvas: {
enabled: true,
size: { height: 180, unit: "px", width: 320 },
sizing: { defaultMode: "infinite", mode: "editable-output" },
},
panels: {},
persistence: { storage: "none" },
});
const { container } = render(
}
sceneBoundsProvider={() => [
{ height: 240, width: 400, x: -200, y: -120 },
]}
schema={schema}
/>,
);
const productScene = container.querySelector(
"[data-toolcraft-product-scene]",
);
expect(productScene?.style.height).toBe("240px");
expect(productScene?.style.left).toBe("-200px");
expect(productScene?.style.top).toBe("-120px");
expect(productScene?.style.width).toBe("400px");
});
it("fails before mount when a typed product export has no shared renderer", () => {
const schema = defineToolcraft({
canvas: {
enabled: true,
size: { height: 180, unit: "px", width: 320 },
},
panels: {
controls: {
sections: [
{
actionGroup: "secondary",
controls: {
footer: {
actions: [
{
label: "Export image",
role: "export-image",
value: "export",
variant: "default",
},
],
target: "panel.actions",
type: "panelActions",
},
},
},
],
title: "Controls",
},
},
});
expect(() =>
render(
}
schema={schema}
/>,
),
).toThrow("Product-owned image/video export actions require exportRenderer");
});
it("requires typed SVG actions and SVG renderers to correspond", () => {
const schema = defineToolcraft({
canvas: { enabled: true },
panels: {
controls: {
sections: [
{
controls: {
footer: {
actions: [
{
label: "Export SVG",
role: "export-svg",
value: "export.svg",
},
],
target: "actions.output",
type: "panelActions",
},
},
},
],
title: "Controls",
},
},
persistence: { storage: "none" },
});
expect(() => render()).toThrow(
"A typed SVG export action requires svgExportRenderer",
);
expect(() =>
render(
{} }}
/>,
),
).toThrow("svgExportRenderer requires a typed SVG export action");
});
});