import { describe, expect, it } from "vitest"; import { defineToolcraft } from "../schema/define-toolcraft"; import { createToolcraftState } from "../state/create-template-state"; import { readToolcraftImageExportFormat, readToolcraftVideoExportFormat, resolveToolcraftImageExportSettings, resolveToolcraftVideoExportSettings, toolcraftImageExportFormatTarget, toolcraftImageExportResolutionTarget, toolcraftVideoExportFormatTarget, toolcraftVideoExportResolutionTarget, } from "./artifact-export-settings"; import { ToolcraftArtifactExportError } from "./export-error"; function createState() { return createToolcraftState( defineToolcraft({ base: { identity: { id: "runtime-test", title: "Toolcraft App" }, canvas: { enabled: true }, panels: {}, }, modules: [], }), ); } describe("artifact export settings", () => { it("shares format reads with presentation without validating unrelated resolution", () => { const state = createState(); state.defaults[toolcraftImageExportFormatTarget] = "jpg"; state.defaults[toolcraftVideoExportFormatTarget] = "webm"; state.values[toolcraftImageExportResolutionTarget] = "invalid"; state.values[toolcraftVideoExportResolutionTarget] = "invalid"; expect(readToolcraftImageExportFormat(state)).toBe("jpg"); expect(readToolcraftVideoExportFormat(state)).toBe("webm"); expect(() => resolveToolcraftImageExportSettings(state)).toThrow( ToolcraftArtifactExportError, ); expect(() => resolveToolcraftVideoExportSettings(state)).toThrow( ToolcraftArtifactExportError, ); state.values[toolcraftImageExportFormatTarget] = "gif"; state.values[toolcraftVideoExportFormatTarget] = "mov"; expect(readToolcraftImageExportFormat(state)).toBeNull(); expect(readToolcraftVideoExportFormat(state)).toBeNull(); }); it("uses canonical defaults when controls are absent", () => { const state = createState(); expect(resolveToolcraftImageExportSettings(state)).toEqual({ format: "png", resolution: "4k", }); expect(resolveToolcraftVideoExportSettings(state)).toEqual({ format: "mp4", resolution: "current", }); }); it("prefers current values over normalized defaults", () => { const state = createState(); Object.assign(state.defaults, { [toolcraftImageExportFormatTarget]: "png", [toolcraftImageExportResolutionTarget]: "4k", [toolcraftVideoExportFormatTarget]: "mp4", [toolcraftVideoExportResolutionTarget]: "current", }); Object.assign(state.values, { [toolcraftImageExportFormatTarget]: "jpg", [toolcraftImageExportResolutionTarget]: "8k", [toolcraftVideoExportFormatTarget]: "webm", [toolcraftVideoExportResolutionTarget]: "4k", }); expect(resolveToolcraftImageExportSettings(state)).toEqual({ format: "jpg", resolution: "8k", }); expect(resolveToolcraftVideoExportSettings(state)).toEqual({ format: "webm", resolution: "4k", }); }); it("rejects unsupported present values with the exact target", () => { const state = createState(); state.values[toolcraftVideoExportFormatTarget] = "mov"; try { resolveToolcraftVideoExportSettings(state); throw new Error("Expected invalid export setting."); } catch (error) { expect(error).toBeInstanceOf(ToolcraftArtifactExportError); expect((error as ToolcraftArtifactExportError).feedback).toMatchObject({ code: "invalid-export-setting", target: toolcraftVideoExportFormatTarget, }); } }); });