From 1f8cbae2e1666634a02bae4c9a1241d4febe398c Mon Sep 17 00:00:00 2001 From: huiliangShen Date: Wed, 7 Aug 2024 14:15:14 +0800 Subject: [PATCH] fix: fix when readEntries method throw error and add new test --- src/traverseFileTree.ts | 4 +-- tests/uploader.spec.tsx | 61 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/traverseFileTree.ts b/src/traverseFileTree.ts index 9e3007e..a34f6ac 100644 --- a/src/traverseFileTree.ts +++ b/src/traverseFileTree.ts @@ -21,8 +21,8 @@ const traverseFileTree = async (files: InternalDataTransferItem[], isAccepted) = const entries = []; while (true) { - const results = await new Promise((resolve, reject) => { - dirReader.readEntries(resolve, reject); + const results = await new Promise((resolve) => { + dirReader.readEntries(resolve, () => resolve([])); }); if (!results.length) { diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index 8850f54..efcb70d 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -48,15 +48,19 @@ const makeFileSystemEntryAsync = item => { createReader: () => { let first = true; return { - async readEntries(handle) { + async readEntries(handle, error) { await sleep(100); - + if (!first) { return handle([]); } + if (item.error && first) { + return error && error(new Error('read file error')) + } + first = false; - return handle(item.children.map(makeFileSystemEntry)); + return handle(item.children.map(makeFileSystemEntryAsync)); }, }; }, @@ -532,7 +536,56 @@ describe('uploader', () => { setTimeout(() => { expect(mockStart.mock.calls.length).toBe(2); done(); - }, 500); + }, 1000); + }); + + it('dragging and dropping files to upload through asynchronous file reading with some readEntries method throw error', (done) => { + const input = uploader.container.querySelector('input')!; + + const files = { + name: 'foo', + children: [ + { + name: 'bar', + error: true, + children: [ + { + name: '1.png', + }, + { + name: 'ffc', + children: [ + { + name: '7.png', + }, + { + name: '8.png', + }, + ], + } + ], + }, + { + name: 'rc', + children: [ + { + name: '3.png', + }, + { + name: '4.webp', + }, + ], + }, + ], + }; + fireEvent.drop(input, { dataTransfer: { items: [makeDataTransferItemAsync(files)] } }); + const mockStart = jest.fn(); + handlers.onStart = mockStart; + + setTimeout(() => { + expect(mockStart.mock.calls.length).toBe(1); + done(); + }, 1000); }); it('unaccepted type files to upload will not trigger onStart when select directory', done => {