diff --git a/src/OpenFeature.Contrib.Providers.Statsig/README.md b/src/OpenFeature.Contrib.Providers.Statsig/README.md
index 070c5571..91e679a3 100644
--- a/src/OpenFeature.Contrib.Providers.Statsig/README.md
+++ b/src/OpenFeature.Contrib.Providers.Statsig/README.md
@@ -94,6 +94,3 @@ The following parameters are mapped to the corresponding Statsig pre-defined par
## Known issues and limitations
- Only `ResolveBooleanValue` implemented for now
-
-- Gate BooleanEvaluation with default value true cannot fallback to true.
- https://github.com/statsig-io/dotnet-sdk/issues/33
diff --git a/src/OpenFeature.Contrib.Providers.Statsig/StatsigProvider.cs b/src/OpenFeature.Contrib.Providers.Statsig/StatsigProvider.cs
index ee9287b7..b6bff9bc 100644
--- a/src/OpenFeature.Contrib.Providers.Statsig/StatsigProvider.cs
+++ b/src/OpenFeature.Contrib.Providers.Statsig/StatsigProvider.cs
@@ -1,8 +1,8 @@
using OpenFeature.Constant;
-using OpenFeature.Error;
using OpenFeature.Model;
using Statsig;
using Statsig.Server;
+using Statsig.Server.Evaluation;
using System;
using System.Threading.Tasks;
@@ -46,13 +46,34 @@ public StatsigProvider(string sdkKey = null, StatsigServerOptions statsigServerO
///
public override Task> ResolveBooleanValue(string flagKey, bool defaultValue, EvaluationContext context = null)
{
- //TODO: defaultvalue = true not yet supported due to https://github.com/statsig-io/dotnet-sdk/issues/33
- if (defaultValue == true)
- throw new FeatureProviderException(ErrorType.General, "defaultvalue = true not supported (https://github.com/statsig-io/dotnet-sdk/issues/33)");
- if (GetStatus() != ProviderStatus.Ready)
- return Task.FromResult(new ResolutionDetails(flagKey, defaultValue, ErrorType.ProviderNotReady));
- var result = ServerDriver.CheckGateSync(context.AsStatsigUser(), flagKey);
- return Task.FromResult(new ResolutionDetails(flagKey, result));
+ var result = ServerDriver.GetFeatureGate(context.AsStatsigUser(), flagKey);
+ var gateFound = false;
+ var responseType = ErrorType.None;
+
+ switch (result.Reason)
+ {
+ case EvaluationReason.Network:
+ case EvaluationReason.LocalOverride:
+ case EvaluationReason.Bootstrap:
+ case EvaluationReason.DataAdapter:
+ gateFound = true;
+ break;
+ case EvaluationReason.Unrecognized:
+ responseType = ErrorType.FlagNotFound;
+ break;
+ case EvaluationReason.Uninitialized:
+ responseType = ErrorType.ProviderNotReady;
+ break;
+ case EvaluationReason.Unsupported:
+ responseType = ErrorType.InvalidContext;
+ break;
+ case EvaluationReason.Error:
+ responseType = ErrorType.General;
+ break;
+ case null:
+ break;
+ }
+ return Task.FromResult(new ResolutionDetails(flagKey, gateFound ? result.Value : defaultValue, responseType));
}
///
diff --git a/test/OpenFeature.Contrib.Providers.Statsig.Test/StatsigProviderTest.cs b/test/OpenFeature.Contrib.Providers.Statsig.Test/StatsigProviderTest.cs
index 73a09b5c..aaf1e23b 100644
--- a/test/OpenFeature.Contrib.Providers.Statsig.Test/StatsigProviderTest.cs
+++ b/test/OpenFeature.Contrib.Providers.Statsig.Test/StatsigProviderTest.cs
@@ -1,6 +1,5 @@
using AutoFixture.Xunit2;
using OpenFeature.Constant;
-using OpenFeature.Error;
using OpenFeature.Model;
using System.Threading.Tasks;
using Xunit;
@@ -41,25 +40,32 @@ public async Task GetBooleanValue_ForFeatureWithContext(bool flagValue, bool exp
[Theory]
[InlineAutoData(true, false)]
[InlineAutoData(false, false)]
- public async Task GetBooleanValue_ForFeatureWithNoContext_ReturnsFalse(bool flagValue, bool expectedValue, string flagName)
+ public async Task GetBooleanValue_ForFeatureWithNoContext_ReturnsDefaultValue(bool flagValue, bool defaultValue, string flagName)
{
// Arrange
await statsigProvider.Initialize(null);
statsigProvider.ServerDriver.OverrideGate(flagName, flagValue);
// Act & Assert
- Assert.Equal(expectedValue, statsigProvider.ResolveBooleanValue(flagName, false).Result.Value);
+ Assert.Equal(defaultValue, statsigProvider.ResolveBooleanValue(flagName, defaultValue).Result.Value);
}
[Theory]
[AutoData]
- public async Task GetBooleanValue_ForFeatureWithDefaultTrue_ThrowsException(string flagName)
+ [InlineAutoData(false)]
+ [InlineAutoData(true)]
+ public async Task GetBooleanValue_ForFeatureWithDefault(bool defaultValue, string flagName, string userId)
{
// Arrange
await statsigProvider.Initialize(null);
- // Act & Assert
- Assert.ThrowsAny(() => statsigProvider.ResolveBooleanValue(flagName, true).Result.Value);
+ var ec = EvaluationContext.Builder().SetTargetingKey(userId).Build();
+
+ // Act
+ var result = await statsigProvider.ResolveBooleanValue(flagName, defaultValue, ec);
+
+ //Assert
+ Assert.Equal(defaultValue, result.Value);
}
[Fact]