UNPKG

@aws-cdk/integ-tests-alpha

Version:

CDK Integration Testing Constructs

105 lines 14.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeployAssert = void 0; const core_1 = require("aws-cdk-lib/core"); const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal"); const constructs_1 = require("constructs"); const assertions_1 = require("../assertions"); const http_call_1 = require("../http-call"); const hash_1 = require("../private/hash"); const sdk_1 = require("../sdk"); const DEPLOY_ASSERT_SYMBOL = Symbol.for('@aws-cdk/integ-tests.DeployAssert'); /** * Construct that allows for registering a list of assertions * that should be performed on a construct */ class DeployAssert extends constructs_1.Construct { /** * Returns whether the construct is a DeployAssert construct */ static isDeployAssert(x) { return x !== null && typeof (x) === 'object' && DEPLOY_ASSERT_SYMBOL in x; } /** * Finds a DeployAssert construct in the given scope */ static of(construct) { const scopes = constructs_1.Node.of(constructs_1.Node.of(construct).root).findAll(); const deployAssert = scopes.find(s => DeployAssert.isDeployAssert(s)); if (!deployAssert) { throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `DeployAssertNotFound`, 'No DeployAssert construct found in scopes'); } return deployAssert; } scope; assertionIdCounts = new Map(); _providerLogLevel; constructor(scope, props) { super(scope, 'Default'); this.scope = props?.stack ?? new core_1.Stack(scope, 'DeployAssert'); this._providerLogLevel = props?.providerLogLevel; Object.defineProperty(this, DEPLOY_ASSERT_SYMBOL, { value: true }); } awsApiCall(service, api, parameters, outputPaths) { let hash = ''; try { hash = (0, hash_1.md5hash)(this.scope.resolve(parameters)); } catch { } return new sdk_1.AwsApiCall(this.scope, this.uniqueAssertionId(`AwsApiCall${service}${api}${hash}`), { api, service, parameters, outputPaths, providerLogLevel: this._providerLogLevel, }); } httpApiCall(url, options) { let hash = ''; try { hash = (0, hash_1.md5hash)(this.scope.resolve({ url, options, })); } catch { } let append = ''; if (!core_1.Token.isUnresolved(url)) { const parsedUrl = new URL(url); append = `${parsedUrl.hostname}${parsedUrl.pathname}`; } return new http_call_1.HttpApiCall(this.scope, this.uniqueAssertionId(`HttpApiCall${append}${hash}`), { url, fetchOptions: options, providerLogLevel: this._providerLogLevel, }); } invokeFunction(props) { const hash = (0, hash_1.md5hash)(this.scope.resolve(props)); return new sdk_1.LambdaInvokeFunction(this.scope, this.uniqueAssertionId(`LambdaInvoke${hash}`), props); } expect(id, expected, actual) { new assertions_1.EqualsAssertion(this.scope, `EqualsAssertion${id}`, { expected, actual, providerLogLevel: this._providerLogLevel, }); } /** * Gets a unique logical id based on a proposed assertion id. */ uniqueAssertionId(id) { const count = this.assertionIdCounts.get(id); if (count === undefined) { // If we've never seen this id before, we'll return the id unchanged // to maintain backward compatibility. this.assertionIdCounts.set(id, 1); return id; } // Otherwise, we'll increment the counter and return a unique id. this.assertionIdCounts.set(id, count + 1); return `${id}${count}`; } } exports.DeployAssert = DeployAssert; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LWFzc2VydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlcGxveS1hc3NlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXlFO0FBQ3pFLDRFQUE0RDtBQUU1RCwyQ0FBNkM7QUFFN0MsOENBQWdEO0FBRWhELDRDQUEwRDtBQUMxRCwwQ0FBMEM7QUFHMUMsZ0NBQTBEO0FBRzFELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBZTdFOzs7R0FHRztBQUNILE1BQWEsWUFBYSxTQUFRLHNCQUFTO0lBQ3pDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFNO1FBQ2pDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLG9CQUFvQixJQUFJLENBQUMsQ0FBQztLQUMzRTtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFxQjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksOEJBQXVCLENBQUMsSUFBQSxzQkFBRyxFQUFBLHNCQUFzQixFQUFFLDJDQUEyQyxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUNELE9BQU8sWUFBNEIsQ0FBQztLQUNyQztJQUVNLEtBQUssQ0FBUTtJQUNaLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3JDLGlCQUFpQixDQUF1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SSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixvRUFBb0U7WUFDcEUsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztLQUN4QjtDQUNGO0FBbkdELG9DQW1HQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXBwbGljYXRpb25Mb2dMZXZlbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgU3RhY2ssIFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENvbnN0cnVjdCwgTm9kZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQXBpQ2FsbCB9IGZyb20gJy4uL2FwaS1jYWxsLWJhc2UnO1xuaW1wb3J0IHsgRXF1YWxzQXNzZXJ0aW9uIH0gZnJvbSAnLi4vYXNzZXJ0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IEFjdHVhbFJlc3VsdCwgRXhwZWN0ZWRSZXN1bHQgfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgSHR0cEFwaUNhbGwgYXMgSHR0cEFwaUNhbGwgfSBmcm9tICcuLi9odHRwLWNhbGwnO1xuaW1wb3J0IHsgbWQ1aGFzaCB9IGZyb20gJy4uL3ByaXZhdGUvaGFzaCc7XG5pbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucywgUHJvdmlkZXJPcHRpb25zIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhSW52b2tlRnVuY3Rpb25Qcm9wcyB9IGZyb20gJy4uL3Nkayc7XG5pbXBvcnQgeyBBd3NBcGlDYWxsLCBMYW1iZGFJbnZva2VGdW5jdGlvbiB9IGZyb20gJy4uL3Nkayc7XG5pbXBvcnQgdHlwZSB7IElEZXBsb3lBc3NlcnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IERFUExPWV9BU1NFUlRfU1lNQk9MID0gU3ltYm9sLmZvcignQGF3cy1jZGsvaW50ZWctdGVzdHMuRGVwbG95QXNzZXJ0Jyk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgRGVwbG95QXNzZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95QXNzZXJ0UHJvcHMgZXh0ZW5kcyBQcm92aWRlck9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBBIHN0YWNrIHRvIHVzZSBmb3IgYXNzZXJ0aW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgc3RhY2sgaXMgY3JlYXRlZCBmb3IgeW91XG4gICAqL1xuICByZWFkb25seSBzdGFjaz86IFN0YWNrO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCB0aGF0IGFsbG93cyBmb3IgcmVnaXN0ZXJpbmcgYSBsaXN0IG9mIGFzc2VydGlvbnNcbiAqIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBhIGNvbnN0cnVjdFxuICovXG5leHBvcnQgY2xhc3MgRGVwbG95QXNzZXJ0IGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSURlcGxveUFzc2VydCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnN0cnVjdCBpcyBhIERlcGxveUFzc2VydCBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNEZXBsb3lBc3NlcnQoeDogYW55KTogeCBpcyBEZXBsb3lBc3NlcnQge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiAoeCkgPT09ICdvYmplY3QnICYmIERFUExPWV9BU1NFUlRfU1lNQk9MIGluIHg7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBEZXBsb3lBc3NlcnQgY29uc3RydWN0IGluIHRoZSBnaXZlbiBzY29wZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpOiBEZXBsb3lBc3NlcnQge1xuICAgIGNvbnN0IHNjb3BlcyA9IE5vZGUub2YoTm9kZS5vZihjb25zdHJ1Y3QpLnJvb3QpLmZpbmRBbGwoKTtcbiAgICBjb25zdCBkZXBsb3lBc3NlcnQgPSBzY29wZXMuZmluZChzID0+IERlcGxveUFzc2VydC5pc0RlcGxveUFzc2VydChzKSk7XG4gICAgaWYgKCFkZXBsb3lBc3NlcnQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRGVwbG95QXNzZXJ0Tm90Rm91bmRgLCAnTm8gRGVwbG95QXNzZXJ0IGNvbnN0cnVjdCBmb3VuZCBpbiBzY29wZXMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlcGxveUFzc2VydCBhcyBEZXBsb3lBc3NlcnQ7XG4gIH1cblxuICBwdWJsaWMgc2NvcGU6IFN0YWNrO1xuICBwcml2YXRlIGFzc2VydGlvbklkQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvdmlkZXJMb2dMZXZlbD86IEFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM/OiBEZXBsb3lBc3NlcnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCAnRGVmYXVsdCcpO1xuXG4gICAgdGhpcy5zY29wZSA9IHByb3BzPy5zdGFjayA/PyBuZXcgU3RhY2soc2NvcGUsICdEZXBsb3lBc3NlcnQnKTtcbiAgICB0aGlzLl9wcm92aWRlckxvZ0xldmVsID0gcHJvcHM/LnByb3ZpZGVyTG9nTGV2ZWw7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgREVQTE9ZX0FTU0VSVF9TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG4gIH1cblxuICBwdWJsaWMgYXdzQXBpQ2FsbChzZXJ2aWNlOiBzdHJpbmcsIGFwaTogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55LCBvdXRwdXRQYXRocz86IHN0cmluZ1tdKTogSUFwaUNhbGwge1xuICAgIGxldCBoYXNoID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSBtZDVoYXNoKHRoaXMuc2NvcGUucmVzb2x2ZShwYXJhbWV0ZXJzKSk7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgcmV0dXJuIG5ldyBBd3NBcGlDYWxsKHRoaXMuc2NvcGUsIHRoaXMudW5pcXVlQXNzZXJ0aW9uSWQoYEF3c0FwaUNhbGwke3NlcnZpY2V9JHthcGl9JHtoYXNofWApLCB7XG4gICAgICBhcGksXG4gICAgICBzZXJ2aWNlLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICAgIG91dHB1dFBhdGhzLFxuICAgICAgcHJvdmlkZXJMb2dMZXZlbDogdGhpcy5fcHJvdmlkZXJMb2dMZXZlbCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBodHRwQXBpQ2FsbCh1cmw6IHN0cmluZywgb3B0aW9ucz86IEZldGNoT3B0aW9ucyk6IElBcGlDYWxsIHtcbiAgICBsZXQgaGFzaCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gbWQ1aGFzaCh0aGlzLnNjb3BlLnJlc29sdmUoe1xuICAgICAgICB1cmwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgbGV0IGFwcGVuZCA9ICcnO1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHVybCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGFwcGVuZCA9IGAke3BhcnNlZFVybC5ob3N0bmFtZX0ke3BhcnNlZFVybC5wYXRobmFtZX1gO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBBcGlDYWxsKHRoaXMuc2NvcGUsIHRoaXMudW5pcXVlQXNzZXJ0aW9uSWQoYEh0dHBBcGlDYWxsJHthcHBlbmR9JHtoYXNofWApLCB7XG4gICAgICB1cmwsXG4gICAgICBmZXRjaE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBwcm92aWRlckxvZ0xldmVsOiB0aGlzLl9wcm92aWRlckxvZ0xldmVsLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGludm9rZUZ1bmN0aW9uKHByb3BzOiBMYW1iZGFJbnZva2VGdW5jdGlvblByb3BzKTogSUFwaUNhbGwge1xuICAgIGNvbnN0IGhhc2ggPSBtZDVoYXNoKHRoaXMuc2NvcGUucmVzb2x2ZShwcm9wcykpO1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlRnVuY3Rpb24odGhpcy5zY29wZSwgdGhpcy51bmlxdWVBc3NlcnRpb25JZChgTGFtYmRhSW52b2tlJHtoYXNofWApLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgZXhwZWN0KGlkOiBzdHJpbmcsIGV4cGVjdGVkOiBFeHBlY3RlZFJlc3VsdCwgYWN0dWFsOiBBY3R1YWxSZXN1bHQpOiB2b2lkIHtcbiAgICBuZXcgRXF1YWxzQXNzZXJ0aW9uKHRoaXMuc2NvcGUsIGBFcXVhbHNBc3NlcnRpb24ke2lkfWAsIHtcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgYWN0dWFsLFxuICAgICAgcHJvdmlkZXJMb2dMZXZlbDogdGhpcy5fcHJvdmlkZXJMb2dMZXZlbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdW5pcXVlIGxvZ2ljYWwgaWQgYmFzZWQgb24gYSBwcm9wb3NlZCBhc3NlcnRpb24gaWQuXG4gICAqL1xuICBwcml2YXRlIHVuaXF1ZUFzc2VydGlvbklkKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5hc3NlcnRpb25JZENvdW50cy5nZXQoaWQpO1xuXG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHdlJ3ZlIG5ldmVyIHNlZW4gdGhpcyBpZCBiZWZvcmUsIHdlJ2xsIHJldHVybiB0aGUgaWQgdW5jaGFuZ2VkXG4gICAgICAvLyB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgICAgdGhpcy5hc3NlcnRpb25JZENvdW50cy5zZXQoaWQsIDEpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgaW5jcmVtZW50IHRoZSBjb3VudGVyIGFuZCByZXR1cm4gYSB1bmlxdWUgaWQuXG4gICAgdGhpcy5hc3NlcnRpb25JZENvdW50cy5zZXQoaWQsIGNvdW50ICsgMSk7XG4gICAgcmV0dXJuIGAke2lkfSR7Y291bnR9YDtcbiAgfVxufVxuIl19