Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit b052577

Browse files
committed
Merge pull request #18 from launchdarkly/pk/fix-non-string-rules
fixed logic for rules written using non-string values
2 parents 22f34a2 + 80a883b commit b052577

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

src/main/java/com/launchdarkly/client/LDUser.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,17 @@ public Builder custom(String k, Number n) {
269269
return this;
270270
}
271271

272+
/**
273+
* Add a {@link java.lang.Boolean}-valued custom attribute
274+
* @param k the key for the custom attribute
275+
* @param b the value for the custom attribute
276+
* @return the builder
277+
*/
278+
public Builder custom(String k, Boolean b) {
279+
custom.put(k, new JsonPrimitive(b));
280+
return this;
281+
}
282+
272283
/**
273284
* Add a list of {@link java.lang.String}-valued custom attributes
274285
* @param k the key for the list

src/main/java/com/launchdarkly/client/Variation.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.google.gson.JsonArray;
55
import com.google.gson.JsonElement;
6+
import com.google.gson.JsonPrimitive;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
89

@@ -160,7 +161,14 @@ else if (values.contains(elt.getAsString())) {
160161
return false;
161162
}
162163
else if (custom.isJsonPrimitive()) {
163-
return values.contains(custom.getAsString());
164+
JsonPrimitive prim = custom.getAsJsonPrimitive();
165+
if (prim.isNumber()) {
166+
return values.contains(custom.getAsDouble());
167+
} else if (prim.isBoolean()) {
168+
return values.contains(custom.getAsBoolean());
169+
} else {
170+
return values.contains(custom.getAsString());
171+
}
164172
}
165173
}
166174
return false;

src/test/java/com/launchdarkly/client/FeatureRepTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,34 @@ public class FeatureRepTest {
1212

1313
private final Variation.TargetRule targetGroupOn = new Variation.TargetRule("groups", Arrays.<Object>asList("google", "microsoft"));
1414

15+
// GSON will deserialize numbers as decimals
16+
private final Variation.TargetRule targetFavoriteNumberOn = new Variation.TargetRule("favorite_number", Arrays.<Object>asList(42.0));
17+
18+
private final Variation.TargetRule targetLikesCatsOn = new Variation.TargetRule("likes_cats", Arrays.<Object>asList(true));
19+
1520
private final Variation.TargetRule targetUserOff = new Variation.TargetRule("key", Collections.<Object>singletonList("targetOff@test.com"));
1621

1722
private final Variation.TargetRule targetGroupOff = new Variation.TargetRule("groups", Arrays.<Object>asList("oracle"));
1823

24+
private final Variation.TargetRule targetFavoriteNumberOff = new Variation.TargetRule("favorite_number", Arrays.<Object>asList(33.0));
25+
26+
private final Variation.TargetRule targetLikesDogsOff = new Variation.TargetRule("likes_dogs", Arrays.<Object>asList(false));
27+
1928
private final Variation.TargetRule targetAnonymousOn = new Variation.TargetRule("anonymous", Collections.<Object>singletonList(true));
2029

2130
private final Variation<Boolean> trueVariation = new Variation.Builder<Boolean>(true, 80)
2231
.target(targetUserOn)
2332
.target(targetGroupOn)
2433
.target(targetAnonymousOn)
34+
.target(targetLikesCatsOn)
35+
.target(targetFavoriteNumberOn)
2536
.build();
2637

2738
private final Variation<Boolean> falseVariation = new Variation.Builder<Boolean>(false, 20)
2839
.target(targetUserOff)
2940
.target(targetGroupOff)
41+
.target(targetFavoriteNumberOff)
42+
.target(targetLikesDogsOff)
3043
.build();
3144

3245
private final FeatureRep<Boolean> simpleFlag = new FeatureRep.Builder<Boolean>("Sample flag", "sample.flag")
@@ -95,6 +108,28 @@ public void testFlagForTargetGroupOn() {
95108
assertEquals(true, b);
96109
}
97110

111+
@Test
112+
public void testFlagForTargetNumericTestOn() {
113+
LDUser user = new LDUser.Builder("targetOther@test.com")
114+
.custom("favorite_number", 42.0)
115+
.build();
116+
117+
Boolean b = simpleFlag.evaluate(user);
118+
119+
assertEquals(true, b);
120+
}
121+
122+
@Test
123+
public void testFlagForTargetBooleanTestOn() {
124+
LDUser user = new LDUser.Builder("targetOther@test.com")
125+
.custom("likes_cats", true)
126+
.build();
127+
128+
Boolean b = simpleFlag.evaluate(user);
129+
130+
assertEquals(true, b);
131+
}
132+
98133
@Test
99134
public void testFlagForTargetGroupOff() {
100135
LDUser user = new LDUser.Builder("targetOther@test.com")
@@ -106,6 +141,28 @@ public void testFlagForTargetGroupOff() {
106141
assertEquals(false, b);
107142
}
108143

144+
@Test
145+
public void testFlagForTargetNumericTestOff() {
146+
LDUser user = new LDUser.Builder("targetOther@test.com")
147+
.custom("favorite_number", 33.0)
148+
.build();
149+
150+
Boolean b = simpleFlag.evaluate(user);
151+
152+
assertEquals(false, b);
153+
}
154+
155+
@Test
156+
public void testFlagForTargetBooleanTestOff() {
157+
LDUser user = new LDUser.Builder("targetOther@test.com")
158+
.custom("likes_dogs", false)
159+
.build();
160+
161+
Boolean b = simpleFlag.evaluate(user);
162+
163+
assertEquals(false, b);
164+
}
165+
109166
@Test
110167
public void testDisabledFlagAlwaysOff() {
111168
LDUser user = new LDUser("targetOn@test.com");

0 commit comments

Comments
 (0)