From 8f1b8587afeecbe959b73101c2fe232748c55ccb Mon Sep 17 00:00:00 2001 From: Kiera Jost Date: Tue, 3 Aug 2021 16:42:04 -0600 Subject: [PATCH] Add unit tests for AWS URL reader read and readURL methods Signed-off-by: Kiera Jost --- packages/backend-common/package.json | 1 + .../src/reading/AwsS3UrlReader.test.ts | 120 ++++++++++++++++++ .../__fixtures__/awsS3-mock-object.yaml | 1 + 3 files changed, 122 insertions(+) create mode 100644 packages/backend-common/src/reading/__fixtures__/awsS3-mock-object.yaml diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index c4fe498cda..b091fac935 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -93,6 +93,7 @@ "@types/tar": "^4.0.3", "@types/unzipper": "^0.10.3", "@types/webpack-env": "^1.15.2", + "aws-sdk-mock": "^5.2.1", "get-port": "^5.1.1", "http-errors": "^1.7.3", "jest": "^26.0.1", diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index 0977e560da..507ca165af 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -17,7 +17,14 @@ import { ConfigReader, JsonObject } from '@backstage/config'; import { getVoidLogger } from '../logging'; import { DefaultReadTreeResponseFactory } from './tree'; import { AwsS3UrlReader } from './AwsS3UrlReader'; +import { + AwsS3Integration, + readAwsS3IntegrationConfig, +} from '@backstage/integration'; import { UrlReaderPredicateTuple } from './types'; +import AWSMock from 'aws-sdk-mock'; +import aws from 'aws-sdk'; +import path from 'path'; describe('AwsS3UrlReader', () => { const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { @@ -30,10 +37,15 @@ describe('AwsS3UrlReader', () => { }); }; + afterEach(() => { + AWSMock.restore(); + }); + it('creates a dummy reader without the awsS3 field', () => { const entries = createReader({ integrations: {}, }); + expect(entries).toHaveLength(1); }); @@ -44,11 +56,13 @@ describe('AwsS3UrlReader', () => { accessKeyId: 'fakekey', secretAccessKey: 'fakekey', }); + const entries = createReader({ integrations: { awsS3: awsS3Integrations, }, }); + expect(entries).toHaveLength(2); }); @@ -57,11 +71,13 @@ describe('AwsS3UrlReader', () => { awsS3Integrations.push({ host: 'amazonaws.com', }); + const entries = createReader({ integrations: { awsS3: awsS3Integrations, }, }); + expect(entries).toHaveLength(2); }); @@ -109,4 +125,108 @@ describe('AwsS3UrlReader', () => { ).toBe(true); }); }); + + describe('read', () => { + AWSMock.setSDKInstance(aws); + AWSMock.mock( + 'S3', + 'getObject', + Buffer.from( + require('fs').readFileSync( + path.resolve( + 'src', + 'reading', + '__fixtures__', + 'awsS3-mock-object.yaml', + ), + ), + ), + ); + const s3 = new aws.S3(); + const awsS3UrlReader = new AwsS3UrlReader( + new AwsS3Integration( + readAwsS3IntegrationConfig( + new ConfigReader({ + host: '.amazonaws.com', + accessKeyId: 'fake-access-key', + secretAccessKey: 'fake-secret-key', + }), + ), + ), + s3, + ); + + it('returns contents of an object in a bucket', async () => { + const response = await awsS3UrlReader.read( + 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', + ); + expect(response.toString()).toBe('site_name: Test\n'); + }); + + it('rejects unknown targets', async () => { + await expect( + awsS3UrlReader.read( + 'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml', + ), + ).rejects.toThrow( + Error( + `Could not retrieve file from S3: not a valid AWS S3 URL: https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml`, + ), + ); + }); + }); + + describe('readUrl', () => { + AWSMock.setSDKInstance(aws); + + AWSMock.mock( + 'S3', + 'getObject', + Buffer.from( + require('fs').readFileSync( + path.resolve( + 'src', + 'reading', + '__fixtures__', + 'awsS3-mock-object.yaml', + ), + ), + ), + ); + + const s3 = new aws.S3(); + + const awsS3UrlReader = new AwsS3UrlReader( + new AwsS3Integration( + readAwsS3IntegrationConfig( + new ConfigReader({ + host: '.amazonaws.com', + accessKeyId: 'fake-access-key', + secretAccessKey: 'fake-secret-key', + }), + ), + ), + s3, + ); + + it('returns contents of an object in a bucket', async () => { + const response = await awsS3UrlReader.readUrl( + 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', + ); + const buffer = await response.buffer(); + expect(buffer.toString()).toBe('site_name: Test\n'); + }); + + it('rejects unknown targets', async () => { + await expect( + awsS3UrlReader.readUrl( + 'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml', + ), + ).rejects.toThrow( + Error( + `Could not retrieve file from S3: not a valid AWS S3 URL: https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml`, + ), + ); + }); + }); }); diff --git a/packages/backend-common/src/reading/__fixtures__/awsS3-mock-object.yaml b/packages/backend-common/src/reading/__fixtures__/awsS3-mock-object.yaml new file mode 100644 index 0000000000..7470c0e8a3 --- /dev/null +++ b/packages/backend-common/src/reading/__fixtures__/awsS3-mock-object.yaml @@ -0,0 +1 @@ +site_name: Test