Skip to content

Commit c3f575a

Browse files
committed
feat: adds support for allVariables calls to return eval reasons
1 parent 4165d15 commit c3f575a

File tree

5 files changed

+68
-7
lines changed

5 files changed

+68
-7
lines changed

src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public <T> Variable<T> variable(DevCycleUser user, String key, T defaultValue) {
166166
if (exception.getMessage().equals("Variable type mismatch, returning default value")) {
167167
variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.VARIABLE_TYPE_MISMATCH));
168168
} else {
169-
variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED));
169+
variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.ERROR));
170170
}
171171
}
172172

src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.devcycle.sdk.server.common.model.Variable.TypeEnum;
44
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
55
import com.fasterxml.jackson.annotation.JsonProperty;
6+
67
import io.swagger.v3.oas.annotations.media.Schema;
78
import lombok.AllArgsConstructor;
89
import lombok.Builder;
@@ -27,4 +28,7 @@ public class BaseVariable {
2728

2829
@Schema(required = true, description = "Variable value can be a string, number, boolean, or JSON")
2930
private Object value;
31+
32+
@Schema(description = "Evaluation reason")
33+
private EvalReason eval;
3034
}

src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,34 @@ public void getVariableByKeyTest() {
111111
}
112112
}
113113

114+
@Test
115+
public void getVariableTypeMismatchTest() {
116+
DevCycleUser user = DevCycleUser.builder()
117+
.userId("j_test")
118+
.build();
119+
120+
String key = "type-mismatch";
121+
122+
when(apiInterface.getVariableByKey(user, key, dvcOptions.getEnableEdgeDB())).thenReturn(dvcApiMock.getVariableByKey(user, key, dvcOptions.getEnableEdgeDB()));
123+
124+
Variable<Boolean> variable;
125+
try {
126+
variable = api.variable(user, key, true);
127+
128+
assertUserDefaultsCorrect(user);
129+
130+
Assert.assertTrue(variable.getValue());
131+
Assert.assertTrue(variable.getIsDefaulted());
132+
133+
EvalReason varEval = variable.getEval();
134+
Assert.assertEquals("DEFAULT", varEval.getReason());
135+
Assert.assertEquals("Variable Type Mismatch", varEval.getDetails());
136+
Assert.assertNull(varEval.getTargetId());
137+
} catch (IllegalArgumentException e) {
138+
e.printStackTrace();
139+
}
140+
}
141+
114142
@Test
115143
public void getVariableValueByKeyTest() {
116144
DevCycleUser user = DevCycleUser.builder()
@@ -145,6 +173,14 @@ public void getVariablesTest() throws DevCycleException {
145173
assertUserDefaultsCorrect(user);
146174

147175
Assert.assertNotNull(variables);
176+
Assert.assertEquals(4, variables.size());
177+
BaseVariable testNumber = variables.get("test-number");
178+
Assert.assertNotNull(testNumber);
179+
Assert.assertEquals(100, (int) testNumber.getValue());
180+
Assert.assertEquals(Variable.TypeEnum.NUMBER, testNumber.getType());
181+
Assert.assertEquals("SPLIT", testNumber.getEval().getReason());
182+
Assert.assertEquals("Random Distribution | User Id", testNumber.getEval().getDetails());
183+
Assert.assertEquals("test_cloud_target_id", testNumber.getEval().getTargetId());
148184
}
149185

150186
@Test

src/test/java/com/devcycle/sdk/server/common/api/DVCApiMock.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.devcycle.sdk.server.common.api;
22

3-
import com.devcycle.sdk.server.common.model.*;
3+
import java.util.Map;
4+
5+
import com.devcycle.sdk.server.common.model.BaseVariable;
6+
import com.devcycle.sdk.server.common.model.DevCycleResponse;
7+
import com.devcycle.sdk.server.common.model.DevCycleUser;
8+
import com.devcycle.sdk.server.common.model.DevCycleUserAndEvents;
9+
import com.devcycle.sdk.server.common.model.Feature;
10+
import com.devcycle.sdk.server.common.model.ProjectConfig;
11+
import com.devcycle.sdk.server.common.model.Variable;
412
import com.devcycle.sdk.server.helpers.TestResponse;
513
import com.devcycle.sdk.server.local.model.EventsBatch;
6-
import retrofit2.Call;
714

8-
import java.util.Map;
15+
import retrofit2.Call;
916

1017
public class DVCApiMock implements IDevCycleApi {
1118

@@ -16,7 +23,7 @@ public Call<Map<String, Feature>> getFeatures(DevCycleUser user, Boolean enabled
1623

1724
@Override
1825
public Call<Variable> getVariableByKey(DevCycleUser user, String key, Boolean enabledEdgeDB) {
19-
return TestResponse.getVariableByKey();
26+
return TestResponse.getVariableByKey(key);
2027
}
2128

2229
@Override

src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,37 +57,51 @@ public static Call<Map<String, BaseVariable>> getVariables() {
5757
.key("test-false")
5858
.value(false)
5959
.type(Variable.TypeEnum.BOOLEAN)
60+
.eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id"))
6061
.build());
6162
variables.put("test-true", BaseVariable.builder()
6263
.id(UUID.randomUUID().toString())
6364
.key("test-true")
6465
.value(true)
6566
.type(Variable.TypeEnum.BOOLEAN)
67+
.eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id"))
6668
.build());
6769
variables.put("test-number", BaseVariable.builder()
6870
.id(UUID.randomUUID().toString())
6971
.key("test-number")
7072
.value(100)
7173
.type(Variable.TypeEnum.NUMBER)
74+
.eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id"))
7275
.build());
7376
variables.put("test-json", BaseVariable.builder()
7477
.id(UUID.randomUUID().toString())
7578
.key("test-json")
7679
.value("{'some':'json''}")
7780
.type(Variable.TypeEnum.JSON)
81+
.eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id"))
7882
.build());
7983

8084
return Calls.response(variables);
8185
}
8286

8387
@SuppressWarnings("unchecked")
84-
public static <T> Call<Variable> getVariableByKey() {
85-
Variable<T> variable = (Variable<T>) Variable.builder()
88+
public static <T> Call<Variable> getVariableByKey(String key) {
89+
Variable<T> variable = null;
90+
if (key.equals("type-mismatch")) {
91+
variable = (Variable<T>) Variable.builder()
92+
.key("type-mismatch")
93+
.value(100)
94+
.type(Variable.TypeEnum.NUMBER)
95+
.eval(new EvalReason("TARGETING_MATCH", "All Users", "test_cloud_target_id"))
96+
.build();
97+
} else {
98+
variable = (Variable<T>) Variable.builder()
8699
.key("test-false")
87100
.value(false)
88101
.type(Variable.TypeEnum.BOOLEAN)
89102
.eval(new EvalReason("TARGETING_MATCH", "All Users", "test_cloud_target_id"))
90103
.build();
104+
}
91105

92106
return Calls.response(variable);
93107
}

0 commit comments

Comments
 (0)