fix(web): prevent null folder tree on concurrent load (#26489)

This commit is contained in:
Michel Heusschen 2026-02-24 14:23:07 +01:00 committed by GitHub
parent f62d98a0d1
commit 30f6d4439e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 43 additions and 2 deletions

View File

@ -0,0 +1,42 @@
import { foldersStore } from '$lib/stores/folders.svelte';
import { getUniqueOriginalPaths } from '@immich/sdk';
import { beforeEach, describe, expect, it, vi } from 'vitest';
vi.mock('$lib/managers/event-manager.svelte', () => ({
eventManager: {
on: vi.fn(),
},
}));
vi.mock('@immich/sdk', () => ({
getAssetsByOriginalPath: vi.fn(),
getUniqueOriginalPaths: vi.fn(),
}));
describe('foldersStore', () => {
beforeEach(() => {
foldersStore.clearCache();
vi.clearAllMocks();
});
it('returns the same non-null tree for concurrent fetchTree calls', async () => {
let resolvePaths: (value: string[]) => void;
vi.mocked(getUniqueOriginalPaths).mockReturnValue(
new Promise<string[]>((resolve) => {
resolvePaths = resolve;
}),
);
const first = foldersStore.fetchTree();
const second = foldersStore.fetchTree();
resolvePaths!(['/photos/2026']);
const [firstTree, secondTree] = await Promise.all([first, second]);
expect(firstTree).not.toBeNull();
expect(secondTree).not.toBeNull();
expect(secondTree).toEqual(firstTree);
});
});

View File

@ -28,10 +28,9 @@ class FoldersStore {
if (this.initialized) {
return this.folders!;
}
this.initialized = true;
this.folders = TreeNode.fromPaths(await getUniqueOriginalPaths());
this.folders.collapse();
this.initialized = true;
return this.folders;
}