mirror of
https://github.com/immich-app/immich.git
synced 2026-01-18 15:55:56 -08:00
74 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|