Skip to content

Commit 38a59f0

Browse files
bacherfltoddbaert
andauthored
chore: additional unit tests for flagd provider (#203)
Signed-off-by: Florian Bacher <[email protected]> Co-authored-by: Todd Baert <[email protected]>
1 parent 5987a5b commit 38a59f0

File tree

3 files changed

+116
-3
lines changed

3 files changed

+116
-3
lines changed

src/OpenFeature.Contrib.Providers.Flagd/Resolver/InProcess/JsonEvaluator.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ private ResolutionDetails<T> ResolveValue<T>(string flagKey, T defaultValue, Eva
183183
// convert the EvaluationContext object into something the JsonLogic evaluator can work with
184184
dynamic contextObj = (object)ConvertToDynamicObject(targetingContext);
185185

186-
// convery whatever is returned to a sring to try to use is an a index to Variants
186+
// convert whatever is returned to a string to try to use it as an index to Variants
187187
var ruleResult = _evaluator.Apply(rule, contextObj);
188188
if (ruleResult is bool)
189189
{
@@ -217,7 +217,7 @@ private ResolutionDetails<T> ResolveValue<T>(string flagKey, T defaultValue, Eva
217217
}
218218
else if (flagConfiguration.Variants.TryGetValue(variant, out var foundVariantValue))
219219
{
220-
// if variant can be found, return it - this could be TARGETING_MATCH or STAIC.
220+
// if variant can be found, return it - this could be TARGETING_MATCH or STATIC.
221221
var value = ExtractFoundVariant<T>(foundVariantValue, flagKey);
222222
return new ResolutionDetails<T>(
223223
flagKey: flagKey,

test/OpenFeature.Contrib.Providers.Flagd.Test/JsonEvaluatorTest.cs

+64
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,70 @@ public void TestJsonEvaluatorDynamicBoolEvaluationUsingFlagdPropertyTimestamp()
108108
Assert.Equal(Reason.TargetingMatch, result.Reason);
109109
}
110110

111+
[Fact]
112+
public void TestJsonEvaluatorDynamicBoolEvaluationSharedEvaluator()
113+
{
114+
var fixture = new Fixture();
115+
116+
var jsonEvaluator = new JsonEvaluator(fixture.Create<string>());
117+
118+
jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, Utils.flags);
119+
120+
var builder = EvaluationContext.Builder().Set("email", "[email protected]");
121+
122+
var result = jsonEvaluator.ResolveBooleanValue("targetingBoolFlagUsingSharedEvaluator", false, builder.Build());
123+
124+
Assert.True(result.Value);
125+
Assert.Equal("bool1", result.Variant);
126+
Assert.Equal(Reason.TargetingMatch, result.Reason);
127+
}
128+
129+
[Fact]
130+
public void TestJsonEvaluatorDynamicBoolEvaluationSharedEvaluatorReturningBoolType()
131+
{
132+
var fixture = new Fixture();
133+
134+
var jsonEvaluator = new JsonEvaluator(fixture.Create<string>());
135+
136+
jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, Utils.flags);
137+
138+
var builder = EvaluationContext.Builder().Set("email", "[email protected]");
139+
140+
var result = jsonEvaluator.ResolveBooleanValue("targetingBoolFlagUsingSharedEvaluatorReturningBoolType", false, builder.Build());
141+
142+
Assert.True(result.Value);
143+
Assert.Equal("true", result.Variant);
144+
Assert.Equal(Reason.TargetingMatch, result.Reason);
145+
}
146+
147+
[Fact]
148+
public void TestJsonEvaluatorDynamicBoolEvaluationWithMissingDefaultVariant()
149+
{
150+
var fixture = new Fixture();
151+
152+
var jsonEvaluator = new JsonEvaluator(fixture.Create<string>());
153+
154+
jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, Utils.flags);
155+
156+
var builder = EvaluationContext.Builder();
157+
158+
Assert.Throws<FeatureProviderException>(() => jsonEvaluator.ResolveBooleanValue("targetingBoolFlagWithMissingDefaultVariant", false, builder.Build()));
159+
}
160+
161+
[Fact]
162+
public void TestJsonEvaluatorDynamicBoolEvaluationWithUnexpectedVariantType()
163+
{
164+
var fixture = new Fixture();
165+
166+
var jsonEvaluator = new JsonEvaluator(fixture.Create<string>());
167+
168+
jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, Utils.flags);
169+
170+
var builder = EvaluationContext.Builder();
171+
172+
Assert.Throws<FeatureProviderException>(() => jsonEvaluator.ResolveBooleanValue("targetingBoolFlagWithUnexpectedVariantType", false, builder.Build()));
173+
}
174+
111175
[Fact]
112176
public void TestJsonEvaluatorDynamicStringEvaluation()
113177
{

test/OpenFeature.Contrib.Providers.Flagd.Test/Utils.cs

+50-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public class Utils
3434
}";
3535

3636
public static string flags = @"{
37+
""$evaluators"":{
38+
""emailWithFaas"": {
39+
""ends_with"": [{""var"":""email""}, ""@faas.com""]
40+
}
41+
},
3742
""flags"": {
3843
""staticBoolFlag"": {
3944
""state"": ""ENABLED"",
@@ -149,7 +154,51 @@ public class Utils
149154
]
150155
}
151156
},
152-
""targetingStringFlag"": {
157+
""targetingBoolFlagUsingSharedEvaluator"": {
158+
""state"": ""ENABLED"",
159+
""variants"": {
160+
""bool1"": true,
161+
""bool2"": false
162+
},
163+
""defaultVariant"": ""bool2"",
164+
""targeting"": {
165+
""if"": [{ $ref: ""emailWithFaas"" }, ""bool1""]
166+
}
167+
},
168+
""targetingBoolFlagUsingSharedEvaluatorReturningBoolType"": {
169+
""state"": ""ENABLED"",
170+
""variants"": {
171+
""true"": true,
172+
""false"": false
173+
},
174+
""defaultVariant"": ""true"",
175+
""targeting"": {
176+
""if"": [{ $ref: ""emailWithFaas"" }, true]
177+
}
178+
},
179+
""targetingBoolFlagWithMissingDefaultVariant"": {
180+
""state"": ""ENABLED"",
181+
""variants"": {
182+
""bool1"": true,
183+
""bool2"": false
184+
},
185+
""defaultVariant"": ""true"",
186+
""targeting"": {
187+
""if"": [{ $ref: ""emailWithFaas"" }, ""bool1""]
188+
}
189+
},
190+
""targetingBoolFlagWithUnexpectedVariantType"": {
191+
""state"": ""ENABLED"",
192+
""variants"": {
193+
""bool1"": 20,
194+
""bool2"": 30
195+
},
196+
""defaultVariant"": ""true"",
197+
""targeting"": {
198+
""if"": [{ $ref: ""emailWithFaas"" }, ""bool1""]
199+
}
200+
},
201+
""targetingStringFlag"": {
153202
""state"": ""ENABLED"",
154203
""variants"": {
155204
""str1"": ""my-string"",

0 commit comments

Comments
 (0)