diff --git a/src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs b/src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs index 835c6d8e..e5d4d1b1 100644 --- a/src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs +++ b/src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs @@ -172,7 +172,7 @@ private FeatureDefinition GetMicrosoftSchemaFeatureDefinition(string featureName IEnumerable microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections(); IConfigurationSection configuration = microsoftFeatureDefinitionSections - .FirstOrDefault(section => + .LastOrDefault(section => string.Equals(section[MicrosoftFeatureManagementFields.Id], featureName, StringComparison.OrdinalIgnoreCase)); if (configuration == null) diff --git a/tests/Tests.FeatureManagement/DotnetFeatureManagementSchema.json b/tests/Tests.FeatureManagement/DotnetFeatureManagementSchema.json index 57b068b5..d52a677a 100644 --- a/tests/Tests.FeatureManagement/DotnetFeatureManagementSchema.json +++ b/tests/Tests.FeatureManagement/DotnetFeatureManagementSchema.json @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/tests/Tests.FeatureManagement/FeatureManagementTest.cs b/tests/Tests.FeatureManagement/FeatureManagementTest.cs index d8adf251..d12fe51c 100644 --- a/tests/Tests.FeatureManagement/FeatureManagementTest.cs +++ b/tests/Tests.FeatureManagement/FeatureManagementTest.cs @@ -427,6 +427,26 @@ public async Task CustomFeatureDefinitionProvider() Assert.True(called); } + + [Fact] + public async Task LastFeatureFlagWins() + { + IConfiguration configuration = new ConfigurationBuilder() + .AddJsonFile("appsettings.json") + .Build(); + + IServiceCollection services = new ServiceCollection(); + + services + .AddSingleton(configuration) + .AddFeatureManagement(); + + ServiceProvider serviceProvider = services.BuildServiceProvider(); + + IFeatureManager featureManager = serviceProvider.GetRequiredService(); + + Assert.True(await featureManager.IsEnabledAsync(Features.DuplicateFlag)); + } } public class FeatureManagementFeatureFilterGeneralTest diff --git a/tests/Tests.FeatureManagement/Features.cs b/tests/Tests.FeatureManagement/Features.cs index 22c22201..e0746fef 100644 --- a/tests/Tests.FeatureManagement/Features.cs +++ b/tests/Tests.FeatureManagement/Features.cs @@ -30,5 +30,6 @@ static class Features public const string OnTelemetryTestFeature = "OnTelemetryTestFeature"; public const string OffTelemetryTestFeature = "OffTelemetryTestFeature"; public const string ContextualFeatureWithVariant = "ContextualFeatureWithVariant"; + public const string DuplicateFlag = "DuplicateFlag"; } } diff --git a/tests/Tests.FeatureManagement/appsettings.json b/tests/Tests.FeatureManagement/appsettings.json index a99a325d..b1ad1e72 100644 --- a/tests/Tests.FeatureManagement/appsettings.json +++ b/tests/Tests.FeatureManagement/appsettings.json @@ -530,6 +530,14 @@ "default_when_enabled": "Big", "default_when_disabled": "Small" } + }, + { + "id": "DuplicateFlag", + "enabled": false + }, + { + "id": "DuplicateFlag", + "enabled": true } ] }