import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import { expect, test } from "@playwright/test"; import { createCanvasTemplateReplaceSlots, MAX_CANVAS_TEMPLATE_REPLACE_SOURCES, replaceCanvasTemplateSourceSlot, type CanvasTemplateReplaceSource, } from "@/lib/canvas/template-replace-batch"; function readSource(path: string) { return readFileSync(resolve(process.cwd(), path), "utf8"); } function source(id: string): CanvasTemplateReplaceSource { return { id, imageUrl: `https://example.com/${id}.png`, title: id, origin: "canvas", sourceNodeId: id, }; } test.describe("canvas template replacement entry", () => { test("keeps the selected-image toolbar action wired to the in-canvas batch dialog", () => { const imageNode = readSource("components/canvas/nodes/ImageNode.tsx"); const workspace = readSource("components/canvas/CanvasWorkspace.tsx"); const dialog = readSource("components/canvas/CanvasTemplateReplaceDialog.tsx"); expect(imageNode).toContain( 'getCanvasToolbarItem(\n canvasToolbarConfig,\n "imageTemplateReplace"' ); expect(imageNode).toContain('isSelectedImageActionInline("templateReplace")'); expect(imageNode).toContain('isSelectedImageActionInMore("templateReplace")'); expect(imageNode).toContain('handleAction("template-replace")'); expect(imageNode).toContain(" { const slots = createCanvasTemplateReplaceSlots([ source("a"), source("b"), source("c"), source("d"), source("e"), source("f"), ]); expect(slots).toHaveLength(MAX_CANVAS_TEMPLATE_REPLACE_SOURCES); expect(slots.map((item) => item?.id)).toEqual(["a", "b", "c", "d", "e"]); const moved = replaceCanvasTemplateSourceSlot(slots, 4, source("a")); expect(moved[0]).toBeNull(); expect(moved[4]?.id).toBe("a"); }); });