import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import * as React from "react"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import { defineToolcraft } from "../../../schema/define-toolcraft"; import type { FileDropPresentation, FileDropPresentationItem, FileDropPreview, } from "@repo/ui"; import { ControlsPanel } from "../controls-panel"; import { ToolcraftRoot } from "../../app-shell/toolcraft-root"; import { useToolcraft } from "../../app-shell/use-toolcraft"; vi.mock("@repo/ui", async (importOriginal) => { const actual = await importOriginal(); return { ...actual, FileDrop: ({ assetKind = "image", onItemsReorder, onPreviewReorder, presentation, previews = [], }: { assetKind?: "file" | "image"; onItemsReorder?: (items: FileDropPresentationItem[]) => void; onPreviewReorder?: (previews: FileDropPreview[]) => void; presentation?: FileDropPresentation; previews?: readonly FileDropPreview[]; }) => { const presentedItems = presentation?.items ?? []; const presentedKind = presentedItems[0]?.assetKind ?? assetKind; return ( ); }, }; }); beforeAll(() => { Object.defineProperty(window, "matchMedia", { value: (query: string) => ({ addEventListener: () => undefined, addListener: () => undefined, dispatchEvent: () => false, matches: query === "(prefers-reduced-motion: reduce)", media: query, onchange: null, removeEventListener: () => undefined, removeListener: () => undefined, }), writable: true, }); }); afterEach(() => { cleanup(); }); function StateProbe() { const { state } = useToolcraft(); return ( {state.mediaAssets.map((asset) => asset.id).join(",")} ); } describe("ControlsPanel fileDrop reorder integration", () => { it("commits image and file preview sorting back to runtime media order separately", async () => { const schema = defineToolcraft({ canvas: { enabled: true, upload: true }, panels: { controls: { sections: [ { controls: { images: { label: "Images", multiple: true, target: "input.images", type: "fileDrop", }, files: { assetKind: "file", label: "Files", multiple: true, target: "input.files", type: "fileDrop", }, }, title: "Sources", }, ], title: "Controls", }, }, }); render( , ); expect(screen.getByTestId("media-ids").textContent).toBe( "img-1,file-1,img-2,file-2", ); fireEvent.click(screen.getByRole("button", { name: "Reorder image" })); expect(screen.getByTestId("media-ids").textContent).toBe( "img-2,file-1,img-1,file-2", ); fireEvent.click(screen.getByRole("button", { name: "Reorder file" })); expect(screen.getByTestId("media-ids").textContent).toBe( "img-2,file-2,img-1,file-1", ); }); });