Skip to content

Commit

Permalink
migrate some tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mrgrain committed Sep 12, 2024
1 parent 873902b commit b384757
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 109 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
import { pseudoRandomBytes } from 'crypto';
import {
CodeartifactClient,
GetPackageVersionAssetCommand,
GetPackageVersionAssetCommandOutput,
} from '@aws-sdk/client-codeartifact';
import {
PutObjectCommand,
PutObjectCommandOutput,
S3Client,
} from '@aws-sdk/client-s3';
import { SQSClient } from '@aws-sdk/client-sqs';
import { SPEC_FILE_NAME } from '@jsii/spec';
import type { Context } from 'aws-lambda';
import * as AWS from 'aws-sdk';
import * as AWSMock from 'aws-sdk-mock';
import { mockClient } from 'aws-sdk-client-mock';
import * as denyListClient from '../../../backend/deny-list/client.lambda-shared';
import * as licenseListClient from '../../../backend/license-list/client.lambda-shared';
import { reset } from '../../../backend/shared/aws.lambda-shared';
import * as env from '../../../backend/shared/env.lambda-shared';
import { integrity } from '../../../backend/shared/integrity.lambda-shared';
import * as tarball from '../../../backend/shared/tarball.lambda-shared';
import { handler } from '../../../package-sources/codeartifact/code-artifact-forwarder.lambda';
import { safeMock } from '../../safe-mock';
import { stringToStream } from '../../streams';

const mockBucketName = 'mock-bucket-name';
const mockQueueUrl = 'https://mock-queue-url/dummy';
Expand Down Expand Up @@ -69,13 +79,14 @@ const mockExtractObjects = (
tarball.extractObjects as jest.MockedFunction<typeof tarball.extractObjects>
).mockName('tarball.extractObjects');

beforeEach(() => {
AWSMock.setSDKInstance(AWS);
});
const mockCodeartifact = mockClient(CodeartifactClient);
const mockS3 = mockClient(S3Client);
const mockSQS = mockClient(SQSClient);

afterEach(() => {
AWSMock.restore();
reset();
beforeEach(() => {
mockCodeartifact.reset();
mockS3.reset();
mockSQS.reset();
});

type RequestType = Parameters<typeof handler>[0];
Expand Down Expand Up @@ -103,37 +114,27 @@ test('happy path', async () => {
)}`,
});

const mockGetPackageVersionAssetResult: AWS.CodeArtifact.GetPackageVersionAssetResult =
const mockGetPackageVersionAssetResult: GetPackageVersionAssetCommandOutput =
{
asset: 'mock-asset-content',
$metadata: {},
asset: stringToStream('mock-asset-content'),
assetName: 'package.tgz',
packageVersion: '1.2.3-dev.1337',
packageVersionRevision: pseudoRandomBytes(10).toString('base64'),
};
AWSMock.mock(
'CodeArtifact',
'getPackageVersionAsset',
(
request: AWS.CodeArtifact.GetPackageVersionAssetRequest,
cb: Response<AWS.CodeArtifact.GetPackageVersionAssetResult>
) => {
try {
expect(request).toEqual({
asset: 'package.tgz',
format: 'npm',
domainOwner: detail.domainOwner,
domain: detail.domainName,
repository: detail.repositoryName,
namespace: detail.packageNamespace,
package: detail.packageName,
packageVersion: detail.packageVersion,
});
cb(null, mockGetPackageVersionAssetResult);
} catch (e: any) {
cb(e);
}
}
);

mockCodeartifact
.on(GetPackageVersionAssetCommand, {
asset: 'package.tgz',
format: 'npm',
domainOwner: detail.domainOwner,
domain: detail.domainName,
repository: detail.repositoryName,
namespace: detail.packageNamespace,
package: detail.packageName,
packageVersion: detail.packageVersion,
})
.resolves(mockGetPackageVersionAssetResult);

const mockAssembly = Buffer.from('mock-assembly-content');
const mockPackageJson = safeMock<any>('package.json', {
Expand All @@ -160,28 +161,21 @@ test('happy path', async () => {
mockLicenseListLookup.mockReturnValueOnce('Apache-2.0');

const stagingKey = `@${detail.packageNamespace}/${detail.packageName}/${detail.packageVersion}/${mockGetPackageVersionAssetResult.packageVersionRevision}/package.tgz`;
AWSMock.mock(
'S3',
'putObject',
(req: AWS.S3.PutObjectRequest, cb: Response<AWS.S3.PutObjectOutput>) => {
try {
expect(req).toEqual({
Bucket: mockBucketName,
Key: stagingKey,
Body: mockGetPackageVersionAssetResult.asset!,
ContentType: 'application/octet-stream',
Metadata: {
'Lambda-Log-Group': mockContext.logGroupName,
'Lambda-Log-Stream': mockContext.logStreamName,
'Lambda-Run-Id': mockContext.awsRequestId,
},
});
cb(null, safeMock<AWS.S3.PutObjectOutput>('mockS3PutObjectOutput', {}));
} catch (e: any) {
cb(e);
}
}
);

mockS3.on(PutObjectCommand).callsFake((req) => {
expect(req).toEqual({
Bucket: mockBucketName,
Key: stagingKey,
Body: mockGetPackageVersionAssetResult.asset!,
ContentType: 'application/octet-stream',
Metadata: {
'Lambda-Log-Group': mockContext.logGroupName,
'Lambda-Log-Stream': mockContext.logStreamName,
'Lambda-Run-Id': mockContext.awsRequestId,
},
});
return safeMock<PutObjectCommandOutput>('mockS3PutObjectOutput', {});
});

const mockSendMessageResult: AWS.SQS.SendMessageResult = {
MessageId: pseudoRandomBytes(10).toString('base64'),
Expand Down Expand Up @@ -260,7 +254,7 @@ test('no license (i.e: UNLICENSED)', async () => {
)}`,
});

const mockGetPackageVersionAssetResult: AWS.CodeArtifact.GetPackageVersionAssetResult =
const mockGetPackageVersionAssetResult: GetPackageVersionAssetCommandOutput =
{
asset: 'mock-asset-content',

Check failure on line 259 in src/__tests__/package-sources/codeartifact/code-artifact-forwarder.lambda.test.ts

View workflow job for this annotation

GitHub Actions / build

Type 'string' is not assignable to type 'StreamingBlobPayloadOutputTypes | undefined'.
assetName: 'package.tgz',
Expand Down Expand Up @@ -335,37 +329,25 @@ test('ineligible license', async () => {
)}`,
});

const mockGetPackageVersionAssetResult: AWS.CodeArtifact.GetPackageVersionAssetResult =
const mockGetPackageVersionAssetResult: GetPackageVersionAssetCommandOutput =
{
asset: 'mock-asset-content',

Check failure on line 334 in src/__tests__/package-sources/codeartifact/code-artifact-forwarder.lambda.test.ts

View workflow job for this annotation

GitHub Actions / build

Type 'string' is not assignable to type 'StreamingBlobPayloadOutputTypes | undefined'.
assetName: 'package.tgz',
packageVersion: '1.2.3-dev.1337',
packageVersionRevision: pseudoRandomBytes(10).toString('base64'),
};
AWSMock.mock(
'CodeArtifact',
'getPackageVersionAsset',
(
request: AWS.CodeArtifact.GetPackageVersionAssetRequest,
cb: Response<AWS.CodeArtifact.GetPackageVersionAssetResult>
) => {
try {
expect(request).toEqual({
asset: 'package.tgz',
format: 'npm',
domainOwner: detail.domainOwner,
domain: detail.domainName,
repository: detail.repositoryName,
namespace: detail.packageNamespace,
package: detail.packageName,
packageVersion: detail.packageVersion,
});
cb(null, mockGetPackageVersionAssetResult);
} catch (e: any) {
cb(e);
}
}
);
mockCodeartifact
.on(GetPackageVersionAssetCommand, {
asset: 'package.tgz',
format: 'npm',
domainOwner: detail.domainOwner,
domain: detail.domainName,
repository: detail.repositoryName,
namespace: detail.packageNamespace,
package: detail.packageName,
packageVersion: detail.packageVersion,
})
.resolves(mockGetPackageVersionAssetResult);

const mockAssembly = Buffer.from('mock-assembly-content');
const mockPackageJson = safeMock<any>('package.json', {
Expand Down Expand Up @@ -412,37 +394,25 @@ test('not a jsii package', async () => {
)}`,
});

const mockGetPackageVersionAssetResult: AWS.CodeArtifact.GetPackageVersionAssetResult =
const mockGetPackageVersionAssetResult: GetPackageVersionAssetCommandOutput =
{
asset: 'mock-asset-content',

Check failure on line 399 in src/__tests__/package-sources/codeartifact/code-artifact-forwarder.lambda.test.ts

View workflow job for this annotation

GitHub Actions / build

Type 'string' is not assignable to type 'StreamingBlobPayloadOutputTypes | undefined'.
assetName: 'package.tgz',
packageVersion: '1.2.3-dev.1337',
packageVersionRevision: pseudoRandomBytes(10).toString('base64'),
};
AWSMock.mock(
'CodeArtifact',
'getPackageVersionAsset',
(
request: AWS.CodeArtifact.GetPackageVersionAssetRequest,
cb: Response<AWS.CodeArtifact.GetPackageVersionAssetResult>
) => {
try {
expect(request).toEqual({
asset: 'package.tgz',
format: 'npm',
domainOwner: detail.domainOwner,
domain: detail.domainName,
repository: detail.repositoryName,
namespace: detail.packageNamespace,
package: detail.packageName,
packageVersion: detail.packageVersion,
});
cb(null, mockGetPackageVersionAssetResult);
} catch (e: any) {
cb(e);
}
}
);
mockCodeartifact
.on(GetPackageVersionAssetCommand, {
asset: 'package.tgz',
format: 'npm',
domainOwner: detail.domainOwner,
domain: detail.domainName,
repository: detail.repositoryName,
namespace: detail.packageNamespace,
package: detail.packageName,
packageVersion: detail.packageVersion,
})
.resolves(mockGetPackageVersionAssetResult);

const mockPackageJson = safeMock<any>('package.json', {
license: 'Apache-2.0',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3';
import { Context } from 'aws-lambda';
import type { Context } from 'aws-lambda';
import { mockClient } from 'aws-sdk-client-mock';
import * as nock from 'nock';
import {
Expand Down Expand Up @@ -29,6 +29,8 @@ afterEach(() => {
delete process.env[ENV_DENY_LIST_OBJECT_KEY];
});

// @todo test happy path

test('ignores 404', async () => {
const basePath = 'https://registry.npmjs.org';
const uri = '/@pepperize/cdk-vpc/-/cdk-vpc-0.0.785.tgz';
Expand Down

0 comments on commit b384757

Please sign in to comment.