Skip to content

Commit e2a9132

Browse files
authored
test(all): move e2e tests to cdk v2 (#676)
* test: Move e2e test to cdk V2 * fix missing await
1 parent 4941a34 commit e2a9132

File tree

10 files changed

+1776
-2479
lines changed

10 files changed

+1776
-2479
lines changed

Diff for: package-lock.json

+1,680-2,336
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: package.json

+7-7
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@
4747
},
4848
"homepage": "https://github.com/awslabs/aws-lambda-powertools-typescript#readme",
4949
"devDependencies": {
50-
"@aws-cdk/aws-dynamodb": "^1.146.0",
51-
"@aws-cdk/aws-lambda-nodejs": "^1.146.0",
52-
"@aws-cdk/cloudformation-diff": "^1.146.0",
53-
"@aws-cdk/core": "^1.146.0",
50+
"@aws-cdk/cx-api": "^2.17.0",
51+
"@aws-cdk/cloudformation-diff": "^2.17.0",
52+
"aws-cdk-lib": "^2.17.0",
53+
"constructs": "^10.0.92",
5454
"@commitlint/cli": "^16.2.1",
5555
"@middy/core": "^2.5.6",
5656
"@types/aws-lambda": "^8.10.72",
@@ -59,9 +59,9 @@
5959
"@typescript-eslint/eslint-plugin": "^5.12.1",
6060
"@typescript-eslint/parser": "^5.12.1",
6161
"archiver": "^5.3.0",
62-
"aws-cdk": "^1.146.0",
62+
"aws-cdk": "^2.17.0",
6363
"aws-sdk": "^2.1082.0",
64-
"cdk-assets": "^1.146.0",
64+
"cdk-assets": "^2.17.0",
6565
"esbuild": "^0.14.23",
6666
"eslint": "^8.4.0",
6767
"eslint-import-resolver-node": "^0.3.6",
@@ -88,4 +88,4 @@
8888
"dependencies": {
8989
"hosted-git-info": "^4.0.2"
9090
}
91-
}
91+
}

Diff for: packages/commons/tests/utils/cdk-cli.ts

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { App, Stack } from 'aws-cdk-lib';
2+
import * as cxapi from '@aws-cdk/cx-api';
3+
import { CloudFormationDeployments } from 'aws-cdk/lib/api/cloudformation-deployments';
4+
import { SdkProvider } from 'aws-cdk/lib/api/aws-auth';
5+
import { DeployStackResult } from 'aws-cdk/lib/api/deploy-stack';
6+
7+
export const deployStack = async (app: App, stack: Stack, quiet?: boolean): Promise<DeployStackResult> => {
8+
const stackArtifact = getStackArtifact(app, stack);
9+
10+
const cloudFormation = await createCloudFormationDeployments();
11+
12+
return cloudFormation.deployStack({
13+
stack: stackArtifact,
14+
quiet: quiet ? quiet : true,
15+
});
16+
};
17+
18+
export const destroyStack = async (app: App, stack: Stack, quiet?: boolean): Promise<void> => {
19+
const stackArtifact = getStackArtifact(app, stack);
20+
21+
const cloudFormation = await createCloudFormationDeployments();
22+
23+
await cloudFormation.destroyStack({
24+
stack: stackArtifact,
25+
quiet: quiet ? quiet : true,
26+
});
27+
};
28+
29+
const getStackArtifact = (app: App, stack: Stack): cxapi.CloudFormationStackArtifact => {
30+
const synthesized = app.synth();
31+
32+
// Reload the synthesized artifact for stack using the cxapi from dependencies
33+
const assembly = new cxapi.CloudAssembly(synthesized.directory);
34+
35+
return cxapi.CloudFormationStackArtifact.fromManifest(
36+
assembly,
37+
stack.artifactId,
38+
synthesized.getStackArtifact(stack.artifactId).manifest
39+
) as cxapi.CloudFormationStackArtifact;
40+
};
41+
42+
const createCloudFormationDeployments = async (): Promise<CloudFormationDeployments> => {
43+
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
44+
profile: process.env.AWS_PROFILE,
45+
});
46+
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
47+
48+
return cloudFormation;
49+
};

Diff for: packages/logger/tests/e2e/basicFeatures.middy.test.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99

1010
import path from 'path';
1111
import { randomUUID } from 'crypto';
12-
import { App, Stack } from '@aws-cdk/core';
13-
import { createStackWithLambdaFunction, deployStack, destroyStack, generateUniqueName, invokeFunction, isValidRuntimeKey } from '../helpers/e2eUtils';
12+
import { App, Stack } from 'aws-cdk-lib';
13+
import { createStackWithLambdaFunction, generateUniqueName, invokeFunction, isValidRuntimeKey } from '../helpers/e2eUtils';
14+
import { deployStack, destroyStack } from '../../../commons/tests/utils/cdk-cli';
1415
import { InvocationLogs } from '../helpers/InvocationLogs';
1516

1617
const runtime: string = process.env.RUNTIME || 'nodejs14x';
@@ -67,9 +68,9 @@ describe(`logger E2E tests basic functionalities (middy) for runtime: ${runtime}
6768
logGroupOutputKey: STACK_OUTPUT_LOG_GROUP,
6869
runtime: runtime,
6970
});
70-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
71-
const outputs = await deployStack(stackArtifact);
72-
logGroupName = outputs[STACK_OUTPUT_LOG_GROUP];
71+
72+
const result = await deployStack(integTestApp, stack);
73+
logGroupName = result.outputs[STACK_OUTPUT_LOG_GROUP];
7374

7475
// Invoke the function twice (one for cold start, another for warm start)
7576
invocationLogs = await invokeFunction(functionName, 2, 'SEQUENTIAL');

Diff for: packages/logger/tests/e2e/childLogger.manual.test.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99

1010
import path from 'path';
1111
import { randomUUID } from 'crypto';
12-
import { App, Stack } from '@aws-cdk/core';
13-
import { createStackWithLambdaFunction, deployStack, destroyStack, generateUniqueName, invokeFunction, isValidRuntimeKey } from '../helpers/e2eUtils';
12+
import { App, Stack } from 'aws-cdk-lib';
13+
import { createStackWithLambdaFunction, generateUniqueName, invokeFunction, isValidRuntimeKey } from '../helpers/e2eUtils';
14+
import { deployStack, destroyStack } from '../../../commons/tests/utils/cdk-cli';
1415
import { InvocationLogs } from '../helpers/InvocationLogs';
1516

1617
const runtime: string = process.env.RUNTIME || 'nodejs14x';
@@ -67,9 +68,8 @@ describe(`logger E2E tests child logger functionalities (manual) for runtime: ${
6768
logGroupOutputKey: STACK_OUTPUT_LOG_GROUP,
6869
runtime: runtime,
6970
});
70-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
71-
const outputs = await deployStack(stackArtifact);
72-
logGroupName = outputs[STACK_OUTPUT_LOG_GROUP];
71+
const result = await deployStack(integTestApp, stack);
72+
logGroupName = result.outputs[STACK_OUTPUT_LOG_GROUP];
7373

7474
// Invoke the function once
7575
invocationLogs = await invokeFunction(functionName, 1);

Diff for: packages/logger/tests/e2e/sampleRate.decorator.test.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99

1010
import path from 'path';
1111
import { randomUUID } from 'crypto';
12-
import { App, Stack } from '@aws-cdk/core';
13-
import { createStackWithLambdaFunction, deployStack, destroyStack, generateUniqueName, invokeFunction, isValidRuntimeKey } from '../helpers/e2eUtils';
12+
import { App, Stack } from 'aws-cdk-lib';
13+
import { createStackWithLambdaFunction, generateUniqueName, invokeFunction, isValidRuntimeKey } from '../helpers/e2eUtils';
14+
import { deployStack, destroyStack } from '../../../commons/tests/utils/cdk-cli';
1415
import { InvocationLogs } from '../helpers/InvocationLogs';
1516

1617
const runtime: string = process.env.RUNTIME || 'nodejs14x';
@@ -61,9 +62,8 @@ describe(`logger E2E tests sample rate and injectLambdaContext() for runtime: ${
6162
logGroupOutputKey: STACK_OUTPUT_LOG_GROUP,
6263
runtime: runtime,
6364
});
64-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
65-
const outputs = await deployStack(stackArtifact);
66-
logGroupName = outputs[STACK_OUTPUT_LOG_GROUP];
65+
const result = await deployStack(integTestApp, stack);
66+
logGroupName = result.outputs[STACK_OUTPUT_LOG_GROUP];
6767

6868
invocationLogs = await invokeFunction(functionName, 20);
6969

Diff for: packages/logger/tests/helpers/e2eUtils.ts

+4-36
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: MIT-0
33

4-
import { CloudFormationStackArtifact } from '@aws-cdk/cx-api';
5-
import { SdkProvider } from 'aws-cdk/lib/api/aws-auth';
6-
import { CloudFormationDeployments } from 'aws-cdk/lib/api/cloudformation-deployments';
7-
import { App, CfnOutput, Stack } from '@aws-cdk/core';
8-
import * as lambda from '@aws-cdk/aws-lambda-nodejs';
9-
import { Runtime } from '@aws-cdk/aws-lambda';
4+
import { App, CfnOutput, Stack } from 'aws-cdk-lib';
5+
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
6+
import { Runtime } from 'aws-cdk-lib/aws-lambda';
107
import * as AWS from 'aws-sdk';
118

129
import { InvocationLogs } from './InvocationLogs';
@@ -53,25 +50,10 @@ export const createStackWithLambdaFunction = (params: StackWithLambdaFunctionOpt
5350
export const generateUniqueName = (uuid: string, runtime: string, testName: string): string =>
5451
`${NAME_PREFIX}-${runtime}-${testName}-${uuid}`.substring(0, 64);
5552

56-
export const deployStack = async (stackArtifact: CloudFormationStackArtifact ): Promise<{[name:string]: string}> => {
57-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
58-
profile: process.env.AWS_PROFILE,
59-
});
60-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
61-
62-
// WHEN lambda function is deployed
63-
const result = await cloudFormation.deployStack({
64-
stack: stackArtifact,
65-
quiet: true,
66-
});
67-
68-
return result.outputs;
69-
};
70-
7153
export const invokeFunction = async (functionName: string, times: number = 1, invocationMode: 'PARALLEL' | 'SEQUENTIAL' = 'PARALLEL'): Promise<InvocationLogs[]> => {
7254
const invocationLogs: InvocationLogs[] = [];
7355

74-
const promiseFactory = () : Promise<void> => {
56+
const promiseFactory = (): Promise<void> => {
7557
const invokePromise = lambdaClient
7658
.invoke({
7759
FunctionName: functionName,
@@ -98,20 +80,6 @@ export const invokeFunction = async (functionName: string, times: number = 1, in
9880
return invocationLogs;
9981
};
10082

101-
export const destroyStack = async (app: App, stack: Stack): Promise<void> => {
102-
const stackArtifact = app.synth().getStackByName(stack.stackName);
103-
104-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
105-
profile: process.env.AWS_PROFILE,
106-
});
107-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
108-
109-
await cloudFormation.destroyStack({
110-
stack: stackArtifact,
111-
quiet: true,
112-
});
113-
};
114-
11583
const chainPromises = async (promiseFactories: (() => Promise<void>)[]) : Promise<void> => {
11684
let chain = Promise.resolve();
11785
promiseFactories.forEach(factory => chain = chain.then(factory));

Diff for: packages/metrics/tests/e2e/decorator.test.ts

+6-29
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@
88
*/
99

1010
import { randomUUID } from 'crypto';
11-
import * as lambda from '@aws-cdk/aws-lambda-nodejs';
12-
import { Tracing } from '@aws-cdk/aws-lambda';
13-
import { App, Stack } from '@aws-cdk/core';
14-
import { SdkProvider } from 'aws-cdk/lib/api/aws-auth';
15-
import { CloudFormationDeployments } from 'aws-cdk/lib/api/cloudformation-deployments';
11+
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
12+
import { Tracing } from 'aws-cdk-lib/aws-lambda';
13+
import { App, Stack } from 'aws-cdk-lib';
14+
import { deployStack, destroyStack } from '../../../commons/tests/utils/cdk-cli';
1615
import * as AWS from 'aws-sdk';
1716
import { MetricUnits } from '../../src';
1817
import { getMetrics } from '../helpers/metricsUtils';
@@ -58,21 +57,9 @@ new lambda.NodejsFunction(stack, 'MyFunction', {
5857
},
5958
});
6059

61-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
62-
6360
describe('happy cases', () => {
6461
beforeAll(async () => {
65-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
66-
profile: process.env.AWS_PROFILE,
67-
});
68-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
69-
70-
// WHEN
71-
// lambda function is deployed
72-
await cloudFormation.deployStack({
73-
stack: stackArtifact,
74-
quiet: true,
75-
});
62+
await deployStack(integTestApp, stack);
7663

7764
// and invoked
7865
for (let i = 0; i < invocationCount; i++) {
@@ -161,17 +148,7 @@ describe('happy cases', () => {
161148

162149
afterAll(async () => {
163150
if (!process.env.DISABLE_TEARDOWN) {
164-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
165-
166-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
167-
profile: process.env.AWS_PROFILE,
168-
});
169-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
170-
171-
await cloudFormation.destroyStack({
172-
stack: stackArtifact,
173-
quiet: true,
174-
});
151+
await destroyStack(integTestApp, stack);
175152
}
176153
}, ONE_MINUTE * 3);
177154
});

Diff for: packages/metrics/tests/e2e/standardFunctions.test.ts

+7-29
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88
*/
99

1010
import { randomUUID } from 'crypto';
11-
import * as lambda from '@aws-cdk/aws-lambda-nodejs';
12-
import { Tracing } from '@aws-cdk/aws-lambda';
13-
import { App, Stack } from '@aws-cdk/core';
14-
import { SdkProvider } from 'aws-cdk/lib/api/aws-auth';
15-
import { CloudFormationDeployments } from 'aws-cdk/lib/api/cloudformation-deployments';
11+
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
12+
import { Tracing } from 'aws-cdk-lib/aws-lambda';
13+
import { App, Stack } from 'aws-cdk-lib';
1614
import * as AWS from 'aws-sdk';
1715
import { MetricUnits } from '../../src';
1816
import { getMetrics } from '../helpers/metricsUtils';
17+
import { deployStack, destroyStack } from '../../../commons/tests/utils/cdk-cli';
1918

2019
const ONE_MINUTE = 1000 * 60;
2120

@@ -58,21 +57,10 @@ new lambda.NodejsFunction(stack, 'MyFunction', {
5857
},
5958
});
6059

61-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
62-
6360
describe('happy cases', () => {
6461
beforeAll(async () => {
65-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
66-
profile: process.env.AWS_PROFILE,
67-
});
68-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
69-
70-
// WHEN
71-
// lambda function is deployed
72-
await cloudFormation.deployStack({
73-
stack: stackArtifact,
74-
quiet: true,
75-
});
62+
63+
await deployStack(integTestApp, stack);
7664

7765
// and invoked
7866
for (let i = 0; i < invocationCount; i++) {
@@ -159,17 +147,7 @@ describe('happy cases', () => {
159147

160148
afterAll(async () => {
161149
if (!process.env.DISABLE_TEARDOWN) {
162-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
163-
164-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
165-
profile: process.env.AWS_PROFILE,
166-
});
167-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
168-
169-
await cloudFormation.destroyStack({
170-
stack: stackArtifact,
171-
quiet: true,
172-
});
150+
await destroyStack(integTestApp, stack);
173151
}
174152
}, ONE_MINUTE * 3);
175153
});

Diff for: packages/tracing/tests/e2e/tracer.test.ts

+7-27
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66

77
import { randomUUID, randomBytes } from 'crypto';
88
import { join } from 'path';
9-
import { Tracing, Architecture } from '@aws-cdk/aws-lambda';
10-
import { NodejsFunction } from '@aws-cdk/aws-lambda-nodejs';
11-
import { Table, AttributeType, BillingMode } from '@aws-cdk/aws-dynamodb';
12-
import { App, Duration, Stack, RemovalPolicy } from '@aws-cdk/core';
13-
import { SdkProvider } from 'aws-cdk/lib/api/aws-auth';
14-
import { CloudFormationDeployments } from 'aws-cdk/lib/api/cloudformation-deployments';
9+
import { Tracing, Architecture } from 'aws-cdk-lib/aws-lambda';
10+
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
11+
import { Table, AttributeType, BillingMode } from 'aws-cdk-lib/aws-dynamodb';
12+
import { App, Duration, Stack, RemovalPolicy } from 'aws-cdk-lib';
13+
import { deployStack, destroyStack } from '../../../commons/tests/utils/cdk-cli';
1514
import * as AWS from 'aws-sdk';
1615
import { getTraces, getInvocationSubsegment } from '../helpers/tracesUtils';
1716
import type { ParsedDocument } from '../helpers/tracesUtils';
@@ -101,16 +100,7 @@ describe('Tracer integration tests', () => {
101100
};
102101
}
103102

104-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
105-
106-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
107-
profile: process.env.AWS_PROFILE,
108-
});
109-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
110-
await cloudFormation.deployStack({
111-
stack: stackArtifact,
112-
quiet: true,
113-
});
103+
await deployStack(integTestApp, stack);
114104

115105
// Act
116106
Object.values(invocationsMap).forEach(async ({ functionName }) => {
@@ -132,17 +122,7 @@ describe('Tracer integration tests', () => {
132122
afterAll(async () => {
133123

134124
if (!process.env.DISABLE_TEARDOWN) {
135-
const stackArtifact = integTestApp.synth().getStackByName(stack.stackName);
136-
137-
const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults({
138-
profile: process.env.AWS_PROFILE,
139-
});
140-
const cloudFormation = new CloudFormationDeployments({ sdkProvider });
141-
142-
await cloudFormation.destroyStack({
143-
stack: stackArtifact,
144-
quiet: true,
145-
});
125+
await destroyStack(integTestApp, stack);
146126
}
147127

148128
}, ONE_MINUTE * 2);

0 commit comments

Comments
 (0)