import { authManager } from '$lib/managers/auth-manager.svelte'; import { uploadManager } from '$lib/managers/upload-manager.svelte'; import { uploadAssetsStore } from '$lib/stores/upload'; import { UploadState } from '$lib/types'; import * as utils from '$lib/utils'; import { AssetMediaStatus, type AssetMediaResponseDto, type UserAdminResponseDto } from '@immich/sdk'; import { preferencesFactory } from '@test-data/factories/preferences-factory'; import { get } from 'svelte/store'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { fileUploadHandler } from './file-uploader'; describe('fileUploader error handling', () => { const mockFile = new File(['content'], 'test.jpg', { type: 'image/jpeg' }); const mockUserObject = { id: 'user-123', email: 'test@example.com' } as UserAdminResponseDto; const mockError = new Error('Upload failed'); const mockUploadResponse = { id: 'mock-id', status: AssetMediaStatus.Created } as AssetMediaResponseDto; beforeEach(() => { vi.clearAllMocks(); vi.spyOn(uploadManager, 'getExtensions').mockReturnValue(['.jpg']); uploadAssetsStore.reset(); authManager.reset(); // Stub out crypto to avoid that branch vi.stubGlobal('crypto', undefined); }); for (const [name, mockUser] of [ ['logged-in users', true], ['anonymous users', false], ] as const) { describe(`for ${name}`, () => { beforeEach(() => { if (mockUser) { authManager.setUser(mockUserObject); } }); it(`should transition successful uploads to done`, async () => { vi.spyOn(utils, 'uploadRequest').mockResolvedValue({ status: 200, data: mockUploadResponse }); await fileUploadHandler({ files: [mockFile] }); const items = get(uploadAssetsStore); expect(items.length).toBe(1); expect(items[0].state).toBe(UploadState.DONE); }); it('should capture errors', async () => { vi.spyOn(utils, 'uploadRequest').mockRejectedValue(mockError); await fileUploadHandler({ files: [mockFile] }); const items = get(uploadAssetsStore); expect(items.length).toBe(1); expect(items[0].state).toBe(UploadState.ERROR); }); }); } it('should suppress errors on logout', async () => { authManager.setUser(mockUserObject); authManager.setPreferences(preferencesFactory.build()); vi.spyOn(utils, 'uploadRequest').mockImplementationOnce(() => { authManager.reset(); return Promise.reject(mockError); }); await fileUploadHandler({ files: [mockFile] }); const items = get(uploadAssetsStore); expect(items.length).toBe(1); expect(items[0].state).toBe(UploadState.STARTED); }); });