import { describe, expect, it } from "vitest"; import { defineToolcraft } from "./define-toolcraft"; import { applyToolcraftAppDefaults, createToolcraftAppDefaults } from "./app-defaults"; import { toolcraftCanvasWorkspaceBackgroundTarget as target } from "./runtime-targets"; import { createToolcraftState } from "../state/create-template-state"; import { toolcraftReducer } from "../composition/public-state"; import { createToolcraftPersistenceSnapshot, parseToolcraftPersistenceSnapshot } from "../composition/public-persistence"; function createSchema(enabled = true) { return defineToolcraft({ base: { identity: { id: "workspace-background-test", title: "Workspace" }, canvas: { enabled, sizing: { mode: "editable-output" } }, panels: { controls: { sections: [], title: "Controls" } }, persistence: { storage: "localStorage" }, }, modules: [], }); } describe("Workspace background control", () => { it("owns a non-keyframeable Select even without a product Background, available in Infinity", () => { const setup = createSchema().panels.controls!.sections[1]!; expect(setup.controls.workspaceBackground).toMatchObject({ type: "select", target, defaultValue: "dots", keyframeable: false, applicability: { mode: "always" }, options: [{ label: "Blanc", value: "blanc" }, { label: "Dots", value: "dots" }], }); expect(setup.controls.workspaceBackground).not.toHaveProperty("description"); expect(Object.keys(setup.controls).slice(0, 2)).toEqual(["infinityCanvas", "workspaceBackground"]); expect(createSchema(false).panels.controls!.sections[1]!.controls.workspaceBackground).toBeUndefined(); }); it("uses canonical defaults, rejects invalid values, and preserves undo/reset and persistence", () => { const schema = createSchema(); const initial = createToolcraftState(schema); expect(initial.values[target]).toBe("dots"); expect(createToolcraftState(schema, { values: { [target]: "missing" } }).values[target]).toBe("dots"); const edited = toolcraftReducer(initial, { type: "controls.setValue", target, value: "blanc" }); expect(edited.values[target]).toBe("blanc"); const invalid = toolcraftReducer(edited, { type: "controls.setValue", target, value: "missing" }); expect(invalid.values[target]).toBe("blanc"); expect(toolcraftReducer(edited, { type: "history.undo" }).values[target]).toBe("dots"); expect(toolcraftReducer(edited, { type: "controls.reset" }).values[target]).toBe("dots"); const snapshot = createToolcraftPersistenceSnapshot(edited, schema.persistence); expect(parseToolcraftPersistenceSnapshot(schema, JSON.stringify(snapshot))?.values?.[target]).toBe("blanc"); }); it("preserves the workspace preference in full source defaults", () => { const schema = createSchema(); const edited = toolcraftReducer(createToolcraftState(schema), { type: "controls.setValue", target, value: "blanc", }); const saved = createToolcraftAppDefaults(edited); const restored = createToolcraftState(applyToolcraftAppDefaults(schema, saved)); expect(restored.values[target]).toBe("blanc"); const dots = toolcraftReducer(restored, { type: "controls.setValue", target, value: "dots" }); expect(toolcraftReducer(dots, { type: "controls.reset" }).values[target]).toBe("blanc"); }); });