Skip to content

Commit cfe5e57

Browse files
feat: Add support for basic flags in Feature Management (#350)
Signed-off-by: Mark Johnson <[email protected]> Co-authored-by: André Silva <[email protected]>
1 parent 6536c9b commit cfe5e57

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

src/OpenFeature.Contrib.Providers.FeatureManagement/FeatureManagementProvider.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.Configuration;
22
using Microsoft.FeatureManagement;
33
using Microsoft.FeatureManagement.FeatureFilters;
4+
using OpenFeature.Constant;
45
using OpenFeature.Model;
56
using System;
67
using System.Collections.Generic;
@@ -50,6 +51,24 @@ public override async Task<ResolutionDetails<bool>> ResolveBooleanValueAsync(str
5051
{
5152
var variant = await Evaluate(flagKey, context, CancellationToken.None);
5253

54+
if (variant == null)
55+
{
56+
var exists = false;
57+
await foreach (var name in featureManager.GetFeatureNamesAsync().WithCancellation(cancellationToken))
58+
{
59+
if (!flagKey.Equals(name, StringComparison.OrdinalIgnoreCase)) continue;
60+
exists = true;
61+
break;
62+
}
63+
var enabled = await featureManager.IsEnabledAsync(flagKey, context, cancellationToken);
64+
if (exists)
65+
{
66+
return new ResolutionDetails<bool>(flagKey, enabled);
67+
}
68+
69+
return new ResolutionDetails<bool>(flagKey, defaultValue, ErrorType.FlagNotFound, Reason.Error);
70+
}
71+
5372
if (Boolean.TryParse(variant?.Configuration?.Value, out var value))
5473
return new ResolutionDetails<bool>(flagKey, value);
5574
return new ResolutionDetails<bool>(flagKey, defaultValue);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Microsoft.Extensions.Configuration;
2+
using System.Threading.Tasks;
3+
using Xunit;
4+
5+
namespace OpenFeature.Contrib.Providers.FeatureManagement.Test
6+
{
7+
public class FeatureManagementProviderSimpleFlagTest
8+
{
9+
[Theory]
10+
[MemberData(nameof(TestData.BooleanSimple), MemberType = typeof(TestData))]
11+
public async Task BooleanValue_ShouldReturnExpected(string key, bool defaultValue, bool expectedValue)
12+
{
13+
// Arrange
14+
var configuration = new ConfigurationBuilder()
15+
.AddJsonFile("appsettings.enabled.json")
16+
.Build();
17+
18+
var provider = new FeatureManagementProvider(configuration);
19+
20+
// Act
21+
// Invert the expected value to ensure that the value is being read from the configuration
22+
var result = await provider.ResolveBooleanValueAsync(key, defaultValue);
23+
24+
// Assert
25+
Assert.Equal(expectedValue, result.Value);
26+
}
27+
}
28+
}

test/OpenFeature.Contrib.Providers.FeatureManagement.Test/TestData.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Dynamic;
4-
using System.Linq;
5-
using System.Text;
6-
using System.Threading.Tasks;
1+
using System.Collections.Generic;
72

83
namespace OpenFeature.Contrib.Providers.FeatureManagement.Test
94
{
@@ -14,6 +9,16 @@ internal class TestData
149
private static string INVALID_EMAIL = "[email protected]";
1510
private static string INVALID_GROUP = "missing.group";
1611

12+
public static IEnumerable<object[]> BooleanSimple()
13+
{
14+
yield return new object[] { "simple_flag_on", false, true };
15+
yield return new object[] { "simple_flag_on", true, true };
16+
yield return new object[] { "simple_flag_off", false, false };
17+
yield return new object[] { "simple_flag_off", true, false };
18+
yield return new object[] { "simple_flag_missing", false, false };
19+
yield return new object[] { "simple_flag_missing", true, true };
20+
}
21+
1722
public static IEnumerable<object[]> BooleanNoContext()
1823
{
1924
yield return new object[] { "MissingFlagKey", true, true };

test/OpenFeature.Contrib.Providers.FeatureManagement.Test/appsettings.enabled.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
{
2+
"FeatureManagement": {
3+
"simple_flag_on": true,
4+
"simple_flag_off": false
5+
},
26
"feature_management": {
37
"feature_flags": [
48
{

0 commit comments

Comments
 (0)