import { randomId, reseed } from "@excalidraw/common"; import type { FileId } from "@excalidraw/element/types"; import * as blobModule from "../data/blob"; import * as filesystemModule from "../data/filesystem"; import { Excalidraw } from "../index"; import { createPasteEvent } from "../clipboard"; import { API } from "./helpers/api"; import { mockMultipleHTMLImageElements } from "./helpers/mocks"; import { UI } from "./helpers/ui"; import { GlobalTestState, render, waitFor } from "./test-utils"; import { DEER_IMAGE_DIMENSIONS, SMILEY_IMAGE_DIMENSIONS, } from "./fixtures/constants"; import { INITIALIZED_IMAGE_PROPS } from "./helpers/constants"; const { h } = window; export const setupImageTest = async ( sizes: { width: number; height: number }[], ) => { await render(); h.state.height = 1000; mockMultipleHTMLImageElements(sizes.map((size) => [size.width, size.height])); }; describe("image insertion", () => { beforeEach(() => { vi.clearAllMocks(); vi.unstubAllGlobals(); reseed(7); const generateIdSpy = vi.spyOn(blobModule, "generateIdFromFile"); const resizeFileSpy = vi.spyOn(blobModule, "resizeImageFile"); generateIdSpy.mockImplementation(() => Promise.resolve(randomId() as FileId), ); resizeFileSpy.mockImplementation((file: File) => Promise.resolve(file)); Object.assign(document, { elementFromPoint: () => GlobalTestState.canvas, }); }); const setup = () => setupImageTest([DEER_IMAGE_DIMENSIONS, SMILEY_IMAGE_DIMENSIONS]); const assert = async () => { await waitFor(() => { expect(h.elements).toEqual([ expect.objectContaining({ ...INITIALIZED_IMAGE_PROPS, ...DEER_IMAGE_DIMENSIONS, }), expect.objectContaining({ ...INITIALIZED_IMAGE_PROPS, ...SMILEY_IMAGE_DIMENSIONS, }), ]); }); // Not placed on top of each other const dimensionsSet = new Set(h.elements.map((el) => `${el.x}-${el.y}`)); expect(dimensionsSet.size).toEqual(h.elements.length); }; it("should eventually initialize all dropped images", async () => { await setup(); const files = await Promise.all([ API.loadFile("./fixtures/deer.png"), API.loadFile("./fixtures/smiley.png"), ]); await API.drop(files.map((file) => ({ kind: "file", file }))); await assert(); }); it("should eventually initialize all pasted images", async () => { await setup(); document.dispatchEvent( createPasteEvent({ files: await Promise.all([ API.loadFile("./fixtures/deer.png"), API.loadFile("./fixtures/smiley.png"), ]), }), ); await assert(); }); it("should eventually initialize all images added through image tool", async () => { await setup(); const fileOpenSpy = vi.spyOn(filesystemModule, "fileOpen"); fileOpenSpy.mockImplementation( async () => await Promise.all([ API.loadFile("./fixtures/deer.png"), API.loadFile("./fixtures/smiley.png"), ]), ); UI.clickTool("image"); await assert(); }); });