@aws-cdk-testing/cli-integ 3.2.3 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -88,8 +88,8 @@ class SsoPermissionSetNoPolicy extends Stack {
88
88
  new sso.CfnPermissionSet(this, "permission-set-without-managed-policy", {
89
89
  instanceArn: 'arn:aws:sso:::instance/testvalue',
90
90
  name: 'testName',
91
- permissionsBoundary: { customerManagedPolicyReference: { name: 'why', path: '/how/' }},
92
- })
91
+ permissionsBoundary: { customerManagedPolicyReference: { name: 'why', path: '/how/' } },
92
+ })
93
93
  }
94
94
  }
95
95
 
@@ -102,38 +102,38 @@ class SsoPermissionSetManagedPolicy extends Stack {
102
102
  permissionsBoundary: { managedPolicyArn: 'arn:aws:iam::aws:policy/AdministratorAccess' },
103
103
  instanceArn: 'arn:aws:sso:::instance/testvalue',
104
104
  name: 'niceWork',
105
- })
105
+ })
106
106
  }
107
107
  }
108
108
 
109
109
  class SsoAssignment extends Stack {
110
110
  constructor(scope, id) {
111
111
  super(scope, id);
112
- new sso.CfnAssignment(this, "assignment", {
113
- instanceArn: 'arn:aws:sso:::instance/testvalue',
114
- permissionSetArn: 'arn:aws:sso:::testvalue',
115
- principalId: '11111111-2222-3333-4444-test',
116
- principalType: 'USER',
117
- targetId: '111111111111',
118
- targetType: 'AWS_ACCOUNT'
119
- });
112
+ new sso.CfnAssignment(this, "assignment", {
113
+ instanceArn: 'arn:aws:sso:::instance/testvalue',
114
+ permissionSetArn: 'arn:aws:sso:::testvalue',
115
+ principalId: '11111111-2222-3333-4444-test',
116
+ principalType: 'USER',
117
+ targetId: '111111111111',
118
+ targetType: 'AWS_ACCOUNT'
119
+ });
120
120
  }
121
121
  }
122
122
 
123
123
  class SsoInstanceAccessControlConfig extends Stack {
124
124
  constructor(scope, id) {
125
125
  super(scope, id);
126
- new sso.CfnInstanceAccessControlAttributeConfiguration(this, 'instanceAccessControlConfig', {
127
- instanceArn: 'arn:aws:sso:::instance/testvalue',
128
- accessControlAttributes: [
129
- { key: 'first', value: { source: ['a'] } },
130
- { key: 'second', value: { source: ['b'] } },
131
- { key: 'third', value: { source: ['c'] } },
132
- { key: 'fourth', value: { source: ['d'] } },
133
- { key: 'fifth', value: { source: ['e'] } },
134
- { key: 'sixth', value: { source: ['f'] } },
135
- ]
136
- })
126
+ new sso.CfnInstanceAccessControlAttributeConfiguration(this, 'instanceAccessControlConfig', {
127
+ instanceArn: 'arn:aws:sso:::instance/testvalue',
128
+ accessControlAttributes: [
129
+ { key: 'first', value: { source: ['a'] } },
130
+ { key: 'second', value: { source: ['b'] } },
131
+ { key: 'third', value: { source: ['c'] } },
132
+ { key: 'fourth', value: { source: ['d'] } },
133
+ { key: 'fifth', value: { source: ['e'] } },
134
+ { key: 'sixth', value: { source: ['f'] } },
135
+ ]
136
+ })
137
137
  }
138
138
  }
139
139
 
@@ -270,7 +270,7 @@ class ImportableStack extends cdk.Stack {
270
270
  const bucket = new s3.Bucket(this, 'test-bucket', {
271
271
  removalPolicy: (process.env.RETAIN_SINGLE_BUCKET === '1') ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
272
272
  });
273
-
273
+
274
274
  new cdk.CfnOutput(this, 'BucketLogicalId', {
275
275
  value: bucket.node.defaultChild.logicalId,
276
276
  });
@@ -369,6 +369,16 @@ class OutputsStack extends cdk.Stack {
369
369
  }
370
370
  }
371
371
 
372
+ class TwoSnsTopics extends cdk.Stack {
373
+ constructor(parent, id, props) {
374
+ super(parent, id, props);
375
+
376
+ new sns.Topic(this, 'Topic1');
377
+ new sns.Topic(this, 'Topic2');
378
+
379
+ }
380
+ }
381
+
372
382
  class AnotherOutputsStack extends cdk.Stack {
373
383
  constructor(parent, id, props) {
374
384
  super(parent, id, props);
@@ -471,7 +481,7 @@ class IamRolesStack extends cdk.Stack {
471
481
 
472
482
  // Environment variabile is used to create a bunch of roles to test
473
483
  // that large diff templates are uploaded to S3 to create the changeset.
474
- for(let i = 1; i <= Number(process.env.NUMBER_OF_ROLES) ; i++) {
484
+ for (let i = 1; i <= Number(process.env.NUMBER_OF_ROLES); i++) {
475
485
  const role = new iam.Role(this, `Role${i}`, {
476
486
  assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
477
487
  });
@@ -479,7 +489,7 @@ class IamRolesStack extends cdk.Stack {
479
489
 
480
490
  // For any extra IAM roles created, add a ton of metadata so that the template size is > 50 KiB.
481
491
  if (i > 1) {
482
- for(let i = 1; i <= 30 ; i++) {
492
+ for (let i = 1; i <= 30; i++) {
483
493
  cfnRole.addMetadata('a'.repeat(1000), 'v');
484
494
  }
485
495
  }
@@ -847,6 +857,7 @@ const stackSet = process.env.INTEG_STACK_SET || 'default';
847
857
  switch (stackSet) {
848
858
  case 'default':
849
859
  // Deploy all does a wildcard ${stackPrefix}-test-*
860
+ new TwoSnsTopics(app, `${stackPrefix}-two-sns-topics`);
850
861
  new MyStack(app, `${stackPrefix}-test-1`, { env: defaultEnv });
851
862
  new YourStack(app, `${stackPrefix}-test-2`);
852
863
  new NoticesStack(app, `${stackPrefix}-notices`);
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const lib_1 = require("../../lib");
5
+ (0, lib_1.integTest)('cdk destroy prompts the user for confirmation', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ var _a, _b;
7
+ const stackName = 'test-2';
8
+ const fullStackName = fixture.fullStackName(stackName);
9
+ fixture.log(`Deploying stack ${fullStackName}`);
10
+ await fixture.cdkDeploy(stackName);
11
+ fixture.log(`Destroying stack ${fullStackName} and declining prompt`);
12
+ await fixture.cdkDestroy(stackName, {
13
+ force: false,
14
+ interact: [
15
+ { prompt: /Are you sure you want to delete/, input: 'no' }
16
+ ]
17
+ });
18
+ // assert we didn't destroy the stack
19
+ const stack = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: fullStackName }));
20
+ expect((_b = (_a = stack.Stacks) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0).toEqual(1);
21
+ fixture.log(`Destroying stack ${fullStackName} and accepting prompt`);
22
+ await fixture.cdkDestroy(stackName, {
23
+ force: false,
24
+ interact: [
25
+ { prompt: /Are you sure you want to delete/, input: 'yes' }
26
+ ]
27
+ });
28
+ // assert we did destroy the stack
29
+ await expect(fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: fullStackName })))
30
+ .rejects.toThrow(/does not exist/);
31
+ }));
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlc3Ryb3ktaW50ZXJhY3RpdmUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlc3Ryb3ktaW50ZXJhY3RpdmUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMEVBQXVFO0FBQ3ZFLG1DQUEwRDtBQUUxRCxJQUFBLGVBQVMsRUFBQywrQ0FBK0MsRUFBRSxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTs7SUFFOUYsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzNCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsYUFBYSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDbEMsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUU7WUFDUixFQUFFLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1NBQzNEO0tBQ0YsQ0FBQyxDQUFDO0lBRUgscUNBQXFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksNkNBQXFCLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzVHLE1BQU0sQ0FBQyxNQUFBLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsYUFBYSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDbEMsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUU7WUFDUixFQUFFLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1NBQzVEO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsa0NBQWtDO0lBQ2xDLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLDZDQUFxQixDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFdkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmludGVnVGVzdCgnY2RrIGRlc3Ryb3kgcHJvbXB0cyB0aGUgdXNlciBmb3IgY29uZmlybWF0aW9uJywgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG5cbiAgY29uc3Qgc3RhY2tOYW1lID0gJ3Rlc3QtMic7XG4gIGNvbnN0IGZ1bGxTdGFja05hbWUgPSBmaXh0dXJlLmZ1bGxTdGFja05hbWUoc3RhY2tOYW1lKTtcblxuICBmaXh0dXJlLmxvZyhgRGVwbG95aW5nIHN0YWNrICR7ZnVsbFN0YWNrTmFtZX1gKTtcbiAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koc3RhY2tOYW1lKTtcblxuICBmaXh0dXJlLmxvZyhgRGVzdHJveWluZyBzdGFjayAke2Z1bGxTdGFja05hbWV9IGFuZCBkZWNsaW5pbmcgcHJvbXB0YCk7XG4gIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveShzdGFja05hbWUsIHtcbiAgICBmb3JjZTogZmFsc2UsXG4gICAgaW50ZXJhY3Q6IFtcbiAgICAgIHsgcHJvbXB0OiAvQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZS8sIGlucHV0OiAnbm8nIH1cbiAgICBdXG4gIH0pO1xuXG4gIC8vIGFzc2VydCB3ZSBkaWRuJ3QgZGVzdHJveSB0aGUgc3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBhd2FpdCBmaXh0dXJlLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoeyBTdGFja05hbWU6IGZ1bGxTdGFja05hbWUgfSkpXG4gIGV4cGVjdChzdGFjay5TdGFja3M/Lmxlbmd0aCA/PyAwKS50b0VxdWFsKDEpXG5cbiAgZml4dHVyZS5sb2coYERlc3Ryb3lpbmcgc3RhY2sgJHtmdWxsU3RhY2tOYW1lfSBhbmQgYWNjZXB0aW5nIHByb21wdGApO1xuICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koc3RhY2tOYW1lLCB7XG4gICAgZm9yY2U6IGZhbHNlLFxuICAgIGludGVyYWN0OiBbXG4gICAgICB7IHByb21wdDogL0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUvLCBpbnB1dDogJ3llcycgfVxuICAgIF1cbiAgfSk7XG5cbiAgLy8gYXNzZXJ0IHdlIGRpZCBkZXN0cm95IHRoZSBzdGFja1xuICBhd2FpdCBleHBlY3QoZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChuZXcgRGVzY3JpYmVTdGFja3NDb21tYW5kKHsgU3RhY2tOYW1lOiBmdWxsU3RhY2tOYW1lIH0pKSlcbiAgICAucmVqZWN0cy50b1Rocm93KC9kb2VzIG5vdCBleGlzdC8pO1xuXG59KSk7XG4iXX0=
@@ -0,0 +1,36 @@
1
+ import { DescribeStacksCommand } from '@aws-sdk/client-cloudformation';
2
+ import { integTest, withDefaultFixture } from '../../lib';
3
+
4
+ integTest('cdk destroy prompts the user for confirmation', withDefaultFixture(async (fixture) => {
5
+
6
+ const stackName = 'test-2';
7
+ const fullStackName = fixture.fullStackName(stackName);
8
+
9
+ fixture.log(`Deploying stack ${fullStackName}`);
10
+ await fixture.cdkDeploy(stackName);
11
+
12
+ fixture.log(`Destroying stack ${fullStackName} and declining prompt`);
13
+ await fixture.cdkDestroy(stackName, {
14
+ force: false,
15
+ interact: [
16
+ { prompt: /Are you sure you want to delete/, input: 'no' }
17
+ ]
18
+ });
19
+
20
+ // assert we didn't destroy the stack
21
+ const stack = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: fullStackName }))
22
+ expect(stack.Stacks?.length ?? 0).toEqual(1)
23
+
24
+ fixture.log(`Destroying stack ${fullStackName} and accepting prompt`);
25
+ await fixture.cdkDestroy(stackName, {
26
+ force: false,
27
+ interact: [
28
+ { prompt: /Are you sure you want to delete/, input: 'yes' }
29
+ ]
30
+ });
31
+
32
+ // assert we did destroy the stack
33
+ await expect(fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: fullStackName })))
34
+ .rejects.toThrow(/does not exist/);
35
+
36
+ }));
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const client_sns_1 = require("@aws-sdk/client-sns");
5
+ const lib_1 = require("../../lib");
6
+ (0, lib_1.integTest)('cdk import prompts the user for sns topic arns', (0, lib_1.withDefaultFixture)(async (fixture) => {
7
+ var _a, _b;
8
+ const topicName = (logicalId) => `${logicalId}-${fixture.randomString}`;
9
+ const topicArn = async (name) => `arn:aws:sns:${fixture.aws.region}:${await fixture.aws.account()}:${name}`;
10
+ const topic1Name = topicName('Topic1');
11
+ const topic2Name = topicName('Topic2');
12
+ const topic1Arn = await topicArn(topic1Name);
13
+ const topic2Arn = await topicArn(topic2Name);
14
+ fixture.log(`Creating topic ${topic1Name}`);
15
+ await fixture.aws.sns.send(new client_sns_1.CreateTopicCommand({ Name: topic1Name }));
16
+ fixture.log(`Creating topic ${topic2Name}`);
17
+ await fixture.aws.sns.send(new client_sns_1.CreateTopicCommand({ Name: topic2Name }));
18
+ try {
19
+ const stackName = 'two-sns-topics';
20
+ const fullStackName = fixture.fullStackName(stackName);
21
+ fixture.log(`Importing topics to stack ${fullStackName}`);
22
+ await fixture.cdk(['import', fullStackName], {
23
+ interact: [
24
+ {
25
+ prompt: /\(empty to skip\)/,
26
+ input: topic1Arn,
27
+ },
28
+ {
29
+ prompt: /\(empty to skip\)/,
30
+ input: topic2Arn,
31
+ }
32
+ ]
33
+ });
34
+ // assert the stack now has the two topics
35
+ const stackResources = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStackResourcesCommand({ StackName: fullStackName }));
36
+ const stackTopicArns = new Set((_b = (_a = stackResources.StackResources) === null || _a === void 0 ? void 0 : _a.filter(r => r.ResourceType === 'AWS::SNS::Topic').map(r => r.PhysicalResourceId)) !== null && _b !== void 0 ? _b : []);
37
+ expect(stackTopicArns).toEqual(new Set([topic1Arn, topic2Arn]));
38
+ }
39
+ finally {
40
+ fixture.log(`Deleting topic ${topic1Name}`);
41
+ await fixture.aws.sns.send(new client_sns_1.DeleteTopicCommand({ TopicArn: topic1Arn }));
42
+ fixture.log(`Deleting topic ${topic2Name}`);
43
+ await fixture.aws.sns.send(new client_sns_1.DeleteTopicCommand({ TopicArn: topic2Arn }));
44
+ }
45
+ }));
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWltcG9ydC1pbnRlcmFjdGl2ZS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstaW1wb3J0LWludGVyYWN0aXZlLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUErRTtBQUMvRSxvREFBNkU7QUFDN0UsbUNBQTBEO0FBRTFELElBQUEsZUFBUyxFQUFDLGdEQUFnRCxFQUFFLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFOztJQUUvRixNQUFNLFNBQVMsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNoRixNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUUsQ0FBQyxlQUFlLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFLLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVwSCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSwrQkFBa0IsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLCtCQUFrQixDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUV4RSxJQUFJLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQzNDLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxNQUFNLEVBQUUsbUJBQW1CO29CQUMzQixLQUFLLEVBQUUsU0FBUztpQkFDakI7Z0JBQ0Q7b0JBQ0UsTUFBTSxFQUFFLG1CQUFtQjtvQkFDM0IsS0FBSyxFQUFFLFNBQVM7aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCwwQ0FBMEM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxxREFBNkIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDN0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBQSxNQUFBLGNBQWMsQ0FBQyxjQUFjLDBDQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXRKLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWpFLENBQUM7WUFBUyxDQUFDO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLCtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksK0JBQWtCLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzdFLENBQUM7QUFFSCxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgQ3JlYXRlVG9waWNDb21tYW5kLCBEZWxldGVUb3BpY0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc25zJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KCdjZGsgaW1wb3J0IHByb21wdHMgdGhlIHVzZXIgZm9yIHNucyB0b3BpYyBhcm5zJywgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG5cbiAgY29uc3QgdG9waWNOYW1lID0gKGxvZ2ljYWxJZDogc3RyaW5nKSA9PiBgJHtsb2dpY2FsSWR9LSR7Zml4dHVyZS5yYW5kb21TdHJpbmd9YDtcbiAgY29uc3QgdG9waWNBcm4gPSBhc3luYyAobmFtZTogc3RyaW5nKSA9PiBgYXJuOmF3czpzbnM6JHtmaXh0dXJlLmF3cy5yZWdpb259OiR7IGF3YWl0IGZpeHR1cmUuYXdzLmFjY291bnQoKX06JHtuYW1lfWBcblxuICBjb25zdCB0b3BpYzFOYW1lID0gdG9waWNOYW1lKCdUb3BpYzEnKTtcbiAgY29uc3QgdG9waWMyTmFtZSA9IHRvcGljTmFtZSgnVG9waWMyJyk7XG5cbiAgY29uc3QgdG9waWMxQXJuID0gYXdhaXQgdG9waWNBcm4odG9waWMxTmFtZSk7XG4gIGNvbnN0IHRvcGljMkFybiA9IGF3YWl0IHRvcGljQXJuKHRvcGljMk5hbWUpO1xuXG4gIGZpeHR1cmUubG9nKGBDcmVhdGluZyB0b3BpYyAke3RvcGljMU5hbWV9YCk7XG4gIGF3YWl0IGZpeHR1cmUuYXdzLnNucy5zZW5kKG5ldyBDcmVhdGVUb3BpY0NvbW1hbmQoeyBOYW1lOiB0b3BpYzFOYW1lIH0pKVxuICBmaXh0dXJlLmxvZyhgQ3JlYXRpbmcgdG9waWMgJHt0b3BpYzJOYW1lfWApO1xuICBhd2FpdCBmaXh0dXJlLmF3cy5zbnMuc2VuZChuZXcgQ3JlYXRlVG9waWNDb21tYW5kKHsgTmFtZTogdG9waWMyTmFtZSB9KSlcblxuICB0cnkge1xuXG4gICAgY29uc3Qgc3RhY2tOYW1lID0gJ3R3by1zbnMtdG9waWNzJztcbiAgICBjb25zdCBmdWxsU3RhY2tOYW1lID0gZml4dHVyZS5mdWxsU3RhY2tOYW1lKHN0YWNrTmFtZSk7XG5cbiAgICBmaXh0dXJlLmxvZyhgSW1wb3J0aW5nIHRvcGljcyB0byBzdGFjayAke2Z1bGxTdGFja05hbWV9YCk7XG4gICAgYXdhaXQgZml4dHVyZS5jZGsoWydpbXBvcnQnLCBmdWxsU3RhY2tOYW1lXSwge1xuICAgICAgaW50ZXJhY3Q6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb21wdDogL1xcKGVtcHR5IHRvIHNraXBcXCkvLFxuICAgICAgICAgIGlucHV0OiB0b3BpYzFBcm4sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9tcHQ6IC9cXChlbXB0eSB0byBza2lwXFwpLyxcbiAgICAgICAgICBpbnB1dDogdG9waWMyQXJuLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBhc3NlcnQgdGhlIHN0YWNrIG5vdyBoYXMgdGhlIHR3byB0b3BpY3NcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tSZXNvdXJjZXNDb21tYW5kKHsgU3RhY2tOYW1lOiBmdWxsU3RhY2tOYW1lIH0pKVxuICAgIGNvbnN0IHN0YWNrVG9waWNBcm5zID0gbmV3IFNldChzdGFja1Jlc291cmNlcy5TdGFja1Jlc291cmNlcz8uZmlsdGVyKHIgPT4gci5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OlNOUzo6VG9waWMnKS5tYXAociA9PiByLlBoeXNpY2FsUmVzb3VyY2VJZCkgPz8gW10pO1xuXG4gICAgZXhwZWN0KHN0YWNrVG9waWNBcm5zKS50b0VxdWFsKG5ldyBTZXQoW3RvcGljMUFybiwgdG9waWMyQXJuXSkpXG5cbiAgfSBmaW5hbGx5IHtcbiAgICBmaXh0dXJlLmxvZyhgRGVsZXRpbmcgdG9waWMgJHt0b3BpYzFOYW1lfWApO1xuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnNucy5zZW5kKG5ldyBEZWxldGVUb3BpY0NvbW1hbmQoeyBUb3BpY0FybjogdG9waWMxQXJuIH0pKVxuICAgIGZpeHR1cmUubG9nKGBEZWxldGluZyB0b3BpYyAke3RvcGljMk5hbWV9YCk7XG4gICAgYXdhaXQgZml4dHVyZS5hd3Muc25zLnNlbmQobmV3IERlbGV0ZVRvcGljQ29tbWFuZCh7IFRvcGljQXJuOiB0b3BpYzJBcm4gfSkpXG4gIH1cblxufSkpO1xuIl19
@@ -0,0 +1,53 @@
1
+ import { DescribeStackResourcesCommand } from '@aws-sdk/client-cloudformation';
2
+ import { CreateTopicCommand, DeleteTopicCommand } from '@aws-sdk/client-sns';
3
+ import { integTest, withDefaultFixture } from '../../lib';
4
+
5
+ integTest('cdk import prompts the user for sns topic arns', withDefaultFixture(async (fixture) => {
6
+
7
+ const topicName = (logicalId: string) => `${logicalId}-${fixture.randomString}`;
8
+ const topicArn = async (name: string) => `arn:aws:sns:${fixture.aws.region}:${ await fixture.aws.account()}:${name}`
9
+
10
+ const topic1Name = topicName('Topic1');
11
+ const topic2Name = topicName('Topic2');
12
+
13
+ const topic1Arn = await topicArn(topic1Name);
14
+ const topic2Arn = await topicArn(topic2Name);
15
+
16
+ fixture.log(`Creating topic ${topic1Name}`);
17
+ await fixture.aws.sns.send(new CreateTopicCommand({ Name: topic1Name }))
18
+ fixture.log(`Creating topic ${topic2Name}`);
19
+ await fixture.aws.sns.send(new CreateTopicCommand({ Name: topic2Name }))
20
+
21
+ try {
22
+
23
+ const stackName = 'two-sns-topics';
24
+ const fullStackName = fixture.fullStackName(stackName);
25
+
26
+ fixture.log(`Importing topics to stack ${fullStackName}`);
27
+ await fixture.cdk(['import', fullStackName], {
28
+ interact: [
29
+ {
30
+ prompt: /\(empty to skip\)/,
31
+ input: topic1Arn,
32
+ },
33
+ {
34
+ prompt: /\(empty to skip\)/,
35
+ input: topic2Arn,
36
+ }
37
+ ]
38
+ });
39
+
40
+ // assert the stack now has the two topics
41
+ const stackResources = await fixture.aws.cloudFormation.send(new DescribeStackResourcesCommand({ StackName: fullStackName }))
42
+ const stackTopicArns = new Set(stackResources.StackResources?.filter(r => r.ResourceType === 'AWS::SNS::Topic').map(r => r.PhysicalResourceId) ?? []);
43
+
44
+ expect(stackTopicArns).toEqual(new Set([topic1Arn, topic2Arn]))
45
+
46
+ } finally {
47
+ fixture.log(`Deleting topic ${topic1Name}`);
48
+ await fixture.aws.sns.send(new DeleteTopicCommand({ TopicArn: topic1Arn }))
49
+ fixture.log(`Deleting topic ${topic2Name}`);
50
+ await fixture.aws.sns.send(new DeleteTopicCommand({ TopicArn: topic2Arn }))
51
+ }
52
+
53
+ }));