Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 36 additions & 33 deletions tests/Tests.FeatureManagement/FeatureManagement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ public async Task ReadsConfiguration()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

Assert.True(await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.OnTestFeature)));
Assert.True(await featureManager.IsEnabledAsync(Features.OnTestFeature));

Assert.False(await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.OffTestFeature)));
Assert.False(await featureManager.IsEnabledAsync(Features.OffTestFeature));

IEnumerable<IFeatureFilterMetadata> featureFilters = serviceProvider.GetRequiredService<IEnumerable<IFeatureFilterMetadata>>();

Expand All @@ -51,20 +51,21 @@ public async Task ReadsConfiguration()

Assert.Equal("V1", evaluationContext.Parameters["P1"]);

Assert.Equal(Enum.GetName(typeof(Features), Features.ConditionalFeature), evaluationContext.FeatureName);
Assert.Equal(Features.ConditionalFeature, evaluationContext.FeatureName);

return Task.FromResult(true);
};

await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature));
await featureManager.IsEnabledAsync(Features.ConditionalFeature);

Assert.True(called);
}

[Fact]
public async Task ReadsOnlyFeatureManagementSection()
{
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes("{\"AllowedHosts\": \"*\"}"));
var stream = new MemoryStream(Encoding.UTF8.GetBytes("{\"AllowedHosts\": \"*\"}"));

IConfiguration config = new ConfigurationBuilder().AddJsonStream(stream).Build();

var services = new ServiceCollection();
Expand All @@ -80,6 +81,7 @@ public async Task ReadsOnlyFeatureManagementSection()

await foreach (string featureName in featureManager.GetFeatureNamesAsync())
{
//
// Fail, as no features should be found
Assert.True(false);
}
Expand All @@ -90,7 +92,7 @@ public async Task AllowsDuplicatedFilterAlias()
{
const string duplicatedFilterName = "DuplicatedFilterName";

string featureName = Enum.GetName(typeof(Features), Features.FeatureUsesFiltersWithDuplicatedAlias);
string featureName = Features.FeatureUsesFiltersWithDuplicatedAlias;

IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

Expand Down Expand Up @@ -202,6 +204,7 @@ public async Task CustomFilterContextualTargetingWithNullSetting()
ServiceCollection services = new ServiceCollection();

var targetingContextAccessor = new OnDemandTargetingContextAccessor();

services.AddSingleton<ITargetingContextAccessor>(targetingContextAccessor);

services
Expand All @@ -219,10 +222,10 @@ public async Task CustomFilterContextualTargetingWithNullSetting()
[Fact]
public async Task TimeWindow()
{
string feature1 = "feature1";
string feature2 = "feature2";
string feature3 = "feature3";
string feature4 = "feature4";
const string feature1 = "feature1";
const string feature2 = "feature2";
const string feature3 = "feature3";
const string feature4 = "feature4";

Environment.SetEnvironmentVariable($"FeatureManagement:{feature1}:EnabledFor:0:Name", "TimeWindow");
Environment.SetEnvironmentVariable($"FeatureManagement:{feature1}:EnabledFor:0:Parameters:End", DateTimeOffset.UtcNow.AddDays(1).ToString("r"));
Expand Down Expand Up @@ -256,10 +259,10 @@ public async Task TimeWindow()
[Fact]
public async Task Percentage()
{
string feature1 = "feature1";
const string feature = "feature";

Environment.SetEnvironmentVariable($"FeatureManagement:{feature1}:EnabledFor:0:Name", "Percentage");
Environment.SetEnvironmentVariable($"FeatureManagement:{feature1}:EnabledFor:0:Parameters:Value", "50");
Environment.SetEnvironmentVariable($"FeatureManagement:{feature}:EnabledFor:0:Name", "Percentage");
Environment.SetEnvironmentVariable($"FeatureManagement:{feature}:EnabledFor:0:Parameters:Value", "50");

IConfiguration config = new ConfigurationBuilder().AddEnvironmentVariables().Build();

Expand All @@ -276,7 +279,7 @@ public async Task Percentage()

for (int i = 0; i < 10; i++)
{
if (await featureManager.IsEnabledAsync(feature1))
if (await featureManager.IsEnabledAsync(feature))
{
enabledCount++;
}
Expand Down Expand Up @@ -306,7 +309,7 @@ public async Task Targeting()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

string targetingTestFeature = Enum.GetName(typeof(Features), Features.TargetingTestFeature);
string targetingTestFeature = Features.TargetingTestFeature;

//
// Targeted by user id
Expand Down Expand Up @@ -372,7 +375,7 @@ public async Task TargetingAccessor()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

string beta = Enum.GetName(typeof(Features), Features.TargetingTestFeature);
string beta = Features.TargetingTestFeature;

//
// Targeted by user id
Expand Down Expand Up @@ -423,11 +426,11 @@ public async Task UsesContext()

context.AccountId = "NotEnabledAccount";

Assert.False(await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ContextualFeature), context));
Assert.False(await featureManager.IsEnabledAsync(Features.ContextualFeature, context));

context.AccountId = "abc";

Assert.True(await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ContextualFeature), context));
Assert.True(await featureManager.IsEnabledAsync(Features.ContextualFeature, context));
}

[Fact]
Expand Down Expand Up @@ -495,7 +498,7 @@ public async Task ThrowsExceptionForMissingFeatureFilter()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

FeatureManagementException e = await Assert.ThrowsAsync<FeatureManagementException>(async () => await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature)));
FeatureManagementException e = await Assert.ThrowsAsync<FeatureManagementException>(async () => await featureManager.IsEnabledAsync(Features.ConditionalFeature));

Assert.Equal(FeatureManagementError.MissingFeatureFilter, e.Error);
}
Expand All @@ -521,7 +524,7 @@ public async Task SwallowsExceptionForMissingFeatureFilter()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

var isEnabled = await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature));
var isEnabled = await featureManager.IsEnabledAsync(Features.ConditionalFeature);

Assert.False(isEnabled);
}
Expand Down Expand Up @@ -556,7 +559,7 @@ public async Task CustomFeatureDefinitionProvider()
{
FeatureDefinition testFeature = new FeatureDefinition
{
Name = Enum.GetName(typeof(Features), Features.ConditionalFeature),
Name = Features.ConditionalFeature,
EnabledFor = new List<FeatureFilterConfiguration>()
{
new FeatureFilterConfiguration
Expand Down Expand Up @@ -594,12 +597,12 @@ public async Task CustomFeatureDefinitionProvider()

Assert.Equal("V1", evaluationContext.Parameters["P1"]);

Assert.Equal(Enum.GetName(typeof(Features), Features.ConditionalFeature), evaluationContext.FeatureName);
Assert.Equal(Features.ConditionalFeature, evaluationContext.FeatureName);

return Task.FromResult(true);
};

await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature));
await featureManager.IsEnabledAsync(Features.ConditionalFeature);

Assert.True(called);
}
Expand Down Expand Up @@ -641,7 +644,7 @@ public async Task ThreadsafeSnapshot()

for (int i = 0; i < 1000; i++)
{
tasks.Add(featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature)));
tasks.Add(featureManager.IsEnabledAsync(Features.ConditionalFeature));
}

Assert.True(called);
Expand Down Expand Up @@ -678,7 +681,7 @@ public async Task TargetingExclusion()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

string targetingTestFeature = Enum.GetName(typeof(Features), Features.TargetingTestFeatureWithExclusion);
string targetingTestFeature = Features.TargetingTestFeatureWithExclusion;

//
// Targeted by user id
Expand Down Expand Up @@ -754,7 +757,7 @@ public async Task UsesRequirementType()
{
IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

string filterOneId = "1";
const string filterOneId = "1";

var services = new ServiceCollection();

Expand All @@ -767,8 +770,8 @@ public async Task UsesRequirementType()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

string anyFilterFeature = Enum.GetName(typeof(Features), Features.AnyFilterFeature);
string allFilterFeature = Enum.GetName(typeof(Features), Features.AllFilterFeature);
string anyFilterFeature = Features.AnyFilterFeature;
string allFilterFeature = Features.AllFilterFeature;

IEnumerable<IFeatureFilterMetadata> featureFilters = serviceProvider.GetRequiredService<IEnumerable<IFeatureFilterMetadata>>();

Expand Down Expand Up @@ -825,7 +828,7 @@ public async Task RequirementTypeAllExceptions()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

string allFilterFeature = Enum.GetName(typeof(Features), Features.AllFilterFeature);
string allFilterFeature = Features.AllFilterFeature;

await Assert.ThrowsAsync<FeatureManagementException>(async () =>
{
Expand All @@ -852,7 +855,7 @@ public async Task BindsFeatureFlagSettings()
{
new FeatureDefinition
{
Name = Enum.GetName(typeof(Features), Features.ConditionalFeature),
Name = Features.ConditionalFeature,
EnabledFor = new List<FeatureFilterConfiguration>()
{
testFilterConfiguration
Expand Down Expand Up @@ -893,7 +896,7 @@ public async Task BindsFeatureFlagSettings()
return Task.FromResult(true);
};

await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature));
await featureManager.IsEnabledAsync(Features.ConditionalFeature);

Assert.True(binderCalled);

Expand All @@ -903,7 +906,7 @@ public async Task BindsFeatureFlagSettings()

called = false;

await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature));
await featureManager.IsEnabledAsync(Features.ConditionalFeature);

Assert.False(binderCalled);

Expand All @@ -917,7 +920,7 @@ public async Task BindsFeatureFlagSettings()

called = false;

await featureManager.IsEnabledAsync(Enum.GetName(typeof(Features), Features.ConditionalFeature));
await featureManager.IsEnabledAsync(Features.ConditionalFeature);

Assert.True(binderCalled);

Expand Down
22 changes: 11 additions & 11 deletions tests/Tests.FeatureManagement/Features.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
//
namespace Tests.FeatureManagement
{
enum Features
static class Features
{
TargetingTestFeature,
TargetingTestFeatureWithExclusion,
OnTestFeature,
OffTestFeature,
ConditionalFeature,
ConditionalFeature2,
ContextualFeature,
AnyFilterFeature,
AllFilterFeature,
FeatureUsesFiltersWithDuplicatedAlias
public const string TargetingTestFeature = "TargetingTestFeature";
public const string TargetingTestFeatureWithExclusion = "TargetingTestFeatureWithExclusion";
public const string OnTestFeature = "OnTestFeature";
public const string OffTestFeature = "OffTestFeature";
public const string ConditionalFeature = "ConditionalFeature";
public const string ConditionalFeature2 = "ConditionalFeature2";
public const string ContextualFeature = "ContextualFeature";
public const string AnyFilterFeature = "AnyFilterFeature";
public const string AllFilterFeature = "AllFilterFeature";
public const string FeatureUsesFiltersWithDuplicatedAlias = "FeatureUsesFiltersWithDuplicatedAlias";
}
}