1
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
import { imageToBase64, imageUrlToBase64 } from './imageToBase64';
5
describe('imageToBase64', () => {
6
let mockImage: HTMLImageElement;
7
let mockCanvas: HTMLCanvasElement;
8
let mockContext: CanvasRenderingContext2D;
14
} as HTMLImageElement;
18
} as unknown as CanvasRenderingContext2D;
23
getContext: vi.fn().mockReturnValue(mockContext),
24
toDataURL: vi.fn().mockReturnValue('data:image/webp;base64,mockBase64Data'),
25
} as unknown as HTMLCanvasElement;
27
vi.spyOn(document, 'createElement').mockReturnValue(mockCanvas);
34
it('should convert image to base64 with correct size and type', () => {
35
const result = imageToBase64({ img: mockImage, size: 100, type: 'image/jpeg' });
37
expect(document.createElement).toHaveBeenCalledWith('canvas');
38
expect(mockCanvas.width).toBe(100);
39
expect(mockCanvas.height).toBe(100);
40
expect(mockCanvas.getContext).toHaveBeenCalledWith('2d');
41
expect(mockContext.drawImage).toHaveBeenCalledWith(mockImage, 50, 0, 100, 100, 0, 0, 100, 100);
42
expect(mockCanvas.toDataURL).toHaveBeenCalledWith('image/jpeg');
43
expect(result).toBe('data:image/webp;base64,mockBase64Data');
46
it('should use default type when not specified', () => {
47
imageToBase64({ img: mockImage, size: 100 });
48
expect(mockCanvas.toDataURL).toHaveBeenCalledWith('image/webp');
51
it('should handle taller images correctly', () => {
52
mockImage.width = 100;
53
mockImage.height = 200;
54
imageToBase64({ img: mockImage, size: 100 });
55
expect(mockContext.drawImage).toHaveBeenCalledWith(mockImage, 0, 50, 100, 100, 0, 0, 100, 100);
59
describe('imageUrlToBase64', () => {
60
const mockFetch = vi.fn();
61
const mockArrayBuffer = new ArrayBuffer(8);
64
global.fetch = mockFetch;
65
global.btoa = vi.fn().mockReturnValue('mockBase64String');
72
it('should convert image URL to base64 string', async () => {
73
mockFetch.mockResolvedValue({
74
arrayBuffer: () => Promise.resolve(mockArrayBuffer),
75
blob: () => Promise.resolve(new Blob([mockArrayBuffer], { type: 'image/jpg' })),
78
const result = await imageUrlToBase64('https://example.com/image.jpg');
80
expect(mockFetch).toHaveBeenCalledWith('https://example.com/image.jpg');
81
expect(global.btoa).toHaveBeenCalled();
82
expect(result).toEqual({ base64: 'mockBase64String', mimeType: 'image/jpg' });
85
it('should throw an error when fetch fails', async () => {
86
const mockError = new Error('Fetch failed');
87
mockFetch.mockRejectedValue(mockError);
89
await expect(imageUrlToBase64('https://example.com/image.jpg')).rejects.toThrow('Fetch failed');