From 17f318dd75e536c09a73b5e171eca3a690db7e25 Mon Sep 17 00:00:00 2001 From: Amit Haridas Date: Fri, 5 Jun 2026 14:50:56 +0530 Subject: [PATCH] fix(renderer): drop redundant ternary, add loadChildren idempotence test --- src/renderer/stores/file-store.ts | 4 ++-- tests/unit/stores/file-store.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/renderer/stores/file-store.ts b/src/renderer/stores/file-store.ts index 17a1aab..7e67271 100644 --- a/src/renderer/stores/file-store.ts +++ b/src/renderer/stores/file-store.ts @@ -46,7 +46,7 @@ function entryToNode(entry: FileEntry): FileNode { name: entry.name, path: entry.path, isDirectory: entry.isDirectory, - children: entry.isDirectory ? null : null, + children: null, // lazy: start unloaded; loadChildren populates this }; } @@ -97,7 +97,7 @@ export const useFileStore = create()( let found = false; updateNode(tree, dirPath, (node) => { - if (node.loaded) return; + if (node.loaded === true) return; found = true; }); if (!found) return; diff --git a/tests/unit/stores/file-store.test.ts b/tests/unit/stores/file-store.test.ts index ad0ffe2..9d0cb99 100644 --- a/tests/unit/stores/file-store.test.ts +++ b/tests/unit/stores/file-store.test.ts @@ -139,6 +139,28 @@ describe('useFileStore', () => { expect(fakeList).not.toHaveBeenCalled(); }); + it('loadChildren is idempotent: does not re-fetch when already loaded', async () => { + fakeList.mockResolvedValue({ + ok: true, + data: [{ name: 'src', path: '/root/src', isDirectory: true }], + }); + await useFileStore.getState().openFolder('/root'); + + fakeList.mockClear(); + fakeList.mockResolvedValue({ + ok: true, + data: [{ name: 'foo.ts', path: '/root/src/foo.ts', isDirectory: false }], + }); + + await useFileStore.getState().loadChildren('/root/src'); + const callsAfterFirst = fakeList.mock.calls.length; + expect(callsAfterFirst).toBe(1); + + // Second call should be a no-op (loaded is true) + await useFileStore.getState().loadChildren('/root/src'); + expect(fakeList.mock.calls.length).toBe(callsAfterFirst); + }); + // --- toggleExpanded --- it('toggleExpanded adds and removes paths from the expanded Set', () => {