Skip to content

Commit 934f934

Browse files
authored
fix: set flag key on $flagd.flagKey (#492)
Signed-off-by: Todd Baert <[email protected]>
1 parent d3f5a9d commit 934f934

File tree

3 files changed

+50
-20
lines changed

3 files changed

+50
-20
lines changed

Diff for: providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/targeting/Operator.java

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package dev.openfeature.contrib.providers.flagd.resolver.process.targeting;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
37
import dev.openfeature.sdk.EvaluationContext;
48
import io.github.jamsesso.jsonlogic.JsonLogic;
59
import io.github.jamsesso.jsonlogic.JsonLogicException;
610
import lombok.Getter;
711

8-
import java.util.Map;
912

1013
/**
1114
* Targeting operator wraps JsonLogic handlers and expose a simple API for external layers.
1215
* This helps to isolate external dependencies to this package.
1316
*/
1417
public class Operator {
1518

16-
static final String FLAG_KEY = "$flagKey";
19+
static final String FLAGD_PROPS_KEY = "$flagd";
20+
static final String FLAG_KEY = "flagKey";
1721
static final String TARGET_KEY = "targetingKey";
1822

1923
private final JsonLogic jsonLogicHandler;
@@ -34,8 +38,10 @@ public Operator() {
3438
*/
3539
public Object apply(final String flagKey, final String targetingRule, final EvaluationContext ctx)
3640
throws TargetingRuleException {
41+
final Map<String, String> flagdProperties = new HashMap<>();
42+
flagdProperties.put(FLAG_KEY, flagKey);
3743
final Map<String, Object> valueMap = ctx.asObjectMap();
38-
valueMap.put(FLAG_KEY, flagKey);
44+
valueMap.put(FLAGD_PROPS_KEY, flagdProperties);
3945

4046
try {
4147
return jsonLogicHandler.apply(targetingRule, valueMap);
@@ -53,15 +59,18 @@ static class FlagProperties {
5359
if (from instanceof Map) {
5460
Map<?, ?> dataMap = (Map<?, ?>) from;
5561

56-
Object flagKey = dataMap.get(FLAG_KEY);
62+
final Object flagKey = Optional.ofNullable(dataMap.get(FLAGD_PROPS_KEY))
63+
.filter(flagdProps -> flagdProps instanceof Map)
64+
.map(flagdProps -> ((Map<?, ?>)flagdProps).get(FLAG_KEY))
65+
.orElse(null);
5766

5867
if (flagKey instanceof String) {
5968
this.flagKey = (String) flagKey;
6069
} else {
6170
this.flagKey = null;
6271
}
6372

64-
Object targetKey = dataMap.get(TARGET_KEY);
73+
final Object targetKey = dataMap.get(TARGET_KEY);
6574

6675
if (targetKey instanceof String) {
6776
targetingKey = (String) targetKey;

Diff for: providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/targeting/FractionalTest.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package dev.openfeature.contrib.providers.flagd.resolver.process.targeting;
22

3-
import io.github.jamsesso.jsonlogic.evaluator.JsonLogicEvaluationException;
4-
import org.junit.jupiter.api.Test;
3+
import static dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator.FLAGD_PROPS_KEY;
4+
import static dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator.FLAG_KEY;
5+
import static dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator.TARGET_KEY;
6+
import static org.junit.jupiter.api.Assertions.assertEquals;
7+
import static org.junit.jupiter.api.Assertions.assertNull;
58

69
import java.util.ArrayList;
710
import java.util.HashMap;
811
import java.util.List;
912
import java.util.Map;
1013

11-
import static dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator.FLAG_KEY;
12-
import static dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator.TARGET_KEY;
13-
import static org.junit.jupiter.api.Assertions.assertEquals;
14-
import static org.junit.jupiter.api.Assertions.assertNull;
14+
import org.junit.jupiter.api.Test;
15+
16+
import io.github.jamsesso.jsonlogic.evaluator.JsonLogicEvaluationException;
1517

1618
class FractionalTest {
1719

@@ -48,8 +50,10 @@ void selfContainedFractionalA() throws JsonLogicEvaluationException {
4850
rule.add(bucket1);
4951
rule.add(bucket2);
5052

51-
Map<String, String> data = new HashMap<>();
52-
data.put(FLAG_KEY, "flagA");
53+
Map<String, String> flagdProperties = new HashMap<>();
54+
flagdProperties.put(FLAG_KEY, "flagA");
55+
Map<String, Object> data = new HashMap<>();
56+
data.put(FLAGD_PROPS_KEY, flagdProperties);
5357

5458
// when
5559
Object evaluate = fractional.evaluate(rule, data);
@@ -91,8 +95,10 @@ void selfContainedFractionalB() throws JsonLogicEvaluationException {
9195
rule.add(bucket1);
9296
rule.add(bucket2);
9397

94-
Map<String, String> data = new HashMap<>();
95-
data.put(FLAG_KEY, "flagA");
98+
Map<String, String> flagdProperties = new HashMap<>();
99+
flagdProperties.put(FLAG_KEY, "flagA");
100+
Map<String, Object> data = new HashMap<>();
101+
data.put(FLAGD_PROPS_KEY, flagdProperties);
96102

97103
// when
98104
Object evaluate = fractional.evaluate(rule, data);

Diff for: providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/targeting/OperatorTest.java

+20-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package dev.openfeature.contrib.providers.flagd.resolver.process.targeting;
22

3-
import dev.openfeature.sdk.ImmutableContext;
4-
import dev.openfeature.sdk.Value;
5-
import org.junit.jupiter.api.BeforeAll;
6-
import org.junit.jupiter.api.Test;
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
74

85
import java.util.HashMap;
96
import java.util.Map;
107

11-
import static org.junit.jupiter.api.Assertions.assertEquals;
8+
import org.junit.jupiter.api.BeforeAll;
9+
import org.junit.jupiter.api.Test;
10+
11+
import dev.openfeature.sdk.ImmutableContext;
12+
import dev.openfeature.sdk.Value;
1213

1314
class OperatorTest {
1415
private static Operator OPERATOR;
@@ -18,6 +19,20 @@ static void setUp() {
1819
OPERATOR = new Operator();
1920
}
2021

22+
@Test
23+
void flagKeyPresent() throws TargetingRuleException {
24+
// given
25+
26+
// rule asserting $flagd.flagKey equals the flag key
27+
final String targetingRule = "{\"===\":[{\"var\":[\"$flagd.flagKey\"]},\"some-key\"]}";
28+
29+
// when
30+
Object evalVariant = OPERATOR.apply("some-key", targetingRule, new ImmutableContext());
31+
32+
// then
33+
assertEquals(true, evalVariant);
34+
}
35+
2136
@Test
2237
void fractionalTestA() throws TargetingRuleException {
2338
// given

0 commit comments

Comments
 (0)