import { describe, it, expect, vi, beforeEach, type Mock } from "vitest"; import { images } from "./images.svelte"; import { fileToDataURL, compressBase64Image } from "$lib/utils/file.js"; import { JsonEntityIndexedDbStorage } from "$lib/remult.js"; // Mock dependencies vi.mock("$lib/utils/file.js", () => ({ fileToDataURL: vi.fn(), compressBase64Image: vi.fn(), })); vi.mock("$lib/remult.js", () => { const mockStoreInstance = { setItem: vi.fn(), getItem: vi.fn(), deleteItem: vi.fn(), init: vi.fn().mockResolvedValue(undefined), // Mock init if it's called internally }; return { JsonEntityIndexedDbStorage: vi.fn(() => mockStoreInstance), }; }); // Helper to get the mocked store instance const getMockedStore = () => new JsonEntityIndexedDbStorage(); describe("Images", () => { beforeEach(() => { vi.clearAllMocks(); // Mock crypto.randomUUID vi.spyOn(window.crypto, "randomUUID").mockReturnValue("123e4567-e89b-12d3-a456-426614174000"); }); describe("upload", () => { it("should process a file, store it, and return a key", async () => { const mockFile = new File(["dummy content"], "test.png", { type: "image/png" }); const mockDataUrl = "data:image/png;base64,dummy"; const mockCompressedDataUrl = "data:image/jpeg;base64,compresseddummy"; (fileToDataURL as Mock).mockResolvedValue(mockDataUrl); (compressBase64Image as Mock).mockResolvedValue(mockCompressedDataUrl); const store = getMockedStore(); const key = await images.upload(mockFile); expect(fileToDataURL).toHaveBeenCalledWith(mockFile); expect(compressBase64Image).toHaveBeenCalledWith({ base64: mockDataUrl, maxSizeKB: 400, }); expect(store.setItem).toHaveBeenCalledWith(`image-123e4567-e89b-12d3-a456-426614174000`, mockCompressedDataUrl); expect(key).toBe(`image-123e4567-e89b-12d3-a456-426614174000`); }); }); describe("get", () => { it("should retrieve an item from the store", async () => { const mockKey = "image-123"; const mockStoredData = "data:image/jpeg;base64,somedata"; const store = getMockedStore(); (store.getItem as Mock).mockResolvedValue(mockStoredData); const result = await images.get(mockKey); expect(store.getItem).toHaveBeenCalledWith(mockKey); expect(result).toBe(mockStoredData); }); it("should return undefined if item not found (or whatever getItem returns)", async () => { const mockKey = "image-not-found"; const store = getMockedStore(); (store.getItem as Mock).mockResolvedValue(undefined); // Simulate item not found const result = await images.get(mockKey); expect(store.getItem).toHaveBeenCalledWith(mockKey); expect(result).toBeUndefined(); }); }); describe("delete", () => { it("should delete an item from the store", async () => { const mockKey = "image-to-delete"; const store = getMockedStore(); await images.delete(mockKey); expect(store.deleteItem).toHaveBeenCalledWith(mockKey); }); }); });