/*! * @license * Copyright Squiz Australia Pty Ltd. All Rights Reserved. */ import 'aws-sdk-client-mock-jest'; import { faker } from '@faker-js/faker'; import { GetObjectCommand, ListObjectsV2Command, ListObjectsV2CommandOutput, S3Client } from '@aws-sdk/client-s3'; import { initIocContainer, iocContainer } from '../../../mocks/mockIoc'; import { AwsClientStub, mockClient } from 'aws-sdk-client-mock'; import { InjectTokens } from '../constants/InjectTokens'; import { JobUploadsRepository } from './JobUploadsRepository'; import { sdkStreamMixin } from '@smithy/util-stream'; import { Readable } from 'node:stream'; initIocContainer(); describe('JobUploadsRepositoryV2', (): void => { let s3Client: AwsClientStub; let jobUploadsRepository: JobUploadsRepository; let bucketName: string; beforeEach(() => { s3Client = mockClient(iocContainer.get(S3Client)); jobUploadsRepository = iocContainer.get(JobUploadsRepository); bucketName = iocContainer.get(InjectTokens.JobUploadsBucket); }); describe(`get`, (): void => { it(`should return a response for get`, async (): Promise => { const mockKey = `mock`; s3Client.on(GetObjectCommand).resolves({ Body: sdkStreamMixin(Readable.from(['file'])), }); const response = await jobUploadsRepository.get(mockKey); expect(response).toBe('file'); expect(s3Client).toHaveReceivedCommandWith(GetObjectCommand, { Bucket: bucketName, Key: mockKey, }); }); }); describe('listByTenant', (): void => { it('should list objects by prefix with the provided continuation token', async (): Promise => { const tenant = faker.string.uuid(); const continuationToken = faker.string.uuid(); const expectedResult: ListObjectsV2CommandOutput = { Contents: [{ Key: faker.string.uuid() }, { Key: faker.string.uuid() }], $metadata: {}, }; s3Client.on(ListObjectsV2Command).resolves(expectedResult); const response = await jobUploadsRepository.listByTenant(tenant, continuationToken); expect(response).toBe(expectedResult); expect(s3Client).toHaveReceivedCommandWith(ListObjectsV2Command, { Bucket: bucketName, Prefix: `${tenant}/`, ContinuationToken: continuationToken, }); }); }); });