Skip to content

Commit bfe1ce5

Browse files
authored
feat(pre-requisite): return disabled variation (#45)
* feat(pre-requisite): return disabled variation if pre-toggle is not match or does not exist
1 parent 0009618 commit bfe1ce5

File tree

5 files changed

+102
-22
lines changed

5 files changed

+102
-22
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>com.featureprobe</groupId>
77
<artifactId>server-sdk-java</artifactId>
8-
<version>2.2.2</version>
8+
<version>2.3.0</version>
99
<name>server-sdk-java</name>
1010
<description>FeatureProbe Server Side SDK for Java</description>
1111

src/main/java/com/featureprobe/sdk/server/model/Toggle.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import java.util.Objects;
2828
import java.util.Optional;
2929

30-
public final class Toggle {
30+
public class Toggle {
3131

3232
private String key;
3333

@@ -53,7 +53,7 @@ public final class Toggle {
5353

5454
public EvaluationResult eval(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments,
5555
Object defaultValue, int deep) {
56-
EvaluationResult result = createDefaultResult(user, key, defaultValue, "");
56+
EvaluationResult result = createDisabledResult(user, key, defaultValue);
5757
try {
5858
return doEval(user, toggles, segments, defaultValue, deep);
5959
} catch (PrerequisiteException e) {
@@ -66,23 +66,23 @@ public EvaluationResult eval(FPUser user, Map<String, Toggle> toggles, Map<Strin
6666
}
6767

6868
public EvaluationResult doEval(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments,
69-
Object defaultValue, int deep) {
69+
Object defaultValue, int depth) {
7070

7171
String warning = "";
7272

7373
if (!enabled) {
7474
return createDisabledResult(user, this.key, defaultValue);
7575
}
7676

77-
if (deep <= 0) {
78-
throw new PrerequisiteException("prerequisite deep overflow");
77+
if (depth <= 0) {
78+
throw new PrerequisiteException("prerequisite depth overflow");
7979
}
8080

81-
if (!prerequisite(user, toggles, segments, deep)) {
82-
return createDefaultResult(user, key, defaultValue, warning);
81+
if (!meetPrerequisite(user, toggles, segments, depth)) {
82+
return createDisabledResult(user, key, defaultValue);
8383
}
8484

85-
if (rules != null && rules.size() > 0) {
85+
if (rules != null && !rules.isEmpty()) {
8686
for (int i = 0; i < rules.size(); i++) {
8787
Rule rule = rules.get(i);
8888
HitResult hitResult = rule.hit(user, segments, this.key);
@@ -110,15 +110,16 @@ private EvaluationResult createDefaultResult(FPUser user, String toggleKey, Obje
110110
return defaultResult;
111111
}
112112

113-
private boolean prerequisite(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments, int deep) {
113+
protected boolean meetPrerequisite(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments,
114+
int depth) {
114115
if (Objects.isNull(prerequisites) || prerequisites.isEmpty()) {
115116
return true;
116117
}
117118
for (Prerequisite prerequisite : prerequisites) {
118119
Toggle toggle = toggles.get(prerequisite.getKey());
119120
if (Objects.isNull(toggle))
120121
throw new PrerequisiteException("prerequisite not exist: " + this.key);
121-
EvaluationResult eval = toggle.doEval(user, toggles, segments, null, deep - 1);
122+
EvaluationResult eval = toggle.doEval(user, toggles, segments, null, depth - 1);
122123
if (Objects.isNull(eval.getValue()))
123124
return false;
124125
if (!eval.getValue().equals(prerequisite.getValue()))

src/test/groovy/com/featureprobe/sdk/server/FeatureProbeSpec.groovy

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ class FeatureProbeSpec extends Specification {
4646
}
4747

4848

49-
def "FeatureProbe case test"() {
49+
def "FeatureProbe Server Side Java SDK specification test"() {
5050
when:
5151
def tests = testCase.get("tests").asList()
52+
53+
then:
5254
for (int i = 0; i < tests.size(); i++) {
5355
def scenario = tests.get(i)
5456
def name = scenario.get("scenario").asText()
@@ -118,19 +120,13 @@ class FeatureProbeSpec extends Specification {
118120
def stringDetailRes = featureProbe.stringDetail(toggleKey, user,
119121
defaultValue.asText())
120122
assert stringDetailRes.value == expectValue.asText()
123+
if (expectResult.get("reason") != null) {
124+
assert stringDetailRes.reason.containsIgnoreCase(expectResult.get("reason").asText())
125+
}
121126
break
122127
}
123128
}
124129
}
125-
then:
126-
with(FeatureProbe) {
127-
128-
}
129-
}
130-
131-
132-
def "FeatureProbe repository uninitialized"() {
133-
134130
}
135131

136132
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.featureprobe.sdk.server
2+
3+
import com.featureprobe.sdk.server.model.Serve
4+
import com.featureprobe.sdk.server.model.Toggle
5+
import spock.lang.Specification
6+
7+
class ToggleTest extends Specification {
8+
def toggle = new Toggle()
9+
def user = new FPUser();
10+
11+
def setup() {
12+
toggle.setEnabled(Boolean.TRUE);
13+
toggle.setVariations([0,1])
14+
toggle.setDisabledServe(new Serve(0))
15+
toggle.setDefaultServe(new Serve(1))
16+
}
17+
18+
def "If toggle is disabled serve disabled variation"() {
19+
given:
20+
toggle.setEnabled(Boolean.FALSE)
21+
22+
when:
23+
def result = toggle.doEval(user, null, null, null, 1)
24+
25+
then:
26+
0 == result.variationIndex.get()
27+
}
28+
29+
def "If toggle is enabled serve default variation"() {
30+
given:
31+
toggle.setEnabled(Boolean.TRUE)
32+
33+
when:
34+
def result = toggle.doEval(user, null, null, null, 1)
35+
36+
then:
37+
1 == result.variationIndex.get()
38+
}
39+
40+
def "When meetPrerequisite returns false should act like disabled"() {
41+
setup:
42+
Toggle toggleSpy = Spy()
43+
toggleSpy.enabled = true
44+
45+
final DEFAULT_VARIATION = 1
46+
final DISABLED_VARIATION = 0
47+
48+
toggleSpy.variations = [DEFAULT_VARIATION, DISABLED_VARIATION]
49+
toggleSpy.defaultServe = new Serve(DEFAULT_VARIATION)
50+
toggleSpy.disabledServe = new Serve(DISABLED_VARIATION)
51+
52+
// Make meetPrerequisite return false
53+
toggleSpy.meetPrerequisite(user, null, null, 1) >> false
54+
55+
when:
56+
def result = toggleSpy.doEval(user, null, null, null, 1)
57+
58+
then:
59+
DISABLED_VARIATION == result.variationIndex.get()
60+
}
61+
62+
def "When meetPrerequisite returns true should not act like disabled"() {
63+
setup:
64+
Toggle toggleSpy = Spy()
65+
toggleSpy.enabled = true
66+
final DEFAULT_VARIATION = 1
67+
final DISABLED_VARIATION = 0
68+
69+
toggleSpy.variations = [DEFAULT_VARIATION, DISABLED_VARIATION]
70+
toggleSpy.defaultServe = new Serve(DEFAULT_VARIATION)
71+
toggleSpy.disabledServe = new Serve(DISABLED_VARIATION)
72+
73+
// Make meetPrerequisite return false
74+
toggleSpy.meetPrerequisite(user, null, null, 1) >> true
75+
76+
when:
77+
def result = toggleSpy.doEval(user, null, null, null, 1)
78+
79+
then:
80+
DISABLED_VARIATION != result.variationIndex.get()
81+
}
82+
83+
}

src/test/resources/test

0 commit comments

Comments
 (0)