diff --git a/packages/storage/__tests__/providers/AWSS3Provider-unit-test.ts b/packages/storage/__tests__/providers/AWSS3Provider-unit-test.ts index 67ab4d14496..97b0f4d93ca 100644 --- a/packages/storage/__tests__/providers/AWSS3Provider-unit-test.ts +++ b/packages/storage/__tests__/providers/AWSS3Provider-unit-test.ts @@ -23,6 +23,9 @@ import { S3RequestPresigner } from '@aws-sdk/s3-request-presigner'; S3Client.prototype.send = jest.fn(async command => { if (command instanceof ListObjectsCommand) { + if (command.input.Prefix === 'public/emptyListResultsPath') { + return {}; + } return { Contents: [ { @@ -729,6 +732,28 @@ describe('StorageProvider test', () => { spyon.mockClear(); }); + test('list objects with zero results', async () => { + jest.spyOn(Credentials, 'get').mockImplementationOnce(() => { + return new Promise((res, rej) => { + res({}); + }); + }); + + const storage = new StorageProvider(); + storage.configure(options); + const spyon = jest.spyOn(S3Client.prototype, 'send'); + + expect.assertions(2); + expect( + await storage.list('emptyListResultsPath', { level: 'public' }) + ).toEqual([]); + expect(spyon.mock.calls[0][0].input).toEqual({ + Bucket: 'bucket', + Prefix: 'public/emptyListResultsPath', + }); + spyon.mockClear(); + }); + test('list object with track', async () => { jest.spyOn(Credentials, 'get').mockImplementationOnce(() => { return new Promise((res, rej) => { diff --git a/packages/storage/src/providers/AWSS3Provider.ts b/packages/storage/src/providers/AWSS3Provider.ts index 201c422d4b1..27a545a4be8 100644 --- a/packages/storage/src/providers/AWSS3Provider.ts +++ b/packages/storage/src/providers/AWSS3Provider.ts @@ -405,14 +405,17 @@ export class AWSS3Provider implements StorageProvider { try { const response = await s3.send(listObjectsCommand); - const list = (response as any).Contents.map(item => { - return { - key: item.Key.substr(prefix.length), - eTag: item.ETag, - lastModified: item.LastModified, - size: item.Size, - }; - }); + let list = []; + if (response && response.Contents) { + list = response.Contents.map(item => { + return { + key: item.Key.substr(prefix.length), + eTag: item.ETag, + lastModified: item.LastModified, + size: item.Size, + }; + }); + } dispatchStorageEvent( track, 'list',