File size: 2,961 Bytes
a76eef5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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);
		});
	});
});