Skip to content

Commit 47070ac

Browse files
committed
add documentation and test for utility methods
1 parent e8b82d9 commit 47070ac

File tree

3 files changed

+127
-5
lines changed

3 files changed

+127
-5
lines changed

src/Amazon.Extensions.Configuration.SystemsManager/Utils/ParameterProcessorUtil.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@
33
using Amazon.Extensions.Configuration.SystemsManager.Internal;
44
using Amazon.SimpleSystemsManagement.Model;
55
using Microsoft.Extensions.Configuration;
6+
using System.Text.Json;
67

78
namespace Amazon.Extensions.Configuration.SystemsManager.Utils
89
{
910
public static class ParameterProcessorUtil
1011
{
12+
/// <summary>
13+
/// Parses the SSM parameter as JSON
14+
/// </summary>
15+
/// <param name="parameter">SSM parameter</param>
16+
/// <param name="keyPrefix">prefix to add in configution key</param>
17+
/// <param name="result">append the parsed JSON value into</param>
18+
/// <exception cref="DuplicateParameterException">SSM parameter key is already present in <paramref name="result"/></exception>
19+
/// <exception cref="JsonException"><paramref name="parameter" /> value does not represent a valid single JSON value.</exception>
1120
public static void ParseJsonParameter(Parameter parameter, string keyPrefix, IDictionary<string, string> result)
1221
{
1322
foreach (var kv in JsonConfigurationParser.Parse(parameter.Value))
@@ -22,12 +31,20 @@ public static void ParseJsonParameter(Parameter parameter, string keyPrefix, IDi
2231
}
2332
}
2433

34+
/// <summary>
35+
/// Parses the StringList SSM parameter as List of String
36+
/// <br/><br/>
37+
/// Items in a StringList must be separated by a comma (,).
38+
/// You can't use other punctuation or special characters to escape items in the list.
39+
/// If you have a parameter value that requires a comma, then use the String type.
40+
/// https://docs.aws.amazon.com/systems-manager/latest/userguide/param-create-cli.html#param-create-cli-stringlist
41+
/// </summary>
42+
/// <param name="parameter">SSM parameter</param>
43+
/// <param name="keyPrefix">prefix to add in configution key</param>
44+
/// <param name="result">append the parsed string list value into</param>
45+
/// <exception cref="DuplicateParameterException">SSM parameter key is already present in <paramref name="result"/></exception>
2546
public static void ParseStringListParameter(Parameter parameter, string keyPrefix, IDictionary<string, string> result)
2647
{
27-
// Items in a StringList must be separated by a comma (,).
28-
// You can't use other punctuation or special characters to escape items in the list.
29-
// If you have a parameter value that requires a comma, then use the String type.
30-
// https://docs.aws.amazon.com/systems-manager/latest/userguide/param-create-cli.html#param-create-cli-stringlist
3148
var configKeyValuePairs = parameter.Value
3249
.Split(',')
3350
.Select((value, idx) => new KeyValuePair<string, string>($"{keyPrefix}{ConfigurationPath.KeyDelimiter}{idx}", value));
@@ -43,6 +60,13 @@ public static void ParseStringListParameter(Parameter parameter, string keyPrefi
4360
}
4461
}
4562

63+
/// <summary>
64+
/// Parses the SSM parameter as String
65+
/// </summary>
66+
/// <param name="parameter">SSM parameter</param>
67+
/// <param name="key">key to be used for configution key</param>
68+
/// <param name="result">append the parsed string value into</param>
69+
/// <exception cref="DuplicateParameterException">SSM parameter key is already present in <paramref name="result"/></exception>
4670
public static void ParseStringParameter(Parameter parameter, string key, IDictionary<string, string> result)
4771
{
4872
if (result.ContainsKey(key))
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Amazon.Extensions.Configuration.SystemsManager.Tests
77
{
8-
public class JsonOrStringParameterProcessorTest
8+
public class JsonOrStringParameterProcessorTests
99
{
1010
private readonly IParameterProcessor _parameterProcessor = new JsonOrStringParameterProcessor();
1111

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System.Collections.Generic;
2+
using System.Text.Json;
3+
using Amazon.Extensions.Configuration.SystemsManager.Utils;
4+
using Amazon.SimpleSystemsManagement.Model;
5+
using Xunit;
6+
7+
namespace Amazon.Extensions.Configuration.SystemsManager.Tests.Utils
8+
{
9+
public class ParameterProcessorUtilTests
10+
{
11+
[Fact]
12+
public void ParseJsonParameterSuccessfully()
13+
{
14+
var result = new Dictionary<string, string>();
15+
var parameter = new Parameter { Value = "{\"key\": \"value\"}" };
16+
var keyPrefix = "prefix";
17+
18+
ParameterProcessorUtil.ParseJsonParameter(parameter, keyPrefix, result);
19+
20+
Assert.Single(result);
21+
Assert.Contains("prefix:key", result.Keys);
22+
Assert.Equal("value", result["prefix:key"]);
23+
}
24+
25+
[Fact]
26+
public void ParseJsonParameterWithDuplicateKeyThrowsException()
27+
{
28+
var result = new Dictionary<string, string> { { "prefix:key", "value" } };
29+
var parameter = new Parameter { Value = "{\"key\": \"newvalue\"}" };
30+
var keyPrefix = "prefix";
31+
32+
Assert.Throws<DuplicateParameterException>(() => ParameterProcessorUtil.ParseJsonParameter(parameter, keyPrefix, result));
33+
}
34+
35+
[Fact]
36+
public void ParseJsonParameterForInvalidJsonThrowsException()
37+
{
38+
var result = new Dictionary<string, string>();
39+
var parameter = new Parameter { Value = "invalid json" };
40+
var keyPrefix = "";
41+
42+
Assert.ThrowsAny<JsonException>(() => ParameterProcessorUtil.ParseJsonParameter(parameter, keyPrefix, result));
43+
}
44+
45+
[Fact]
46+
public void ParseStringListParameterSuccessfully()
47+
{
48+
var result = new Dictionary<string, string>();
49+
var parameter = new Parameter { Value = "value1,value2,value3" };
50+
var keyPrefix = "prefix";
51+
52+
ParameterProcessorUtil.ParseStringListParameter(parameter, keyPrefix, result);
53+
54+
Assert.Equal(3, result.Count);
55+
Assert.Contains("prefix:0", result.Keys);
56+
Assert.Contains("prefix:1", result.Keys);
57+
Assert.Contains("prefix:2", result.Keys);
58+
Assert.Equal("value1", result["prefix:0"]);
59+
Assert.Equal("value2", result["prefix:1"]);
60+
Assert.Equal("value3", result["prefix:2"]);
61+
}
62+
63+
[Fact]
64+
public void ParseStringListParameterWithDuplicateKeyThrowsException()
65+
{
66+
var result = new Dictionary<string, string> { { "prefix:0", "value" } };
67+
var parameter = new Parameter { Value = "value1,value2,value3" };
68+
var keyPrefix = "prefix";
69+
70+
Assert.Throws<DuplicateParameterException>(() => ParameterProcessorUtil.ParseStringListParameter(parameter, keyPrefix, result));
71+
}
72+
73+
[Fact]
74+
public void ParseStringParameterSuccessfully()
75+
{
76+
var result = new Dictionary<string, string>();
77+
var parameter = new Parameter { Value = "stringValue" };
78+
var key = "myKey";
79+
80+
ParameterProcessorUtil.ParseStringParameter(parameter, key, result);
81+
82+
Assert.Single(result);
83+
Assert.Contains("myKey", result.Keys);
84+
Assert.Equal("stringValue", result["myKey"]);
85+
}
86+
87+
[Fact]
88+
public void ParseStringParameterWithDuplicateKeyThrowsException()
89+
{
90+
var result = new Dictionary<string, string> { { "myKey", "existingValue" } };
91+
var parameter = new Parameter { Value = "newValue" };
92+
var key = "myKey";
93+
94+
Assert.Throws<DuplicateParameterException>(() => ParameterProcessorUtil.ParseStringParameter(parameter, key, result));
95+
}
96+
97+
}
98+
}

0 commit comments

Comments
 (0)