Skip to content

Commit 433a059

Browse files
committed
add feature flags unit tests
1 parent 4593f42 commit 433a059

File tree

1 file changed

+353
-0
lines changed

1 file changed

+353
-0
lines changed

libraries/tests/AWS.Lambda.Powertools.Parameters.Tests/AppConfig/AppConfigProviderTest.cs

Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
using System.Text;
1717
using System.Text.Json;
18+
using System.Text.Json.Nodes;
1819
using Amazon.AppConfigData;
1920
using Amazon.AppConfigData.Model;
2021
using AWS.Lambda.Powertools.Parameters.AppConfig;
@@ -1154,4 +1155,356 @@ public async Task GetMultipleAsync_WithArguments_ThrowsException()
11541155

11551156
await Assert.ThrowsAsync<NotSupportedException>(Act);
11561157
}
1158+
1159+
[Fact]
1160+
public async Task IsFeatureFlagEnabled_WhenKeyIsEmptyOrNull_ReturnsDefaultValue()
1161+
{
1162+
// Arrange
1163+
var featureFlagKey = string.Empty;
1164+
var defaultFlagValue = false;
1165+
1166+
var appConfigProvider = new AppConfigProvider(Substitute.For<IDateTimeWrapper>());
1167+
1168+
// Act
1169+
var flagValue = await appConfigProvider.IsFeatureFlagEnabledAsync(featureFlagKey)
1170+
.ConfigureAwait(false);
1171+
1172+
// Assert
1173+
Assert.Equal(flagValue, defaultFlagValue);
1174+
}
1175+
1176+
[Fact]
1177+
public async Task IsFeatureFlagEnabled_WhenKeyIsEmptyOrNull_ReturnsSpecifiedDefaultValue()
1178+
{
1179+
// Arrange
1180+
var featureFlagKey = string.Empty;
1181+
var defaultFlagValue = true;
1182+
1183+
var appConfigProvider = new AppConfigProvider(Substitute.For<IDateTimeWrapper>());
1184+
1185+
// Act
1186+
var flagValue = await appConfigProvider.IsFeatureFlagEnabledAsync(featureFlagKey, defaultFlagValue)
1187+
.ConfigureAwait(false);
1188+
1189+
// Assert
1190+
Assert.Equal(flagValue, defaultFlagValue);
1191+
}
1192+
1193+
[Fact]
1194+
public async Task IsFeatureFlagEnabled_WhenFlagIsEnabled_ReturnsTrue()
1195+
{
1196+
// Arrange
1197+
var applicationId = Guid.NewGuid().ToString();
1198+
var environmentId = Guid.NewGuid().ToString();
1199+
var configProfileId = Guid.NewGuid().ToString();
1200+
var configurationToken = Guid.NewGuid().ToString();
1201+
var cacheKey = AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId);
1202+
1203+
var dateTimeNow = DateTime.UtcNow;
1204+
var nextAllowedPollTime = dateTimeNow.AddSeconds(10);
1205+
var lastConfig = new
1206+
{
1207+
FeatureFlagOne = new
1208+
{
1209+
enabled = true,
1210+
attributeOne = "TestOne",
1211+
attributeTwo = 10
1212+
},
1213+
FeatureFlagTwo = new
1214+
{
1215+
enabled = false,
1216+
attributeOne = "TestTwo",
1217+
attributeTwo = 20
1218+
},
1219+
};
1220+
1221+
var lastConfigStr = JsonSerializer.Serialize(lastConfig);
1222+
var transformedValue = JsonSerializer.Deserialize<JsonObject>(lastConfigStr);
1223+
1224+
var cacheManager = Substitute.For<ICacheManager>();
1225+
var client = Substitute.For<IAmazonAppConfigData>();
1226+
var transformerManager = Substitute.For<ITransformerManager>();
1227+
var dateTimeWrapper = Substitute.For<IDateTimeWrapper>();
1228+
1229+
cacheManager.Get(cacheKey).Returns(transformedValue);
1230+
dateTimeWrapper.UtcNow.Returns(dateTimeNow);
1231+
1232+
var appConfigResult = new AppConfigResult
1233+
{
1234+
PollConfigurationToken = configurationToken,
1235+
NextAllowedPollTime = nextAllowedPollTime,
1236+
LastConfig = lastConfigStr
1237+
};
1238+
1239+
var appConfigProvider = new AppConfigProvider(dateTimeWrapper,
1240+
AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId),
1241+
appConfigResult)
1242+
.UseClient(client)
1243+
.UseCacheManager(cacheManager)
1244+
.UseTransformerManager(transformerManager)
1245+
.WithApplication(applicationId)
1246+
.WithEnvironment(environmentId)
1247+
.WithConfigProfile(configProfileId);
1248+
1249+
// Act
1250+
var currentConfig = await appConfigProvider.IsFeatureFlagEnabledAsync("FeatureFlagOne").ConfigureAwait(false);
1251+
1252+
// Assert
1253+
Assert.Equal(currentConfig, lastConfig.FeatureFlagOne.enabled);
1254+
}
1255+
1256+
[Fact]
1257+
public async Task IsFeatureFlagEnabled_WhenFlagIsDisabled_ReturnsFalse()
1258+
{
1259+
// Arrange
1260+
var applicationId = Guid.NewGuid().ToString();
1261+
var environmentId = Guid.NewGuid().ToString();
1262+
var configProfileId = Guid.NewGuid().ToString();
1263+
var configurationToken = Guid.NewGuid().ToString();
1264+
var cacheKey = AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId);
1265+
1266+
var dateTimeNow = DateTime.UtcNow;
1267+
var nextAllowedPollTime = dateTimeNow.AddSeconds(10);
1268+
var lastConfig = new
1269+
{
1270+
FeatureFlagOne = new
1271+
{
1272+
enabled = true,
1273+
attributeOne = "TestOne",
1274+
attributeTwo = 10
1275+
},
1276+
FeatureFlagTwo = new
1277+
{
1278+
enabled = false,
1279+
attributeOne = "TestTwo",
1280+
attributeTwo = 20
1281+
},
1282+
};
1283+
1284+
var lastConfigStr = JsonSerializer.Serialize(lastConfig);
1285+
var transformedValue = JsonSerializer.Deserialize<JsonObject>(lastConfigStr);
1286+
1287+
var cacheManager = Substitute.For<ICacheManager>();
1288+
var client = Substitute.For<IAmazonAppConfigData>();
1289+
var transformerManager = Substitute.For<ITransformerManager>();
1290+
var dateTimeWrapper = Substitute.For<IDateTimeWrapper>();
1291+
1292+
cacheManager.Get(cacheKey).Returns(transformedValue);
1293+
dateTimeWrapper.UtcNow.Returns(dateTimeNow);
1294+
1295+
var appConfigResult = new AppConfigResult
1296+
{
1297+
PollConfigurationToken = configurationToken,
1298+
NextAllowedPollTime = nextAllowedPollTime,
1299+
LastConfig = lastConfigStr
1300+
};
1301+
1302+
var appConfigProvider = new AppConfigProvider(dateTimeWrapper,
1303+
AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId),
1304+
appConfigResult)
1305+
.UseClient(client)
1306+
.UseCacheManager(cacheManager)
1307+
.UseTransformerManager(transformerManager)
1308+
.WithApplication(applicationId)
1309+
.WithEnvironment(environmentId)
1310+
.WithConfigProfile(configProfileId);
1311+
1312+
// Act
1313+
var currentConfig = await appConfigProvider.IsFeatureFlagEnabledAsync("FeatureFlagTwo").ConfigureAwait(false);
1314+
1315+
// Assert
1316+
Assert.Equal(currentConfig, lastConfig.FeatureFlagTwo.enabled);
1317+
}
1318+
1319+
[Fact]
1320+
public async Task GetFeatureFlagAttribute_WhenHasAttribute_ReturnsAttributeValue()
1321+
{
1322+
// Arrange
1323+
var applicationId = Guid.NewGuid().ToString();
1324+
var environmentId = Guid.NewGuid().ToString();
1325+
var configProfileId = Guid.NewGuid().ToString();
1326+
var configurationToken = Guid.NewGuid().ToString();
1327+
var cacheKey = AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId);
1328+
1329+
var dateTimeNow = DateTime.UtcNow;
1330+
var nextAllowedPollTime = dateTimeNow.AddSeconds(10);
1331+
var lastConfig = new
1332+
{
1333+
FeatureFlagOne = new
1334+
{
1335+
enabled = true,
1336+
attributeOne = "TestOne",
1337+
attributeTwo = 10
1338+
},
1339+
FeatureFlagTwo = new
1340+
{
1341+
enabled = false,
1342+
attributeOne = "TestTwo",
1343+
attributeTwo = 20
1344+
},
1345+
};
1346+
1347+
var lastConfigStr = JsonSerializer.Serialize(lastConfig);
1348+
var transformedValue = JsonSerializer.Deserialize<JsonObject>(lastConfigStr);
1349+
1350+
var cacheManager = Substitute.For<ICacheManager>();
1351+
var client = Substitute.For<IAmazonAppConfigData>();
1352+
var transformerManager = Substitute.For<ITransformerManager>();
1353+
var dateTimeWrapper = Substitute.For<IDateTimeWrapper>();
1354+
1355+
cacheManager.Get(cacheKey).Returns(transformedValue);
1356+
dateTimeWrapper.UtcNow.Returns(dateTimeNow);
1357+
1358+
var appConfigResult = new AppConfigResult
1359+
{
1360+
PollConfigurationToken = configurationToken,
1361+
NextAllowedPollTime = nextAllowedPollTime,
1362+
LastConfig = lastConfigStr
1363+
};
1364+
1365+
var appConfigProvider = new AppConfigProvider(dateTimeWrapper,
1366+
AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId),
1367+
appConfigResult)
1368+
.UseClient(client)
1369+
.UseCacheManager(cacheManager)
1370+
.UseTransformerManager(transformerManager)
1371+
.WithApplication(applicationId)
1372+
.WithEnvironment(environmentId)
1373+
.WithConfigProfile(configProfileId);
1374+
1375+
// Act
1376+
var attributeValue1 = await appConfigProvider.GetFeatureFlagAttributeValueAsync<string>("FeatureFlagOne", "attributeOne").ConfigureAwait(false);
1377+
var attributeValue2 = await appConfigProvider.GetFeatureFlagAttributeValueAsync<int>("FeatureFlagOne", "attributeTwo").ConfigureAwait(false);
1378+
1379+
// Assert
1380+
Assert.Equal(attributeValue1, lastConfig.FeatureFlagOne.attributeOne);
1381+
Assert.Equal(attributeValue2, lastConfig.FeatureFlagOne.attributeTwo);
1382+
}
1383+
1384+
[Fact]
1385+
public async Task GetFeatureFlagAttribute_WhenAttributeDoesNotExist_ReturnsNull()
1386+
{
1387+
// Arrange
1388+
var applicationId = Guid.NewGuid().ToString();
1389+
var environmentId = Guid.NewGuid().ToString();
1390+
var configProfileId = Guid.NewGuid().ToString();
1391+
var configurationToken = Guid.NewGuid().ToString();
1392+
var cacheKey = AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId);
1393+
1394+
var dateTimeNow = DateTime.UtcNow;
1395+
var nextAllowedPollTime = dateTimeNow.AddSeconds(10);
1396+
var lastConfig = new
1397+
{
1398+
FeatureFlagOne = new
1399+
{
1400+
enabled = true,
1401+
attributeOne = "TestOne",
1402+
attributeTwo = 10
1403+
},
1404+
FeatureFlagTwo = new
1405+
{
1406+
enabled = false,
1407+
attributeOne = "TestTwo",
1408+
attributeTwo = 20
1409+
},
1410+
};
1411+
1412+
var lastConfigStr = JsonSerializer.Serialize(lastConfig);
1413+
var transformedValue = JsonSerializer.Deserialize<JsonObject>(lastConfigStr);
1414+
1415+
var cacheManager = Substitute.For<ICacheManager>();
1416+
var client = Substitute.For<IAmazonAppConfigData>();
1417+
var transformerManager = Substitute.For<ITransformerManager>();
1418+
var dateTimeWrapper = Substitute.For<IDateTimeWrapper>();
1419+
1420+
cacheManager.Get(cacheKey).Returns(transformedValue);
1421+
dateTimeWrapper.UtcNow.Returns(dateTimeNow);
1422+
1423+
var appConfigResult = new AppConfigResult
1424+
{
1425+
PollConfigurationToken = configurationToken,
1426+
NextAllowedPollTime = nextAllowedPollTime,
1427+
LastConfig = lastConfigStr
1428+
};
1429+
1430+
var appConfigProvider = new AppConfigProvider(dateTimeWrapper,
1431+
AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId),
1432+
appConfigResult)
1433+
.UseClient(client)
1434+
.UseCacheManager(cacheManager)
1435+
.UseTransformerManager(transformerManager)
1436+
.WithApplication(applicationId)
1437+
.WithEnvironment(environmentId)
1438+
.WithConfigProfile(configProfileId);
1439+
1440+
// Act
1441+
var attributeValue1 = await appConfigProvider.GetFeatureFlagAttributeValueAsync<string>("FeatureFlagOne", "INVALID").ConfigureAwait(false);
1442+
1443+
// Assert
1444+
Assert.Null(attributeValue1);
1445+
}
1446+
1447+
[Fact]
1448+
public async Task GetFeatureFlagAttribute_WhenAttributeDoesNotExist_ReturnsSpecifiedDefaultValue()
1449+
{
1450+
// Arrange
1451+
var applicationId = Guid.NewGuid().ToString();
1452+
var environmentId = Guid.NewGuid().ToString();
1453+
var configProfileId = Guid.NewGuid().ToString();
1454+
var configurationToken = Guid.NewGuid().ToString();
1455+
var defaultAttributeVale = Guid.NewGuid().ToString();
1456+
var cacheKey = AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId);
1457+
1458+
var dateTimeNow = DateTime.UtcNow;
1459+
var nextAllowedPollTime = dateTimeNow.AddSeconds(10);
1460+
var lastConfig = new
1461+
{
1462+
FeatureFlagOne = new
1463+
{
1464+
enabled = true,
1465+
attributeOne = "TestOne",
1466+
attributeTwo = 10
1467+
},
1468+
FeatureFlagTwo = new
1469+
{
1470+
enabled = false,
1471+
attributeOne = "TestTwo",
1472+
attributeTwo = 20
1473+
},
1474+
};
1475+
1476+
var lastConfigStr = JsonSerializer.Serialize(lastConfig);
1477+
var transformedValue = JsonSerializer.Deserialize<JsonObject>(lastConfigStr);
1478+
1479+
var cacheManager = Substitute.For<ICacheManager>();
1480+
var client = Substitute.For<IAmazonAppConfigData>();
1481+
var transformerManager = Substitute.For<ITransformerManager>();
1482+
var dateTimeWrapper = Substitute.For<IDateTimeWrapper>();
1483+
1484+
cacheManager.Get(cacheKey).Returns(transformedValue);
1485+
dateTimeWrapper.UtcNow.Returns(dateTimeNow);
1486+
1487+
var appConfigResult = new AppConfigResult
1488+
{
1489+
PollConfigurationToken = configurationToken,
1490+
NextAllowedPollTime = nextAllowedPollTime,
1491+
LastConfig = lastConfigStr
1492+
};
1493+
1494+
var appConfigProvider = new AppConfigProvider(dateTimeWrapper,
1495+
AppConfigProviderCacheHelper.GetCacheKey(applicationId, environmentId, configProfileId),
1496+
appConfigResult)
1497+
.UseClient(client)
1498+
.UseCacheManager(cacheManager)
1499+
.UseTransformerManager(transformerManager)
1500+
.WithApplication(applicationId)
1501+
.WithEnvironment(environmentId)
1502+
.WithConfigProfile(configProfileId);
1503+
1504+
// Act
1505+
var attributeValue1 = await appConfigProvider.GetFeatureFlagAttributeValueAsync<string>("FeatureFlagOne", "INVALID", defaultAttributeVale).ConfigureAwait(false);
1506+
1507+
// Assert
1508+
Assert.Equal(attributeValue1, defaultAttributeVale);
1509+
}
11571510
}

0 commit comments

Comments
 (0)