UNPKG

projen

Version:

CDK for software projects

113 lines • 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IntegrationTest = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const posix_1 = require("path/posix"); const cdk_1 = require("../cdk"); const dependencies_1 = require("../dependencies"); /** * Cloud integration tests. */ class IntegrationTest extends cdk_1.IntegrationTestBase { static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.awscdk.IntegrationTest", version: "0.103.12" }; /** * Destroy the integration test resources */ destroyTask; /** * The watch task. */ watchTask; constructor(project, options) { super(project, options); project.deps.requestDependency({ name: "aws-cdk", version: options.cdkDeps.cdkCliVersion, type: dependencies_1.DependencyType.BUILD, }); project.deps.requestDependency({ name: "ts-node", type: dependencies_1.DependencyType.BUILD, }); const deployDir = (0, posix_1.join)(this.tmpDir, "deploy.cdk.out"); const assertDir = (0, posix_1.join)(this.tmpDir, "assert.cdk.out"); const app = `ts-node -P ${options.tsconfigPath} ${options.entrypoint}`; const opts = [ "--app", app, "--no-notices", "--no-version-reporting", // don't inject cloudformation metadata into template "--no-asset-metadata", ]; const pathMetadata = options.pathMetadata ?? false; if (!pathMetadata) { opts.push("--no-path-metadata"); } // Determine which stacks to deploy const stacks = options.stacks ?? ["**"]; this.deployTask.execArgs(["rm", "-fr", deployDir]); this.deployTask.execArgs([ "cdk", "deploy", ...opts, ...stacks, "--require-approval=never", "-o", deployDir, ]); // if deployment was successful, copy the deploy dir to the expected dir this.deployTask.execArgs(["rm", "-fr", this.snapshotDir]); this.deployTask.execArgs(["mv", deployDir, this.snapshotDir]); this.watchTask = project.addTask(`integ:${this.name}:watch`, { description: `watch integration test '${this.name}' (without updating snapshots)`, execArgs: ["cdk", "watch", ...opts, ...stacks, "-o", deployDir], }); this.destroyTask = project.addTask(`integ:${this.name}:destroy`, { description: `destroy integration test '${this.name}'`, execArgs: [ "cdk", "destroy", "--app", this.snapshotDir, ...stacks, "--no-version-reporting", ], }); const destroyAfterDeploy = options.destroyAfterDeploy ?? true; if (destroyAfterDeploy) { this.deployTask.spawn(this.destroyTask); } this.snapshotTask.execArgs([ "cdk", "synth", "--quiet", ...opts, "-o", this.snapshotDir, ]); const exclude = ["asset.*", "cdk.out", "manifest.json", "tree.json"]; this.assertTask.execArgs([ "cdk", "synth", "--quiet", ...opts, "-o", assertDir, ]); this.assertTask.execArgs([ "diff", "-r", ...exclude.flatMap((x) => ["-x", x]), `${this.snapshotDir}/`, `${assertDir}/`, ]); // do not commit all files we are excluding for (const x of exclude) { project.addGitIgnore(`${this.snapshotDir}/${x}`); project.addGitIgnore(`${this.snapshotDir}/**/${x}`); // nested assemblies } } } exports.IntegrationTest = IntegrationTest; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24tdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3NjZGsvaW50ZWdyYXRpb24tdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsc0NBQWtDO0FBR2xDLGdDQUE2QztBQUM3QyxrREFBaUQ7QUFzQ2pEOztHQUVHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLHlCQUFtQjs7SUFDdEQ7O09BRUc7SUFDYSxXQUFXLENBQU87SUFFbEM7O09BRUc7SUFDYSxTQUFTLENBQU87SUFFaEMsWUFBWSxPQUFnQixFQUFFLE9BQStCO1FBQzNELEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUM3QixJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDdEMsSUFBSSxFQUFFLDZCQUFjLENBQUMsS0FBSztTQUMzQixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzdCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLDZCQUFjLENBQUMsS0FBSztTQUMzQixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxJQUFBLFlBQUksRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBQSxZQUFJLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLGNBQWMsT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFdkUsTUFBTSxJQUFJLEdBQUc7WUFDWCxPQUFPO1lBQ1AsR0FBRztZQUNILGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIscURBQXFEO1lBQ3JELHFCQUFxQjtTQUN0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QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtRQUMzRSxDQUFDO0lBQ0gsQ0FBQzs7QUFuSEgsMENBb0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgdHlwZSB7IEF3c0Nka0RlcHMgfSBmcm9tIFwiLi9hd3NjZGstZGVwc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ3JhdGlvblRlc3RCYXNlT3B0aW9ucyB9IGZyb20gXCIuLi9jZGtcIjtcbmltcG9ydCB7IEludGVncmF0aW9uVGVzdEJhc2UgfSBmcm9tIFwiLi4vY2RrXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5VHlwZSB9IGZyb20gXCIuLi9kZXBlbmRlbmNpZXNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tIFwiLi4vdGFza1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdENvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogRGVzdHJveSB0aGUgdGVzdCBhcHAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRlcGxveW1lbnQuIElmIGRpc2FibGVkLCBsZWF2ZXMgdGhlXG4gICAqIGFwcCBkZXBsb3llZCBpbiB0aGUgZGV2IGFjY291bnQuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGRlc3Ryb3lBZnRlckRlcGxveT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgcGF0aCBtZXRhZGF0YSwgYWRkaW5nIGBhd3M6Y2RrOnBhdGhgLCB3aXRoIHRoZSBkZWZpbmluZyBjb25zdHJ1Y3Qnc1xuICAgKiBwYXRoLCB0byB0aGUgQ2xvdWRGb3JtYXRpb24gbWV0YWRhdGEgZm9yIGVhY2ggc3ludGhlc2l6ZWQgcmVzb3VyY2UuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwYXRoTWV0YWRhdGE/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBJbnRlZ3JhdGlvblRlc3RgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdE9wdGlvbnNcbiAgZXh0ZW5kcyBJbnRlZ3JhdGlvblRlc3RDb21tb25PcHRpb25zLCBJbnRlZ3JhdGlvblRlc3RCYXNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2Ygc3RhY2tzIHdpdGhpbiB0aGUgaW50ZWdyYXRpb24gdGVzdCB0byBkZXBsb3kvZGVzdHJveS5cbiAgICpcbiAgICogQGRlZmF1bHQgW1wiKipcIl1cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBV1MgQ0RLIGRlcGVuZGVuY3kgbWFuYWdlci5cbiAgICovXG4gIHJlYWRvbmx5IGNka0RlcHM6IEF3c0Nka0RlcHM7XG59XG5cbi8qKlxuICogQ2xvdWQgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ3JhdGlvblRlc3QgZXh0ZW5kcyBJbnRlZ3JhdGlvblRlc3RCYXNlIHtcbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGludGVncmF0aW9uIHRlc3QgcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzdHJveVRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIFRoZSB3YXRjaCB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdhdGNoVGFzazogVGFzaztcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBJbnRlZ3JhdGlvblRlc3RPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgb3B0aW9ucyk7XG5cbiAgICBwcm9qZWN0LmRlcHMucmVxdWVzdERlcGVuZGVuY3koe1xuICAgICAgbmFtZTogXCJhd3MtY2RrXCIsXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLmNka0RlcHMuY2RrQ2xpVmVyc2lvbixcbiAgICAgIHR5cGU6IERlcGVuZGVuY3lUeXBlLkJVSUxELFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5kZXBzLnJlcXVlc3REZXBlbmRlbmN5KHtcbiAgICAgIG5hbWU6IFwidHMtbm9kZVwiLFxuICAgICAgdHlwZTogRGVwZW5kZW5jeVR5cGUuQlVJTEQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZXBsb3lEaXIgPSBqb2luKHRoaXMudG1wRGlyLCBcImRlcGxveS5jZGsub3V0XCIpO1xuICAgIGNvbnN0IGFzc2VydERpciA9IGpvaW4odGhpcy50bXBEaXIsIFwiYXNzZXJ0LmNkay5vdXRcIik7XG4gICAgY29uc3QgYXBwID0gYHRzLW5vZGUgLVAgJHtvcHRpb25zLnRzY29uZmlnUGF0aH0gJHtvcHRpb25zLmVudHJ5cG9pbnR9YDtcblxuICAgIGNvbnN0IG9wdHMgPSBbXG4gICAgICBcIi0tYXBwXCIsXG4gICAgICBhcHAsXG4gICAgICBcIi0tbm8tbm90aWNlc1wiLFxuICAgICAgXCItLW5vLXZlcnNpb24tcmVwb3J0aW5nXCIsXG4gICAgICAvLyBkb24ndCBpbmplY3QgY2xvdWRmb3JtYXRpb24gbWV0YWRhdGEgaW50byB0ZW1wbGF0ZVxuICAgICAgXCItLW5vLWFzc2V0LW1ldGFkYXRhXCIsXG4gICAgXTtcblxuICAgIGNvbnN0IHBhdGhNZXRhZGF0YSA9IG9wdGlvbnMucGF0aE1ldGFkYXRhID8/IGZhbHNlO1xuICAgIGlmICghcGF0aE1ldGFkYXRhKSB7XG4gICAgICBvcHRzLnB1c2goXCItLW5vLXBhdGgtbWV0YWRhdGFcIik7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHN0YWNrcyB0byBkZXBsb3lcbiAgICBjb25zdCBzdGFja3MgPSBvcHRpb25zLnN0YWNrcyA/PyBbXCIqKlwiXTtcblxuICAgIHRoaXMuZGVwbG95VGFzay5leGVjQXJncyhbXCJybVwiLCBcIi1mclwiLCBkZXBsb3lEaXJdKTtcbiAgICB0aGlzLmRlcGxveVRhc2suZXhlY0FyZ3MoW1xuICAgICAgXCJjZGtcIixcbiAgICAgIFwiZGVwbG95XCIsXG4gICAgICAuLi5vcHRzLFxuICAgICAgLi4uc3RhY2tzLFxuICAgICAgXCItLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXJcIixcbiAgICAgIFwiLW9cIixcbiAgICAgIGRlcGxveURpcixcbiAgICBdKTtcblxuICAgIC8vIGlmIGRlcGxveW1lbnQgd2FzIHN1Y2Nlc3NmdWwsIGNvcHkgdGhlIGRlcGxveSBkaXIgdG8gdGhlIGV4cGVjdGVkIGRpclxuICAgIHRoaXMuZGVwbG95VGFzay5leGVjQXJncyhbXCJybVwiLCBcIi1mclwiLCB0aGlzLnNuYXBzaG90RGlyXSk7XG4gICAgdGhpcy5kZXBsb3lUYXNrLmV4ZWNBcmdzKFtcIm12XCIsIGRlcGxveURpciwgdGhpcy5zbmFwc2hvdERpcl0pO1xuXG4gICAgdGhpcy53YXRjaFRhc2sgPSBwcm9qZWN0LmFkZFRhc2soYGludGVnOiR7dGhpcy5uYW1lfTp3YXRjaGAsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgd2F0Y2ggaW50ZWdyYXRpb24gdGVzdCAnJHt0aGlzLm5hbWV9JyAod2l0aG91dCB1cGRhdGluZyBzbmFwc2hvdHMpYCxcbiAgICAgIGV4ZWNBcmdzOiBbXCJjZGtcIiwgXCJ3YXRjaFwiLCAuLi5vcHRzLCAuLi5zdGFja3MsIFwiLW9cIiwgZGVwbG95RGlyXSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVzdHJveVRhc2sgPSBwcm9qZWN0LmFkZFRhc2soYGludGVnOiR7dGhpcy5uYW1lfTpkZXN0cm95YCwge1xuICAgICAgZGVzY3JpcHRpb246IGBkZXN0cm95IGludGVncmF0aW9uIHRlc3QgJyR7dGhpcy5uYW1lfSdgLFxuICAgICAgZXhlY0FyZ3M6IFtcbiAgICAgICAgXCJjZGtcIixcbiAgICAgICAgXCJkZXN0cm95XCIsXG4gICAgICAgIFwiLS1hcHBcIixcbiAgICAgICAgdGhpcy5zbmFwc2hvdERpcixcbiAgICAgICAgLi4uc3RhY2tzLFxuICAgICAgICBcIi0tbm8tdmVyc2lvbi1yZXBvcnRpbmdcIixcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZXN0cm95QWZ0ZXJEZXBsb3kgPSBvcHRpb25zLmRlc3Ryb3lBZnRlckRlcGxveSA/PyB0cnVlO1xuICAgIGlmIChkZXN0cm95QWZ0ZXJEZXBsb3kpIHtcbiAgICAgIHRoaXMuZGVwbG95VGFzay5zcGF3bih0aGlzLmRlc3Ryb3lUYXNrKTtcbiAgICB9XG5cbiAgICB0aGlzLnNuYXBzaG90VGFzay5leGVjQXJncyhbXG4gICAgICBcImNka1wiLFxuICAgICAgXCJzeW50aFwiLFxuICAgICAgXCItLXF1aWV0XCIsXG4gICAgICAuLi5vcHRzLFxuICAgICAgXCItb1wiLFxuICAgICAgdGhpcy5zbmFwc2hvdERpcixcbiAgICBdKTtcblxuICAgIGNvbnN0IGV4Y2x1ZGUgPSBbXCJhc3NldC4qXCIsIFwiY2RrLm91dFwiLCBcIm1hbmlmZXN0Lmpzb25cIiwgXCJ0cmVlLmpzb25cIl07XG5cbiAgICB0aGlzLmFzc2VydFRhc2suZXhlY0FyZ3MoW1xuICAgICAgXCJjZGtcIixcbiAgICAgIFwic3ludGhcIixcbiAgICAgIFwiLS1xdWlldFwiLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIFwiLW9cIixcbiAgICAgIGFzc2VydERpcixcbiAgICBdKTtcbiAgICB0aGlzLmFzc2VydFRhc2suZXhlY0FyZ3MoW1xuICAgICAgXCJkaWZmXCIsXG4gICAgICBcIi1yXCIsXG4gICAgICAuLi5leGNsdWRlLmZsYXRNYXAoKHgpID0+IFtcIi14XCIsIHhdKSxcbiAgICAgIGAke3RoaXMuc25hcHNob3REaXJ9L2AsXG4gICAgICBgJHthc3NlcnREaXJ9L2AsXG4gICAgXSk7XG5cbiAgICAvLyBkbyBub3QgY29tbWl0IGFsbCBmaWxlcyB3ZSBhcmUgZXhjbHVkaW5nXG4gICAgZm9yIChjb25zdCB4IG9mIGV4Y2x1ZGUpIHtcbiAgICAgIHByb2plY3QuYWRkR2l0SWdub3JlKGAke3RoaXMuc25hcHNob3REaXJ9LyR7eH1gKTtcbiAgICAgIHByb2plY3QuYWRkR2l0SWdub3JlKGAke3RoaXMuc25hcHNob3REaXJ9LyoqLyR7eH1gKTsgLy8gbmVzdGVkIGFzc2VtYmxpZXNcbiAgICB9XG4gIH1cbn1cbiJdfQ==