Skip to content

Commit

Permalink
fix: upgrade the update-feed function to SDK v3
Browse files Browse the repository at this point in the history
Refactor the update-feed function to use AWS SDK v3. Tests updated accordingly.
  • Loading branch information
mrgrain committed Sep 12, 2024
1 parent b3073a5 commit 79ba526
Show file tree
Hide file tree
Showing 9 changed files with 262 additions and 257 deletions.
30 changes: 15 additions & 15 deletions src/__tests__/__snapshots__/construct-hub.test.ts.snap

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

93 changes: 61 additions & 32 deletions src/__tests__/backend/catalog-builder/client.test.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import * as AWS from 'aws-sdk';
import { AWSError } from 'aws-sdk';
import * as AWSMock from 'aws-sdk-mock';
import {
GetObjectCommand,
NoSuchBucket,
NoSuchKey,
S3Client,
} from '@aws-sdk/client-s3';
import { mockClient } from 'aws-sdk-client-mock';
import type { PackageInfo } from '../../../backend/catalog-builder';
import {
CatalogClient,
CatalogNotFoundError,
} from '../../../backend/catalog-builder/client.lambda-shared';
import * as aws from '../../../backend/shared/aws.lambda-shared';
import { stringToStream } from '../../streams';

const samplePackages: Partial<PackageInfo>[] = [
{
Expand Down Expand Up @@ -35,25 +39,26 @@ const samplePackages: Partial<PackageInfo>[] = [
},
];

const mockS3 = mockClient(S3Client);

beforeEach(() => {
process.env.CATALOG_BUCKET_NAME = 'catalog-bucket-name';
process.env.CATALOG_OBJECT_KEY = 'catalog.json';
AWSMock.setSDKInstance(AWS);
mockS3.reset();
});

afterEach(() => {
delete process.env.CATALOG_BUCKET_NAME;
delete process.env.CATALOG_OBJECT_KEY;
AWSMock.restore();
aws.reset();
});

test('s3 object not found error', async () => {
AWSMock.mock('S3', 'getObject', (_, callback) => {
const err = new Error('NoSuchKey');
(err as any).code = 'NoSuchKey';
callback(err as AWSError, undefined);
});
mockS3.on(GetObjectCommand).rejects(
new NoSuchKey({
$metadata: {},
message: 'The specified key does not exist.',
})
);

const expected = new CatalogNotFoundError('catalog-bucket-name/catalog.json');
return expect(async () => CatalogClient.newClient()).rejects.toEqual(
Expand All @@ -62,11 +67,12 @@ test('s3 object not found error', async () => {
});

test('s3 bucket not found error', async () => {
AWSMock.mock('S3', 'getObject', (_, callback) => {
const err = new Error('NoSuchBucket');
(err as any).code = 'NoSuchBucket';
callback(err as AWSError, undefined);
});
mockS3.on(GetObjectCommand).rejects(
new NoSuchBucket({
$metadata: {},
message: 'The specified bucket does not exist.',
})
);

const expected = new CatalogNotFoundError('catalog-bucket-name/catalog.json');
return expect(async () => CatalogClient.newClient()).rejects.toEqual(
Expand All @@ -75,11 +81,30 @@ test('s3 bucket not found error', async () => {
});

test('empty file', async () => {
AWSMock.mock('S3', 'getObject', (params, callback) => {
expect(params.Bucket).toBe('catalog-bucket-name');
expect(params.Key).toBe('catalog.json');
callback(undefined, { Body: '' });
});
mockS3
.on(GetObjectCommand, {
Bucket: 'catalog-bucket-name',
Key: 'catalog.json',
})
.resolves({
Body: stringToStream(''),
});

const expected = new Error(
'Catalog body is empty at catalog-bucket-name/catalog.json'
);
return expect(async () => CatalogClient.newClient()).rejects.toEqual(
expected
);
});

test('no body', async () => {
mockS3
.on(GetObjectCommand, {
Bucket: 'catalog-bucket-name',
Key: 'catalog.json',
})
.resolves({});

const expected = new Error(
'Catalog body is empty at catalog-bucket-name/catalog.json'
Expand All @@ -90,11 +115,12 @@ test('empty file', async () => {
});

test('json parsing error', async () => {
AWSMock.mock('S3', 'getObject', (params, callback) => {
expect(params.Bucket).toBe('catalog-bucket-name');
expect(params.Key).toBe('catalog.json');
callback(undefined, { Body: '09x{}' });
});
mockS3
.on(GetObjectCommand, {
Bucket: 'catalog-bucket-name',
Key: 'catalog.json',
})
.resolves({ Body: stringToStream('09x{}') });

const expected = new Error(
'Unable to parse catalog file catalog-bucket-name/catalog.json: SyntaxError: Unexpected number in JSON at position 1'
Expand All @@ -105,11 +131,14 @@ test('json parsing error', async () => {
});

test('happy path - get packages', async () => {
AWSMock.mock('S3', 'getObject', (params, callback) => {
expect(params.Bucket).toBe('catalog-bucket-name');
expect(params.Key).toBe('catalog.json');
callback(undefined, { Body: JSON.stringify({ packages: samplePackages }) });
});
mockS3
.on(GetObjectCommand, {
Bucket: 'catalog-bucket-name',
Key: 'catalog.json',
})
.resolves({
Body: stringToStream(JSON.stringify({ packages: samplePackages })),
});

const client = await CatalogClient.newClient();
expect(client.packages).toStrictEqual(samplePackages);
Expand Down
Loading

0 comments on commit 79ba526

Please sign in to comment.