|
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"; |
|
|
|
|
|
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), |
|
}; |
|
return { |
|
JsonEntityIndexedDbStorage: vi.fn(() => mockStoreInstance), |
|
}; |
|
}); |
|
|
|
|
|
const getMockedStore = () => new JsonEntityIndexedDbStorage(); |
|
|
|
describe("Images", () => { |
|
beforeEach(() => { |
|
vi.clearAllMocks(); |
|
|
|
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); |
|
|
|
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); |
|
}); |
|
}); |
|
}); |
|
|