diff --git a/packages/@aws-cdk/core/lib/cfn-resource.ts b/packages/@aws-cdk/core/lib/cfn-resource.ts index edb7d3f87a8ea..31dc062f5ce43 100644 --- a/packages/@aws-cdk/core/lib/cfn-resource.ts +++ b/packages/@aws-cdk/core/lib/cfn-resource.ts @@ -230,7 +230,8 @@ export class CfnResource extends CfnRefElement { Metadata: ignoreEmpty(this.cfnOptions.metadata), Condition: this.cfnOptions.condition && this.cfnOptions.condition.logicalId }, props => { - props.Properties = this.renderProperties(props.Properties); + const renderedProps = this.renderProperties(props.Properties || {}); + props.Properties = renderedProps && (Object.values(renderedProps).find(v => !!v) ? renderedProps : undefined); return deepMerge(props, this.rawOverrides); }) } diff --git a/packages/@aws-cdk/core/test/test.cfn-resource.ts b/packages/@aws-cdk/core/test/test.cfn-resource.ts new file mode 100644 index 0000000000000..db83634ecccd3 --- /dev/null +++ b/packages/@aws-cdk/core/test/test.cfn-resource.ts @@ -0,0 +1,29 @@ +import nodeunit = require('nodeunit'); +import core = require('../lib'); + +export = nodeunit.testCase({ + '._toCloudFormation': { + 'does not call renderProperties with an undefined value'(test: nodeunit.Test) { + const app = new core.App(); + const stack = new core.Stack(app, 'TestStack'); + const resource = new core.CfnResource(stack, 'DefaultResource', { type: 'Test::Resource::Fake' }); + + let called = false; + (resource as any).renderProperties = (val: any) => { + called = true; + test.notEqual(val, null); + }; + + test.deepEqual(app.synth().getStack(stack.stackName).template, { + Resources: { + DefaultResource: { + Type: 'Test::Resource::Fake' + } + } + }); + test.ok(called, `renderProperties must be called called`); + + test.done(); + } + } +});