Skip to content

Commit 52da860

Browse files
Add included and excluded list
Add test holdout test
1 parent 0213674 commit 52da860

File tree

2 files changed

+20
-93
lines changed

2 files changed

+20
-93
lines changed

core-api/src/main/java/com/optimizely/ab/config/Holdout.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class Holdout implements ExperimentCore {
4949
private final Condition<AudienceIdCondition> audienceConditions;
5050
private final List<Variation> variations;
5151
private final List<TrafficAllocation> trafficAllocation;
52+
private final List<String> includedFlags;
53+
private final List<String> excludedFlags;
5254

5355
private final Map<String, Variation> variationKeyToVariationMap;
5456
private final Map<String, Variation> variationIdToVariationMap;
@@ -76,7 +78,7 @@ public String toString() {
7678

7779
@VisibleForTesting
7880
public Holdout(String id, String key) {
79-
this(id, key, null, Collections.emptyList(), null, Collections.emptyList(), Collections.emptyMap(), Collections.emptyList(), "");
81+
this(id, key, null, Collections.emptyList(), null, Collections.emptyList(), Collections.emptyMap(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), "");
8082
}
8183

8284
@JsonCreator
@@ -87,8 +89,10 @@ public Holdout(@JsonProperty("id") String id,
8789
@JsonProperty("audienceConditions") Condition audienceConditions,
8890
@JsonProperty("variations") List<Variation> variations,
8991
@JsonProperty("forcedVariations") Map<String, String> userIdToVariationKeyMap,
90-
@JsonProperty("trafficAllocation") List<TrafficAllocation> trafficAllocation) {
91-
this(id, key, status, audienceIds, audienceConditions, variations, userIdToVariationKeyMap, trafficAllocation, "");
92+
@JsonProperty("trafficAllocation") List<TrafficAllocation> trafficAllocation,
93+
@JsonProperty("includedFlags") List<String> includedFlags,
94+
@JsonProperty("excludedFlags") List<String> excludedFlags) {
95+
this(id, key, status, audienceIds, audienceConditions, variations, userIdToVariationKeyMap, trafficAllocation, includedFlags, excludedFlags, "");
9296
}
9397

9498
public Holdout(@Nonnull String id,
@@ -99,14 +103,18 @@ public Holdout(@Nonnull String id,
99103
@Nonnull List<Variation> variations,
100104
@Nonnull Map<String, String> userIdToVariationKeyMap,
101105
@Nonnull List<TrafficAllocation> trafficAllocation,
106+
@Nullable List<String> includedFlags,
107+
@Nullable List<String> excludedFlags,
102108
@Nonnull String groupId) {
103109
this.id = id;
104110
this.key = key;
105-
this.status = status == null ? HoldoutStatus.DRAFT.toString() : status;
111+
this.status = status == null ? HoldoutStatus.RUNNING.toString() : status;
106112
this.audienceIds = Collections.unmodifiableList(audienceIds);
107113
this.audienceConditions = audienceConditions;
108114
this.variations = Collections.unmodifiableList(variations);
109115
this.trafficAllocation = Collections.unmodifiableList(trafficAllocation);
116+
this.includedFlags = includedFlags == null ? Collections.emptyList() : Collections.unmodifiableList(includedFlags);
117+
this.excludedFlags = excludedFlags == null ? Collections.emptyList() : Collections.unmodifiableList(excludedFlags);
110118
this.groupId = groupId;
111119
this.userIdToVariationKeyMap = userIdToVariationKeyMap;
112120
this.variationKeyToVariationMap = ProjectConfigUtils.generateNameMapping(variations);

core-api/src/test/java/com/optimizely/ab/config/HoldoutTest.java

Lines changed: 8 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
package com.optimizely.ab.config;
1818

19-
import com.fasterxml.jackson.databind.JsonNode;
20-
import com.fasterxml.jackson.databind.ObjectMapper;
2119
import com.optimizely.ab.config.audience.*;
2220
import org.junit.Test;
2321
import static org.junit.Assert.*;
@@ -27,91 +25,8 @@
2725

2826
public class HoldoutTest {
2927

30-
// MARK: - Sample Data
31-
private static final String id = "11111";
32-
private static final String key = "background";
33-
private static final String status = Holdout.HoldoutStatus.RUNNING.toString();
34-
35-
// Create a simple Variation for testing
36-
private static Variation createVariation() {
37-
return new Variation("553339214", "house", false, Collections.<FeatureVariableUsageInstance>emptyList());
38-
}
39-
40-
// Create a simple TrafficAllocation for testing
41-
private static TrafficAllocation createTrafficAllocation() {
42-
return new TrafficAllocation("553339214", 5000);
43-
}
44-
45-
// MARK: - JSON Parsing Tests
46-
47-
@Test
48-
public void testDeserializeSuccessWithJSONValid() {
49-
// Create a Holdout object directly
50-
List<String> audienceIds = Collections.singletonList("33333");
51-
List<Variation> variations = Collections.singletonList(createVariation());
52-
List<TrafficAllocation> trafficAllocations = Collections.singletonList(createTrafficAllocation());
53-
54-
// Create a simple audience condition
55-
AudienceIdCondition audienceCondition = new AudienceIdCondition("33333");
56-
57-
Holdout holdout = new Holdout(id, key, status, audienceIds, audienceCondition,
58-
variations, Collections.<String, String>emptyMap(), trafficAllocations);
59-
60-
assertEquals(id, holdout.getId());
61-
assertEquals(key, holdout.getKey());
62-
assertEquals(Holdout.HoldoutStatus.RUNNING.toString(), holdout.getStatus());
63-
assertEquals(1, holdout.getVariations().size());
64-
assertEquals(1, holdout.getTrafficAllocation().size());
65-
assertEquals(audienceIds, holdout.getAudienceIds());
66-
assertNotNull(holdout.getAudienceConditions());
67-
assertEquals("", holdout.getLayerId()); // Always empty string
68-
}
69-
7028
@Test
71-
public void testIsActive() {
72-
// Test RUNNING status
73-
Holdout runningHoldout = new Holdout(id, key, Holdout.HoldoutStatus.RUNNING.toString(),
74-
Collections.<String>emptyList(), null, Collections.<Variation>emptyList(),
75-
Collections.<String, String>emptyMap(), Collections.<TrafficAllocation>emptyList());
76-
assertTrue(runningHoldout.isActive());
77-
assertTrue(runningHoldout.isRunning());
78-
79-
// Test DRAFT status
80-
Holdout draftHoldout = new Holdout(id, key, Holdout.HoldoutStatus.DRAFT.toString(),
81-
Collections.<String>emptyList(), null, Collections.<Variation>emptyList(),
82-
Collections.<String, String>emptyMap(), Collections.<TrafficAllocation>emptyList());
83-
assertFalse(draftHoldout.isActive());
84-
assertFalse(draftHoldout.isRunning());
85-
86-
// Test CONCLUDED status
87-
Holdout concludedHoldout = new Holdout(id, key, Holdout.HoldoutStatus.CONCLUDED.toString(),
88-
Collections.<String>emptyList(), null, Collections.<Variation>emptyList(),
89-
Collections.<String, String>emptyMap(), Collections.<TrafficAllocation>emptyList());
90-
assertFalse(concludedHoldout.isActive());
91-
assertFalse(concludedHoldout.isRunning());
92-
93-
// Test ARCHIVED status
94-
Holdout archivedHoldout = new Holdout(id, key, Holdout.HoldoutStatus.ARCHIVED.toString(),
95-
Collections.<String>emptyList(), null, Collections.<Variation>emptyList(),
96-
Collections.<String, String>emptyMap(), Collections.<TrafficAllocation>emptyList());
97-
assertFalse(archivedHoldout.isActive());
98-
assertFalse(archivedHoldout.isRunning());
99-
}
100-
101-
@Test
102-
public void testDefaultStatus() {
103-
// Create a Holdout with null status
104-
Holdout holdout = new Holdout(id, key, null, Collections.<String>emptyList(), null,
105-
Collections.<Variation>emptyList(), Collections.<String, String>emptyMap(),
106-
Collections.<TrafficAllocation>emptyList());
107-
108-
assertEquals(Holdout.HoldoutStatus.DRAFT.toString(), holdout.getStatus());
109-
}
110-
111-
// MARK: - Audience Serialization Tests
112-
113-
@Test
114-
public void testSerializeConditionScenarios() {
29+
public void testStringifyConditionScenarios() {
11530
List<Condition> audienceConditionsScenarios = getAudienceConditionsList();
11631
Map<Integer, String> expectedScenarioStringsMap = getExpectedScenariosMap();
11732
Map<String, String> audiencesMap = new HashMap<>();
@@ -124,7 +39,8 @@ public void testSerializeConditionScenarios() {
12439

12540
if (expectedScenarioStringsMap.size() == audienceConditionsScenarios.size()) {
12641
for (int i = 0; i < audienceConditionsScenarios.size() - 1; i++) {
127-
Holdout holdout = makeMockHoldoutWithStatus(Holdout.HoldoutStatus.RUNNING, audienceConditionsScenarios.get(i));
42+
Holdout holdout = makeMockHoldoutWithStatus(Holdout.HoldoutStatus.RUNNING,
43+
audienceConditionsScenarios.get(i));
12844
String audiences = holdout.serializeConditions(audiencesMap);
12945
assertEquals(expectedScenarioStringsMap.get(i+1), audiences);
13046
}
@@ -243,7 +159,8 @@ public List<Condition> getAudienceConditionsList() {
243159

244160
OrCondition scenario12 = new OrCondition(scenario12List);
245161

246-
// Scenario 13 - ["and", ["and", invalidAudienceIdCondition]] which becomes// the scenario of ["and", "and"] and results in empty string.
162+
// Scenario 13 - ["and", ["and", invalidAudienceIdCondition]] which becomes
163+
// the scenario of ["and", "and"] and results in empty string.
247164
AudienceIdCondition invalidAudience = new AudienceIdCondition("5");
248165
List<Condition> invalidIdList = new ArrayList<>();
249166
invalidIdList.add(invalidAudience);
@@ -278,7 +195,9 @@ private Holdout makeMockHoldoutWithStatus(Holdout.HoldoutStatus status, Conditio
278195
audienceConditions,
279196
Collections.<Variation>emptyList(),
280197
Collections.<String, String>emptyMap(),
281-
Collections.<TrafficAllocation>emptyList()
198+
Collections.<TrafficAllocation>emptyList(),
199+
Collections.<String>emptyList(),
200+
Collections.<String>emptyList()
282201
);
283202
}
284203
}

0 commit comments

Comments
 (0)