diff --git a/packages/storage/__tests__/providers/s3/apis/internal/uploadData/multipartHandlers.test.ts b/packages/storage/__tests__/providers/s3/apis/internal/uploadData/multipartHandlers.test.ts index 30324dc34d2..3e32326b792 100644 --- a/packages/storage/__tests__/providers/s3/apis/internal/uploadData/multipartHandlers.test.ts +++ b/packages/storage/__tests__/providers/s3/apis/internal/uploadData/multipartHandlers.test.ts @@ -619,6 +619,42 @@ describe('getMultipartUploadHandlers with key', () => { expect(mockListParts).not.toHaveBeenCalled(); }); + it('should omit unserializable option properties when calculating the hash key', async () => { + mockMultipartUploadSuccess(); + const serializableOptions = { + useAccelerateEndpoint: true, + bucket: { bucketName: 'bucket', region: 'us-west-2' }, + expectedBucketOwner: '123', + contentDisposition: 'attachment', + contentEncoding: 'deflate', + contentType: 'text/html', + customEndpoint: 'abc', + metadata: {}, + preventOverwrite: true, + checksumAlgorithm: 'crc-32' as const, + }; + const size = 8 * MB; + const { multipartUploadJob } = getMultipartUploadHandlers( + { + key: defaultKey, + data: new ArrayBuffer(size), + options: { + ...serializableOptions, + // The following options will be omitted + locationCredentialsProvider: jest.fn(), + onProgress: jest.fn(), + resumableUploadsCache: mockDefaultStorage, + }, + }, + size, + ); + await multipartUploadJob(); + expect(mockCalculateContentCRC32).toHaveBeenNthCalledWith( + 1, + JSON.stringify(serializableOptions), + ); + }); + it('should send createMultipartUpload request if the upload task is not cached', async () => { mockMultipartUploadSuccess(); const size = 8 * MB; @@ -1451,6 +1487,42 @@ describe('getMultipartUploadHandlers with path', () => { expect(mockListParts).not.toHaveBeenCalled(); }); + it('should omit unserializable option properties when calculating the hash key', async () => { + mockMultipartUploadSuccess(); + const serializableOptions = { + useAccelerateEndpoint: true, + bucket: { bucketName: 'bucket', region: 'us-west-2' }, + expectedBucketOwner: '123', + contentDisposition: 'attachment', + contentEncoding: 'deflate', + contentType: 'text/html', + customEndpoint: 'abc', + metadata: {}, + preventOverwrite: true, + checksumAlgorithm: 'crc-32' as const, + }; + const size = 8 * MB; + const { multipartUploadJob } = getMultipartUploadHandlers( + { + path: testPath, + data: new ArrayBuffer(size), + options: { + ...serializableOptions, + // The following options will be omitted + locationCredentialsProvider: jest.fn(), + onProgress: jest.fn(), + resumableUploadsCache: mockDefaultStorage, + }, + }, + size, + ); + await multipartUploadJob(); + expect(mockCalculateContentCRC32).toHaveBeenNthCalledWith( + 1, + JSON.stringify(serializableOptions), + ); + }); + it('should send createMultipartUpload request if the upload task is cached but outdated', async () => { mockDefaultStorage.getItem.mockResolvedValue( JSON.stringify({