mirror of
https://github.com/immich-app/immich.git
synced 2026-05-22 23:52:32 -04:00
76 lines
2.7 KiB
TypeScript
76 lines
2.7 KiB
TypeScript
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);
|
|
});
|
|
});
|