Skip to content

Commit 5fd7cce

Browse files
fix: Fix Flagd InProcess Evaluator when no defaultVariant is specified (#513)
Signed-off-by: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
1 parent c0ae96e commit 5fd7cce

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,21 @@ private ResolutionDetails<T> ResolveValue<T>(string flagKey, T defaultValue,
285285
}
286286

287287
// using the returned variant, go through the available variants and take the correct value if it exists
288-
if (variant == null)
288+
if (string.IsNullOrEmpty(variant))
289289
{
290+
if (string.IsNullOrEmpty(flagConfiguration.DefaultVariant))
291+
{
292+
return new ResolutionDetails<T>(
293+
flagKey: flagKey,
294+
defaultValue,
295+
errorType: ErrorType.FlagNotFound,
296+
errorMessage: $"Flag '{flagKey}' has no default variant defined, will use code default",
297+
reason: Reason.Error,
298+
variant: null,
299+
flagMetadata: flagMetadata
300+
);
301+
}
302+
290303
// if variant is null, revert to default
291304
reason = Reason.Default;
292305
flagConfiguration.Variants.TryGetValue(flagConfiguration.DefaultVariant,

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,77 @@ public void TestJsonEvaluatorThrowsOnInvalidFlagMetadata()
332332
{
333333
Assert.Throws<ParseErrorException>(() => _jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, Utils.invalidFlagMetadata));
334334
}
335+
336+
[Fact]
337+
public void TestJsonEvaluatorFlagWithNoDefaultVariantReturnsNotFound()
338+
{
339+
// Arrange
340+
var flag = //lang=json
341+
"""
342+
{
343+
"flags": {
344+
"flag-with-no-default-variant": {
345+
"variants": {
346+
"on": true,
347+
"off": false
348+
},
349+
"notDefaultVariant": "on",
350+
"metadata":{
351+
"string": "1.0.2",
352+
"integer": 2,
353+
"boolean": true,
354+
"float": 0.1
355+
}
356+
}
357+
}
358+
}
359+
""";
360+
361+
this._jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, flag);
362+
363+
// Act
364+
var result = this._jsonEvaluator.ResolveBooleanValueAsync("flag-with-no-default-variant", false);
365+
366+
// Assert
367+
Assert.False(result.Value);
368+
Assert.Equal("flag-with-no-default-variant", result.FlagKey);
369+
Assert.Equal("ERROR", result.Reason);
370+
Assert.Equal(ErrorType.FlagNotFound, result.ErrorType);
371+
Assert.Equal("Flag 'flag-with-no-default-variant' has no default variant defined, will use code default", result.ErrorMessage);
372+
Assert.Null(result.Variant);
373+
Assert.NotNull(result.FlagMetadata);
374+
Assert.Equal("1.0.2", result.FlagMetadata.GetString("string"));
375+
Assert.Equal(2, result.FlagMetadata.GetDouble("integer"));
376+
Assert.Equal(true, result.FlagMetadata.GetBool("boolean"));
377+
Assert.Equal(.1, result.FlagMetadata.GetDouble("float"));
378+
}
379+
380+
[Fact]
381+
public void TestJsonEvaluatorFlagWithEmptyDefaultVariantReturnsNotFound()
382+
{
383+
// Arrange
384+
var flag = //lang=json
385+
"""
386+
{
387+
"flags": {
388+
"flag-with-empty-default-variant": {
389+
"variants": {
390+
"on": true,
391+
"off": false
392+
},
393+
"defaultVariant": ""
394+
}
395+
}
396+
}
397+
""";
398+
399+
this._jsonEvaluator.Sync(FlagConfigurationUpdateType.ALL, flag);
400+
401+
// Act
402+
var result = this._jsonEvaluator.ResolveBooleanValueAsync("flag-with-empty-default-variant", false);
403+
404+
// Assert
405+
Assert.False(result.Value);
406+
Assert.Equal(ErrorType.FlagNotFound, result.ErrorType);
407+
}
335408
}

0 commit comments

Comments
 (0)