Files
immich/web/src/lib/utils/file-uploader.spec.ts
2026-01-13 15:15:54 +00:00

74 lines
2.5 KiB
TypeScript

import { uploadManager } from '$lib/managers/upload-manager.svelte';
import { uploadAssetsStore } from '$lib/stores/upload';
import { resetSavedUser, user } from '$lib/stores/user.store';
import { UploadState } from '$lib/types';
import * as utils from '$lib/utils';
import { AssetMediaStatus, type AssetMediaResponseDto, type UserAdminResponseDto } from '@immich/sdk';
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();
resetSavedUser();
// 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) {
user.set(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 () => {
user.set(mockUserObject);
vi.spyOn(utils, 'uploadRequest').mockImplementationOnce(() => {
resetSavedUser();
return Promise.reject(mockError);
});
await fileUploadHandler({ files: [mockFile] });
const items = get(uploadAssetsStore);
expect(items.length).toBe(1);
expect(items[0].state).toBe(UploadState.STARTED);
});
});