1515
1616using System . Text ;
1717using System . Text . Json ;
18+ using System . Text . Json . Nodes ;
1819using Amazon . AppConfigData ;
1920using Amazon . AppConfigData . Model ;
2021using 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