Skip to content

Commit f7e421d

Browse files
committed
Add some validation around parameters being unique, and unit tests wrt that
1 parent c7dbb39 commit f7e421d

2 files changed

Lines changed: 75 additions & 5 deletions

File tree

packages/cdkConstructs/src/constructs/SsmParametersConstruct.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export interface SsmParametersConstructProps {
3636
/**
3737
* Prefix used in SSM parameter names and CloudFormation export names.
3838
*/
39-
readonly stackName: string
39+
readonly namePrefix: string
4040
/**
4141
* List of SSM parameters to create.
4242
*/
@@ -70,7 +70,7 @@ export class SsmParametersConstruct extends Construct {
7070
super(scope, id)
7171

7272
const {
73-
stackName,
73+
namePrefix: stackName,
7474
parameters,
7575
readPolicyDescription = "Allows reading SSM parameters",
7676
readPolicyOutputDescription = "Access to the parameters used by the integration",
@@ -83,9 +83,24 @@ export class SsmParametersConstruct extends Construct {
8383

8484
const createdParameters: Record<string, StringParameter> = {}
8585

86+
const seenIds = new Set<string>()
87+
const seenNames = new Set<string>()
88+
8689
for (const parameter of parameters) {
87-
const ssmParameter = new StringParameter(this, `${parameter.id}Parameter`, {
88-
parameterName: `${stackName}-${parameter.nameSuffix}`,
90+
const parameterId = `${parameter.id}Parameter`
91+
if (seenIds.has(parameterId)) {
92+
throw new Error(`Duplicate parameter id detected: ${parameter.id}.`)
93+
}
94+
seenIds.add(parameterId)
95+
96+
const parameterName = `${stackName}-${parameter.nameSuffix}`
97+
if (seenNames.has(parameterName)) {
98+
throw new Error(`Duplicate parameter name detected: ${parameterName}.`)
99+
}
100+
seenNames.add(parameterName)
101+
102+
const ssmParameter = new StringParameter(this, parameterId, {
103+
parameterName,
89104
description: parameter.description,
90105
stringValue: parameter.value
91106
})

packages/cdkConstructs/tests/constructs/ssmParametersConstruct.test.ts

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe("SsmParametersConstruct", () => {
1818
const stack = new Stack(app, "parameterStack")
1919

2020
const params = new SsmParametersConstruct(stack, "TestingParameters", {
21-
stackName: "mock-stack",
21+
namePrefix: "mock-stack",
2222
parameters: [
2323
{
2424
id: "MockParam1",
@@ -127,3 +127,58 @@ describe("SsmParametersConstruct", () => {
127127
expect(descriptions).toContain("Mock read policy output description")
128128
})
129129
})
130+
131+
describe("SsmParametersConstruct validation", () => {
132+
test("throws when parameters array is empty", () => {
133+
const app = new App()
134+
const stack = new Stack(app, "emptyParamStack")
135+
expect(() => new SsmParametersConstruct(stack, "EmptyParameters", {
136+
namePrefix: "mock-stack",
137+
parameters: []
138+
})).toThrow("SsmParametersConstruct requires at least one parameter definition")
139+
})
140+
141+
test("throws when duplicate parameter ids are detected", () => {
142+
const app = new App()
143+
const stack = new Stack(app, "duplicateIdStack")
144+
expect(() => new SsmParametersConstruct(stack, "DuplicateIdParameters", {
145+
namePrefix: "mock-stack",
146+
parameters: [
147+
{
148+
id: "MockParam1",
149+
nameSuffix: "MockParam1",
150+
description: "Description for mock parameter 1",
151+
value: "mock-value-1"
152+
},
153+
{
154+
id: "MockParam1",
155+
nameSuffix: "MockParam1Different",
156+
description: "Description for duplicate id parameter",
157+
value: "mock-value-2"
158+
}
159+
]
160+
})).toThrow("Duplicate parameter id detected: MockParam1.")
161+
})
162+
163+
test("throws when duplicate parameter names are detected", () => {
164+
const app = new App()
165+
const stack = new Stack(app, "duplicateNameStack")
166+
expect(() => new SsmParametersConstruct(stack, "DuplicateNameParameters", {
167+
namePrefix: "mock-stack",
168+
parameters: [
169+
{
170+
id: "MockParam1",
171+
nameSuffix: "SharedSuffix",
172+
description: "Description for mock parameter 1",
173+
value: "mock-value-1"
174+
},
175+
{
176+
id: "MockParam2",
177+
nameSuffix: "SharedSuffix",
178+
description: "Description for duplicate name parameter",
179+
value: "mock-value-2"
180+
}
181+
]
182+
})).toThrow("Duplicate parameter name detected: mock-stack-SharedSuffix.")
183+
})
184+
})

0 commit comments

Comments
 (0)