import { describe, expect, it } from "vitest"; import { defineToolcraft } from "../schema/define-toolcraft"; import { createToolcraftState } from "./create-template-state"; import { toolcraftReducer } from "./reducer"; function schemaWithLayers() { return defineToolcraft({ canvas: { enabled: true, upload: true }, panels: { controls: { sections: [ { controls: { source: { defaultValue: null, multiple: true, target: "source.media", type: "fileDrop", }, }, }, ], title: "Controls", }, layers: true, }, }); } describe("media.importBatch", () => { it("commits a complete logical batch through one history boundary", () => { const state = createToolcraftState(schemaWithLayers()); const imported = toolcraftReducer(state, { assets: [ { assetKind: "image", fileName: "one.png", lifecycle: "ready", mimeType: "image/png", position: { x: 0, y: 0 }, resourceRef: "media:image:one", sourceTarget: "source.media", }, { assetKind: "image", fileName: "two.png", lifecycle: "ready", mimeType: "image/png", position: { x: 0, y: 0 }, resourceRef: "media:image:two", sourceTarget: "source.media", }, ], replaceExisting: false, type: "media.importBatch", }); expect(imported.mediaAssets).toHaveLength(2); expect(imported.mediaAssets.map((asset) => asset.assetKind)).toEqual([ "image", "image", ]); expect(new Set(imported.mediaAssets.map((asset) => asset.id)).size).toBe(2); expect(new Set(imported.mediaAssets.map((asset) => asset.layerId)).size).toBe(2); expect(imported.history.undo).toHaveLength(1); expect(imported.history.undo[0]?.label).toBe("Import media"); }); it("keeps media.import as one-asset compatibility over the batch reducer", () => { const state = createToolcraftState(schemaWithLayers()); const imported = toolcraftReducer(state, { asset: { dataUrl: "data:image/png;base64,bGVnYWN5", fileName: "legacy.png", mimeType: "image/png", position: { x: 0, y: 0 }, }, type: "media.import", }); expect(imported.mediaAssets).toEqual([ expect.objectContaining({ assetKind: "image", fileName: "legacy.png", }), ]); expect(imported.history.undo).toHaveLength(1); }); });