@@ -398,6 +398,11 @@ public async Task LastFeatureFlagWins()
398398 [ Fact ]
399399 public async Task MergesFeatureFlagsFromDifferentConfigurationSources ( )
400400 {
401+ var mergeOptions = new ConfigurationFeatureDefinitionProviderOptions ( )
402+ {
403+ CustomConfigurationMergingEnabled = true
404+ } ;
405+
401406 /*
402407 * appsettings1.json
403408 * Feature1: true
@@ -425,18 +430,99 @@ public async Task MergesFeatureFlagsFromDifferentConfigurationSources()
425430 . AddJsonFile ( "appsettings3.json" )
426431 . Build ( ) ;
427432
428- var featureManager1 = new FeatureManager ( new ConfigurationFeatureDefinitionProvider ( configuration1 ) ) ;
433+ var featureManager1 = new FeatureManager ( new ConfigurationFeatureDefinitionProvider ( configuration1 , mergeOptions ) ) ;
429434 Assert . True ( await featureManager1 . IsEnabledAsync ( "FeatureA" ) ) ;
430435 Assert . True ( await featureManager1 . IsEnabledAsync ( "FeatureB" ) ) ;
431436 Assert . True ( await featureManager1 . IsEnabledAsync ( "Feature1" ) ) ;
432437 Assert . False ( await featureManager1 . IsEnabledAsync ( "Feature2" ) ) ; // appsettings2 should override appsettings1
433438
434- var featureManager2 = new FeatureManager ( new ConfigurationFeatureDefinitionProvider ( configuration2 ) ) ;
439+ var featureManager2 = new FeatureManager ( new ConfigurationFeatureDefinitionProvider ( configuration2 , mergeOptions ) ) ;
435440 Assert . True ( await featureManager2 . IsEnabledAsync ( "FeatureA" ) ) ;
436441 Assert . True ( await featureManager2 . IsEnabledAsync ( "FeatureB" ) ) ;
437442 Assert . True ( await featureManager2 . IsEnabledAsync ( "FeatureC" ) ) ;
438443 Assert . False ( await featureManager2 . IsEnabledAsync ( "Feature1" ) ) ; // appsettings3 should override previous settings
439444 Assert . False ( await featureManager2 . IsEnabledAsync ( "Feature2" ) ) ; // appsettings3 should override previous settings
445+
446+ //
447+ // default behavior
448+ var featureManager3 = new FeatureManager ( new ConfigurationFeatureDefinitionProvider ( configuration1 ) ) ;
449+ Assert . False ( await featureManager3 . IsEnabledAsync ( "FeatureA" ) ) ; // it will be overridden by FeatureB
450+ Assert . True ( await featureManager3 . IsEnabledAsync ( "FeatureB" ) ) ;
451+ Assert . True ( await featureManager3 . IsEnabledAsync ( "Feature1" ) ) ;
452+ Assert . False ( await featureManager3 . IsEnabledAsync ( "Feature2" ) ) ; // appsettings2 should override appsettings1
453+
454+ IConfiguration configuration3 = new ConfigurationBuilder ( )
455+ . AddJsonFile ( "appsettings1.json" )
456+ . AddInMemoryCollection ( new Dictionary < string , string > ( StringComparer . OrdinalIgnoreCase )
457+ {
458+ [ "feature_management:feature_flags:0:enabled" ] = bool . FalseString ,
459+ [ "feature_management:feature_flags:1:enabled" ] = bool . FalseString ,
460+ } )
461+ . Build ( ) ;
462+ var featureManager4 = new FeatureManager ( new ConfigurationFeatureDefinitionProvider ( configuration3 ) ) ;
463+ Assert . False ( await featureManager4 . IsEnabledAsync ( "Feature1" ) ) ;
464+ Assert . False ( await featureManager4 . IsEnabledAsync ( "Feature2" ) ) ;
465+ Assert . True ( await featureManager4 . IsEnabledAsync ( "FeatureA" ) ) ;
466+
467+ //
468+ // DI usage
469+ var services1 = new ServiceCollection ( ) ;
470+ services1
471+ . AddSingleton ( configuration2 )
472+ . AddFeatureManagement ( ) ;
473+ services1 . Configure < ConfigurationFeatureDefinitionProviderOptions > ( o =>
474+ {
475+ o . CustomConfigurationMergingEnabled = true ;
476+ } ) ;
477+ ServiceProvider serviceProvider1 = services1 . BuildServiceProvider ( ) ;
478+ IFeatureManager featureManager5 = serviceProvider1 . GetRequiredService < IFeatureManager > ( ) ;
479+
480+ Assert . True ( await featureManager5 . IsEnabledAsync ( "FeatureA" ) ) ;
481+ Assert . True ( await featureManager5 . IsEnabledAsync ( "FeatureB" ) ) ;
482+ Assert . True ( await featureManager5 . IsEnabledAsync ( "FeatureC" ) ) ;
483+ Assert . False ( await featureManager5 . IsEnabledAsync ( "Feature1" ) ) ;
484+ Assert . False ( await featureManager5 . IsEnabledAsync ( "Feature2" ) ) ;
485+
486+ var services2 = new ServiceCollection ( ) ;
487+ services2
488+ . AddSingleton ( configuration2 )
489+ . AddFeatureManagement ( ) ;
490+ ServiceProvider serviceProvider2 = services2 . BuildServiceProvider ( ) ;
491+ IFeatureManager featureManager6 = serviceProvider2 . GetRequiredService < IFeatureManager > ( ) ;
492+
493+ Assert . False ( await featureManager6 . IsEnabledAsync ( "FeatureA" ) ) ;
494+ Assert . False ( await featureManager6 . IsEnabledAsync ( "FeatureB" ) ) ;
495+ Assert . True ( await featureManager6 . IsEnabledAsync ( "FeatureC" ) ) ;
496+ Assert . False ( await featureManager6 . IsEnabledAsync ( "Feature1" ) ) ;
497+ Assert . False ( await featureManager6 . IsEnabledAsync ( "Feature2" ) ) ;
498+
499+ var services3 = new ServiceCollection ( ) ;
500+ services3
501+ . AddFeatureManagement ( configuration2 ) ;
502+ services3 . Configure < ConfigurationFeatureDefinitionProviderOptions > ( o =>
503+ {
504+ o . CustomConfigurationMergingEnabled = true ;
505+ } ) ;
506+ ServiceProvider serviceProvider3 = services3 . BuildServiceProvider ( ) ;
507+ IFeatureManager featureManager7 = serviceProvider3 . GetRequiredService < IFeatureManager > ( ) ;
508+
509+ Assert . True ( await featureManager7 . IsEnabledAsync ( "FeatureA" ) ) ;
510+ Assert . True ( await featureManager7 . IsEnabledAsync ( "FeatureB" ) ) ;
511+ Assert . True ( await featureManager7 . IsEnabledAsync ( "FeatureC" ) ) ;
512+ Assert . False ( await featureManager7 . IsEnabledAsync ( "Feature1" ) ) ;
513+ Assert . False ( await featureManager7 . IsEnabledAsync ( "Feature2" ) ) ;
514+
515+ var services4 = new ServiceCollection ( ) ;
516+ services4
517+ . AddFeatureManagement ( configuration2 ) ;
518+ ServiceProvider serviceProvider4 = services4 . BuildServiceProvider ( ) ;
519+ IFeatureManager featureManager8 = serviceProvider4 . GetRequiredService < IFeatureManager > ( ) ;
520+
521+ Assert . False ( await featureManager8 . IsEnabledAsync ( "FeatureA" ) ) ;
522+ Assert . False ( await featureManager8 . IsEnabledAsync ( "FeatureB" ) ) ;
523+ Assert . True ( await featureManager8 . IsEnabledAsync ( "FeatureC" ) ) ;
524+ Assert . False ( await featureManager8 . IsEnabledAsync ( "Feature1" ) ) ;
525+ Assert . False ( await featureManager8 . IsEnabledAsync ( "Feature2" ) ) ;
440526 }
441527 }
442528
0 commit comments