You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.3 KiB
75 lines
2.3 KiB
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"]);
|
|
});
|
|
});
|
|
|