import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { splitWithDimensions } from "../gridSplitter"; import { uploadBlobToGatewayMedia } from "@/utils/gatewayMediaUpload"; vi.mock("@/utils/gatewayMediaUpload", () => ({ uploadBlobToGatewayMedia: vi.fn(async () => ({ url: "https://media.example/split.png" })), })); class MockImage { width = 100; height = 100; onload: (() => void) | null = null; onerror: (() => void) | null = null; set src(_value: string) { queueMicrotask(() => this.onload?.()); } } function mockCanvas() { return { width: 0, height: 0, getContext: vi.fn(() => ({ drawImage: vi.fn(), })), toBlob: vi.fn((callback: (blob: Blob | null) => void) => { callback(new Blob(["split"], { type: "image/png" })); }), } as unknown as HTMLCanvasElement; } describe("gridSplitter", () => { const originalCreateElement = document.createElement.bind(document); beforeEach(() => { vi.clearAllMocks(); vi.stubGlobal("Image", MockImage); vi.stubGlobal("fetch", vi.fn(async () => ({ ok: true, blob: async () => new Blob(["source"], { type: "image/png" }), }))); vi.stubGlobal("URL", { ...URL, createObjectURL: vi.fn(() => "blob:canvas-safe-source"), revokeObjectURL: vi.fn(), }); vi.spyOn(document, "createElement").mockImplementation((tagName: string) => { if (tagName === "canvas") return mockCanvas(); return originalCreateElement(tagName); }); }); afterEach(() => { vi.unstubAllGlobals(); vi.restoreAllMocks(); }); it("loads remote images through the media proxy before canvas splitting", async () => { const result = await splitWithDimensions("https://remote.example/grid.png", 1, 1); expect(fetch).toHaveBeenCalledWith( `/api/proxy-media?url=${encodeURIComponent("https://remote.example/grid.png")}` ); expect(URL.createObjectURL).toHaveBeenCalled(); expect(URL.revokeObjectURL).toHaveBeenCalledWith("blob:canvas-safe-source"); expect(uploadBlobToGatewayMedia).toHaveBeenCalledWith( expect.any(Blob), expect.stringMatching(/^grid-cell-\d+-1\.png$/), "image/png", "image" ); expect(result.images).toEqual(["https://media.example/split.png"]); }); });