import { createImages, releaseImage } from './image-file'; describe('image file helpers', () => { beforeEach(() => { vi.stubGlobal('crypto', { randomUUID: vi.fn(() => 'image-id') }); vi.stubGlobal('URL', { createObjectURL: vi.fn((file: File) => `blob:${file.name}`), revokeObjectURL: vi.fn(), }); }); afterEach(() => { vi.unstubAllGlobals(); }); it('creates studio images only for image files', () => { const images = createImages([ new File(['image'], 'product.png', { type: 'image/png' }), new File(['text'], 'notes.txt', { type: 'text/plain' }), ]); expect(images).toEqual([ expect.objectContaining({ id: 'image-id', name: 'product.png', size: '0 KB', url: 'blob:product.png', selectedVariant: 'clean', }), ]); }); it('formats megabyte sized files', () => { const images = createImages([new File([new Uint8Array(1_500_000)], 'large.jpg', { type: 'image/jpeg' })]); expect(images[0].size).toBe('1.4 MB'); }); it('releases generated object urls', () => { releaseImage({ id: '1', name: 'a.png', size: '1 KB', url: 'blob:a.png', file: new File(['a'], 'a.png'), selectedVariant: 'clean' }); expect(URL.revokeObjectURL).toHaveBeenCalledWith('blob:a.png'); }); });