Skip to content

Commit d9a20fc

Browse files
authored
fix(flipt): Fix FliptProvider to honor server default variant when match is false (#1776)
Signed-off-by: Dariusz Szyszlak <dariusz.szyszlak@gmail.com>
1 parent b20829c commit d9a20fc

3 files changed

Lines changed: 36 additions & 3 deletions

File tree

providers/flipt/src/main/java/dev/openfeature/contrib/providers/flipt/FliptProvider.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,9 @@ private <T> ProviderEvaluation<Value> evaluateVariant(
178178
log.error("Error evaluating variant", e);
179179
throw new GeneralError(e.getMessage());
180180
}
181-
182-
if (!response.isMatch()) {
181+
boolean hasVariantKey =
182+
response.getVariantKey() != null && !response.getVariantKey().isEmpty();
183+
if (!response.isMatch() && !hasVariantKey) {
183184
log.debug("non matching variant for {} : {}", key, response.getReason());
184185
return ProviderEvaluation.<Value>builder()
185186
.value(defaultValue)
@@ -201,7 +202,10 @@ private <T> ProviderEvaluation<Value> evaluateVariant(
201202
return ProviderEvaluation.<Value>builder()
202203
.value(value)
203204
.variant(response.getVariantKey())
204-
.reason(TARGETING_MATCH.name())
205+
.reason(
206+
response.isMatch()
207+
? TARGETING_MATCH.name()
208+
: response.getReason().toString())
205209
.flagMetadata(flagMetadataBuilder.build())
206210
.build();
207211
}

providers/flipt/src/test/java/dev/openfeature/contrib/providers/flipt/FliptProviderTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,25 @@ void getStringVariantEvaluation() {
110110
assertEquals("fallback_str", client.getStringValue("non-existing", "fallback_str", evaluationContext));
111111
}
112112

113+
@Test
114+
void getStringVariantEvaluation_usesServerDefaultVariantWhenNoMatch() {
115+
// Flipt returns match=false but still returns a variantKey (server default variant).
116+
mockFliptAPI("/evaluate/v1/variant", "variant-default-nomatch.json", VARIANT_FLAG_NAME);
117+
118+
MutableContext evaluationContext = new MutableContext();
119+
evaluationContext.setTargetingKey(TARGETING_KEY);
120+
121+
// SDK defaultValue should NOT be used in this case; server default variant should win.
122+
ProviderEvaluation<String> evaluation =
123+
fliptProvider.getStringEvaluation(VARIANT_FLAG_NAME, "sdk-fallback", evaluationContext);
124+
125+
assertEquals("server-default", evaluation.getValue());
126+
assertEquals("server-default", evaluation.getVariant());
127+
128+
// Also verify the OpenFeature client path.
129+
assertEquals("server-default", client.getStringValue(VARIANT_FLAG_NAME, "sdk-fallback", evaluationContext));
130+
}
131+
113132
@Test
114133
void getIntegerEvaluation() {
115134
mockFliptAPI("/evaluate/v1/variant", "variant-int.json", INT_FLAG_NAME);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"match": false,
3+
"reason": "DEFAULT_EVALUATION_REASON",
4+
"requestDurationMillis": 1,
5+
"requestId": "string",
6+
"segmentKeys": [],
7+
"timestamp": "2022-12-03T10:15:30+01:00",
8+
"variantAttachment": "",
9+
"variantKey": "server-default"
10+
}

0 commit comments

Comments
 (0)