@aws-cdk-testing/cli-integ
Version:
Integration tests for the AWS CDK CLI
72 lines • 11.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
const yaml = require("yaml");
const lib_1 = require("../../../lib");
(0, lib_1.integTest)('cdk orphan detaches a resource from the stack without deleting it', (0, lib_1.withDefaultFixture)(async (fixture) => {
const stackName = fixture.fullStackName('orphanable');
// Deploy the stack with a DynamoDB table + Lambda consumer
await fixture.cdkDeploy('orphanable');
// Get outputs
const describeResponse = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: stackName }));
const outputs = describeResponse.Stacks?.[0]?.Outputs ?? [];
const tableName = outputs.find((o) => o.OutputKey === 'TableName')?.OutputValue;
expect(tableName).toBeDefined();
try {
// Verify the table resource exists in the template before orphaning
const templateBefore = await fixture.aws.cloudFormation.send(new client_cloudformation_1.GetTemplateCommand({ StackName: stackName }));
const templateBodyBefore = yaml.parse(templateBefore.TemplateBody);
expect(templateBodyBefore.Resources).toHaveProperty('MyTable794EDED1');
// Put an item in the table before orphan
await fixture.aws.dynamoDb.putItem({
TableName: tableName,
Item: { PK: { S: 'before-orphan' } },
});
// Orphan the table
const orphanOutput = await fixture.cdk([
'orphan',
`${stackName}/MyTable`,
'--unstable=orphan',
'--yes',
]);
// Verify the output contains a resource mapping for import
expect(orphanOutput).toContain('resource-mapping-inline');
expect(orphanOutput).toContain('TableName');
// Verify the template after orphan: table gone, Lambda env vars replaced with literals
const templateAfter = await fixture.aws.cloudFormation.send(new client_cloudformation_1.GetTemplateCommand({ StackName: stackName }));
const templateBody = yaml.parse(templateAfter.TemplateBody);
expect(templateBody.Resources).not.toHaveProperty('MyTable794EDED1');
expect(templateBody).toMatchObject({
Resources: expect.objectContaining({
Consumer8D6BE417: expect.objectContaining({
Type: 'AWS::Lambda::Function',
Properties: expect.objectContaining({
Environment: {
Variables: {
TABLE_NAME: expect.stringContaining('MyTable'),
TABLE_ARN: expect.stringContaining('arn:aws:dynamodb'),
},
},
}),
}),
}),
});
// Verify the table still exists and data is intact (strongly consistent read)
const getItemResult = await fixture.aws.dynamoDb.getItem({
TableName: tableName,
Key: { PK: { S: 'before-orphan' } },
ConsistentRead: true,
});
expect(getItemResult.Item?.PK?.S).toBe('before-orphan');
}
finally {
// Clean up the retained table to avoid leaking resources
try {
await fixture.aws.dynamoDb.deleteTable({ TableName: tableName });
}
catch (e) {
// Ignore
}
}
}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW9ycGhhbi1kZXRhY2hlcy1yZXNvdXJjZS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstb3JwaGFuLWRldGFjaGVzLXJlc291cmNlLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUEyRjtBQUMzRiw2QkFBNkI7QUFDN0Isc0NBQTZEO0FBRTdELElBQUEsZUFBUyxFQUNQLG1FQUFtRSxFQUNuRSxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXRELDJEQUEyRDtJQUMzRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFdEMsY0FBYztJQUNkLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzVELElBQUksNkNBQXFCLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDcEQsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUM7SUFDaEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWhDLElBQUksQ0FBQztRQUNILG9FQUFvRTtRQUNwRSxNQUFNLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDMUQsSUFBSSwwQ0FBa0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVB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bW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIG9ycGhhbiBkZXRhY2hlcyBhIHJlc291cmNlIGZyb20gdGhlIHN0YWNrIHdpdGhvdXQgZGVsZXRpbmcgaXQnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ29ycGhhbmFibGUnKTtcblxuICAgIC8vIERlcGxveSB0aGUgc3RhY2sgd2l0aCBhIER5bmFtb0RCIHRhYmxlICsgTGFtYmRhIGNvbnN1bWVyXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ29ycGhhbmFibGUnKTtcblxuICAgIC8vIEdldCBvdXRwdXRzXG4gICAgY29uc3QgZGVzY3JpYmVSZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQoXG4gICAgICBuZXcgRGVzY3JpYmVTdGFja3NDb21tYW5kKHsgU3RhY2tOYW1lOiBzdGFja05hbWUgfSksXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRzID0gZGVzY3JpYmVSZXNwb25zZS5TdGFja3M/LlswXT8uT3V0cHV0cyA/PyBbXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBvdXRwdXRzLmZpbmQoKG8pID0+IG8uT3V0cHV0S2V5ID09PSAnVGFibGVOYW1lJyk/Lk91dHB1dFZhbHVlO1xuICAgIGV4cGVjdCh0YWJsZU5hbWUpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHRoZSB0YWJsZSByZXNvdXJjZSBleGlzdHMgaW4gdGhlIHRlbXBsYXRlIGJlZm9yZSBvcnBoYW5pbmdcbiAgICAgIGNvbnN0IHRlbXBsYXRlQmVmb3JlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgICAgbmV3IEdldFRlbXBsYXRlQ29tbWFuZCh7IFN0YWNrTmFtZTogc3RhY2tOYW1lIH0pLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlQm9keUJlZm9yZSA9IHlhbWwucGFyc2UodGVtcGxhdGVCZWZvcmUuVGVtcGxhdGVCb2R5ISk7XG4gICAgICBleHBlY3QodGVtcGxhdGVCb2R5QmVmb3JlLlJlc291cmNlcykudG9IYXZlUHJvcGVydHkoJ015VGFibGU3OTRFREVEMScpO1xuXG4gICAgICAvLyBQdXQgYW4gaXRlbSBpbiB0aGUgdGFibGUgYmVmb3JlIG9ycGhhblxuICAgICAgYXdhaXQgZml4dHVyZS5hd3MuZHluYW1vRGIucHV0SXRlbSh7XG4gICAgICAgIFRhYmxlTmFtZTogdGFibGVOYW1lISxcbiAgICAgICAgSXRlbTogeyBQSzogeyBTOiAnYmVmb3JlLW9ycGhhbicgfSB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE9ycGhhbiB0aGUgdGFibGVcbiAgICAgIGNvbnN0IG9ycGhhbk91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFtcbiAgICAgICAgJ29ycGhhbicsXG4gICAgICAgIGAke3N0YWNrTmFtZX0vTXlUYWJsZWAsXG4gICAgICAgICctLXVuc3RhYmxlPW9ycGhhbicsXG4gICAgICAgICctLXllcycsXG4gICAgICBdKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBvdXRwdXQgY29udGFpbnMgYSByZXNvdXJjZSBtYXBwaW5nIGZvciBpbXBvcnRcbiAgICAgIGV4cGVjdChvcnBoYW5PdXRwdXQpLnRvQ29udGFpbigncmVzb3VyY2UtbWFwcGluZy1pbmxpbmUnKTtcbiAgICAgIGV4cGVjdChvcnBoYW5PdXRwdXQpLnRvQ29udGFpbignVGFibGVOYW1lJyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdGVtcGxhdGUgYWZ0ZXIgb3JwaGFuOiB0YWJsZSBnb25lLCBMYW1iZGEgZW52IHZhcnMgcmVwbGFjZWQgd2l0aCBsaXRlcmFsc1xuICAgICAgY29uc3QgdGVtcGxhdGVBZnRlciA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQoXG4gICAgICAgIG5ldyBHZXRUZW1wbGF0ZUNvbW1hbmQoeyBTdGFja05hbWU6IHN0YWNrTmFtZSB9KSxcbiAgICAgICk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUJvZHkgPSB5YW1sLnBhcnNlKHRlbXBsYXRlQWZ0ZXIuVGVtcGxhdGVCb2R5ISk7XG5cbiAgICAgIGV4cGVjdCh0ZW1wbGF0ZUJvZHkuUmVzb3VyY2VzKS5ub3QudG9IYXZlUHJvcGVydHkoJ015VGFibGU3OTRFREVEMScpO1xuICAgICAgZXhwZWN0KHRlbXBsYXRlQm9keSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIFJlc291cmNlczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIENvbnN1bWVyOEQ2QkU0MTc6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICAgICAgUHJvcGVydGllczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIFZhcmlhYmxlczoge1xuICAgICAgICAgICAgICAgICAgVEFCTEVfTkFNRTogZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ015VGFibGUnKSxcbiAgICAgICAgICAgICAgICAgIFRBQkxFX0FSTjogZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ2Fybjphd3M6ZHluYW1vZGInKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdGFibGUgc3RpbGwgZXhpc3RzIGFuZCBkYXRhIGlzIGludGFjdCAoc3Ryb25nbHkgY29uc2lzdGVudCByZWFkKVxuICAgICAgY29uc3QgZ2V0SXRlbVJlc3VsdCA9IGF3YWl0IGZpeHR1cmUuYXdzLmR5bmFtb0RiLmdldEl0ZW0oe1xuICAgICAgICBUYWJsZU5hbWU6IHRhYmxlTmFtZSEsXG4gICAgICAgIEtleTogeyBQSzogeyBTOiAnYmVmb3JlLW9ycGhhbicgfSB9LFxuICAgICAgICBDb25zaXN0ZW50UmVhZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEl0ZW1SZXN1bHQuSXRlbT8uUEs/LlMpLnRvQmUoJ2JlZm9yZS1vcnBoYW4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gQ2xlYW4gdXAgdGhlIHJldGFpbmVkIHRhYmxlIHRvIGF2b2lkIGxlYWtpbmcgcmVzb3VyY2VzXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmF3cy5keW5hbW9EYi5kZWxldGVUYWJsZSh7IFRhYmxlTmFtZTogdGFibGVOYW1lISB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9XG4gICAgfVxuICB9KSxcbik7XG4iXX0=