Skip to content

Commit 6e6555b

Browse files
committed
Updating all unit tests
1 parent b97a032 commit 6e6555b

File tree

2 files changed

+74
-188
lines changed

2 files changed

+74
-188
lines changed

core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java

Lines changed: 67 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,8 +1586,7 @@ public void trackEventEndToEndForced() throws Exception {
15861586
eventType = noAudienceProjectConfig.getEventTypes().get(0);
15871587
datafile = noAudienceDatafile;
15881588
}
1589-
List<Experiment> allExperiments = new ArrayList<Experiment>();
1590-
allExperiments.add(config.getExperiments().get(0));
1589+
15911590
EventFactory eventFactory = new EventFactory();
15921591
DecisionService spyDecisionService = spy(new DecisionService(mockBucketer,
15931592
mockErrorHandler,
@@ -1601,44 +1600,11 @@ public void trackEventEndToEndForced() throws Exception {
16011600
.withErrorHandler(mockErrorHandler)
16021601
.build();
16031602

1604-
// Bucket to null for all experiments. However, only a subset of the experiments will actually
1605-
// call the bucket function.
1606-
for (Experiment experiment : allExperiments) {
1607-
when(mockBucketer.bucket(experiment, testUserId))
1608-
.thenReturn(null);
1609-
}
1610-
// Force to the first variation for all experiments. However, only a subset of the experiments will actually
1611-
// call get forced.
1612-
for (Experiment experiment : allExperiments) {
1613-
optimizely.projectConfig.setForcedVariation(experiment.getKey(),
1614-
testUserId, experiment.getVariations().get(0).getKey());
1615-
}
1616-
16171603
// call track
16181604
optimizely.track(eventType.getKey(), testUserId);
16191605

1620-
// verify that the bucketing algorithm was called only on experiments corresponding to the specified goal.
1621-
List<Experiment> experimentsForEvent = config.getExperimentsForEventKey(eventType.getKey());
1622-
for (Experiment experiment : allExperiments) {
1623-
if (experiment.isRunning() && experimentsForEvent.contains(experiment)) {
1624-
verify(spyDecisionService).getVariation(experiment, testUserId,
1625-
Collections.<String, String>emptyMap());
1626-
verify(config).getForcedVariation(experiment.getKey(), testUserId);
1627-
} else {
1628-
verify(spyDecisionService, never()).getVariation(experiment, testUserId,
1629-
Collections.<String, String>emptyMap());
1630-
}
1631-
}
1632-
16331606
// verify that dispatchEvent was called
16341607
verify(mockEventHandler).dispatchEvent(any(LogEvent.class));
1635-
1636-
for (Experiment experiment : allExperiments) {
1637-
assertEquals(optimizely.projectConfig.getForcedVariation(experiment.getKey(), testUserId), experiment.getVariations().get(0));
1638-
optimizely.projectConfig.setForcedVariation(experiment.getKey(), testUserId, null);
1639-
assertNull(optimizely.projectConfig.getForcedVariation(experiment.getKey(), testUserId));
1640-
}
1641-
16421608
}
16431609

16441610
/**
@@ -1659,7 +1625,6 @@ public void trackEventEndToEnd() throws Exception {
16591625
eventType = noAudienceProjectConfig.getEventTypes().get(0);
16601626
datafile = noAudienceDatafile;
16611627
}
1662-
List<Experiment> allExperiments = config.getExperiments();
16631628

16641629
EventFactory eventFactory = new EventFactory();
16651630
DecisionService spyDecisionService = spy(new DecisionService(mockBucketer,
@@ -1674,29 +1639,10 @@ public void trackEventEndToEnd() throws Exception {
16741639
.withErrorHandler(mockErrorHandler)
16751640
.build();
16761641

1677-
// Bucket to the first variation for all experiments. However, only a subset of the experiments will actually
1678-
// call the bucket function.
1679-
for (Experiment experiment : allExperiments) {
1680-
when(mockBucketer.bucket(experiment, testUserId))
1681-
.thenReturn(experiment.getVariations().get(0));
1682-
}
16831642

16841643
// call track
16851644
optimizely.track(eventType.getKey(), testUserId);
16861645

1687-
// verify that the bucketing algorithm was called only on experiments corresponding to the specified goal.
1688-
List<Experiment> experimentsForEvent = config.getExperimentsForEventKey(eventType.getKey());
1689-
for (Experiment experiment : allExperiments) {
1690-
if (experiment.isRunning() && experimentsForEvent.contains(experiment)) {
1691-
verify(spyDecisionService).getVariation(experiment, testUserId,
1692-
Collections.<String, String>emptyMap());
1693-
verify(config).getForcedVariation(experiment.getKey(), testUserId);
1694-
} else {
1695-
verify(spyDecisionService, never()).getVariation(experiment, testUserId,
1696-
Collections.<String, String>emptyMap());
1697-
}
1698-
}
1699-
17001646
// verify that dispatchEvent was called
17011647
verify(mockEventHandler).dispatchEvent(any(LogEvent.class));
17021648
}
@@ -2185,11 +2131,9 @@ public void trackEventWithNullOrEmptyEventKey() throws Exception {
21852131
logbackVerifier.expectMessage(Level.INFO, "Not tracking event for user \"" + genericUserId + "\".");
21862132

21872133
}
2188-
2189-
/**
2190-
* Verify that {@link Optimizely#track(String, String, Map)} doesn't dispatch an event when no valid experiments
2191-
* correspond to an event.
2192-
*/
2134+
/**
2135+
* Verify that {@link Optimizely#track(String, String, Map)} dispatches an event always and logs appropriate message
2136+
*/
21932137
@Test
21942138
public void trackEventWithNoValidExperiments() throws Exception {
21952139
EventType eventType;
@@ -2199,22 +2143,33 @@ public void trackEventWithNoValidExperiments() throws Exception {
21992143
eventType = validProjectConfig.getEventNameMapping().get("clicked_purchase");
22002144
}
22012145

2202-
when(mockDecisionService.getVariation(any(Experiment.class), any(String.class), anyMapOf(String.class, String.class)))
2203-
.thenReturn(null);
2146+
// setup a mock event builder to return expected conversion params
2147+
EventFactory mockEventFactory = mock(EventFactory.class);
2148+
22042149
Optimizely optimizely = Optimizely.builder(validDatafile, mockEventHandler)
2205-
.withDecisionService(mockDecisionService)
2206-
.build();
2150+
.withEventBuilder(mockEventFactory)
2151+
.withConfig(validProjectConfig)
2152+
.build();
22072153

22082154
Map<String, String> attributes = new HashMap<String, String>();
22092155
attributes.put("browser_type", "firefox");
22102156

2211-
logbackVerifier.expectMessage(Level.INFO,
2212-
"There are no valid experiments for event \"" + eventType.getKey() + "\" to track.");
2213-
logbackVerifier.expectMessage(Level.INFO, "Not tracking event \"" + eventType.getKey() +
2214-
"\" for user \"userId\".");
2215-
optimizely.track(eventType.getKey(), testUserId, attributes);
2157+
when(mockEventFactory.createConversionEvent(
2158+
eq(validProjectConfig),
2159+
eq(genericUserId),
2160+
eq(eventType.getId()),
2161+
eq(eventType.getKey()),
2162+
eq(attributes),
2163+
eq(Collections.<String, Object>emptyMap())))
2164+
.thenReturn(logEventToDispatch);
22162165

2217-
verify(mockEventHandler, never()).dispatchEvent(any(LogEvent.class));
2166+
logbackVerifier.expectMessage(Level.INFO, "Tracking event \"" + eventType.getKey() +
2167+
"\" for user \"" + genericUserId + "\".");
2168+
logbackVerifier.expectMessage(Level.DEBUG, "Dispatching conversion event to URL test_url with params " +
2169+
testParams + " and payload \"{}\"");
2170+
2171+
optimizely.track(eventType.getKey(), genericUserId, attributes);
2172+
verify(mockEventHandler).dispatchEvent(eq(logEventToDispatch));
22182173
}
22192174

22202175
/**
@@ -2237,7 +2192,7 @@ public void trackDispatchEventThrowsException() throws Exception {
22372192

22382193
/**
22392194
* Verify that {@link Optimizely#track(String, String, Map)}
2240-
* doesn't dispatch events when the event links only to launched experiments
2195+
* dispatches events even if the event links only to launched experiments
22412196
*/
22422197
@Test
22432198
public void trackDoesNotSendEventWhenExperimentsAreLaunchedOnly() throws Exception {
@@ -2247,47 +2202,31 @@ public void trackDoesNotSendEventWhenExperimentsAreLaunchedOnly() throws Excepti
22472202
} else {
22482203
eventType = noAudienceProjectConfig.getEventNameMapping().get("launched_exp_event");
22492204
}
2250-
Bucketer mockBucketAlgorithm = mock(Bucketer.class);
2251-
for (Experiment experiment : noAudienceProjectConfig.getExperiments()) {
2252-
Variation variation = experiment.getVariations().get(0);
2253-
when(mockBucketAlgorithm.bucket(
2254-
eq(experiment),
2255-
eq(genericUserId)))
2256-
.thenReturn(variation);
2257-
}
2205+
2206+
// setup a mock event builder to return expected conversion params
2207+
EventFactory mockEventFactory = mock(EventFactory.class);
22582208

22592209
Optimizely client = Optimizely.builder(noAudienceDatafile, mockEventHandler)
2260-
.withConfig(noAudienceProjectConfig)
2261-
.withBucketing(mockBucketAlgorithm)
2262-
.build();
2210+
.withEventBuilder(mockEventFactory)
2211+
.withConfig(noAudienceProjectConfig)
2212+
.build();
22632213

2264-
List<Experiment> eventExperiments = noAudienceProjectConfig.getExperimentsForEventKey(eventType.getKey());
2265-
for (Experiment experiment : eventExperiments) {
2266-
logbackVerifier.expectMessage(
2267-
Level.INFO,
2268-
"Not tracking event \"" + eventType.getKey() + "\" for experiment \"" + experiment.getKey() +
2269-
"\" because experiment has status \"Launched\"."
2270-
);
2271-
}
2214+
when(mockEventFactory.createConversionEvent(
2215+
eq(noAudienceProjectConfig),
2216+
eq(genericUserId),
2217+
eq(eventType.getId()),
2218+
eq(eventType.getKey()),
2219+
eq(Collections.<String, String>emptyMap()),
2220+
eq(Collections.<String, Object>emptyMap())))
2221+
.thenReturn(logEventToDispatch);
22722222

2273-
logbackVerifier.expectMessage(
2274-
Level.INFO,
2275-
"There are no valid experiments for event \"" + eventType.getKey() + "\" to track."
2276-
);
2277-
logbackVerifier.expectMessage(
2278-
Level.INFO,
2279-
"Not tracking event \"" + eventType.getKey() + "\" for user \"" + genericUserId + "\"."
2280-
);
2223+
logbackVerifier.expectMessage(Level.INFO, "Tracking event \"" + eventType.getKey() +
2224+
"\" for user \"" + genericUserId + "\".");
2225+
logbackVerifier.expectMessage(Level.DEBUG, "Dispatching conversion event to URL test_url with params " +
2226+
testParams + " and payload \"{}\"");
22812227

2282-
// only 1 experiment uses the event and it has a "Launched" status so experimentsForEvent map is empty
2283-
// and the returned event will be null
2284-
// this means we will never call the dispatcher
2285-
client.track(eventType.getKey(), genericUserId, Collections.<String, String>emptyMap());
2286-
// bucket should never be called since experiments are launched so we never get variation for them
2287-
verify(mockBucketAlgorithm, never()).bucket(
2288-
any(Experiment.class),
2289-
anyString());
2290-
verify(mockEventHandler, never()).dispatchEvent(any(LogEvent.class));
2228+
client.track(eventType.getKey(), genericUserId);
2229+
verify(mockEventHandler).dispatchEvent(eq(logEventToDispatch));
22912230
}
22922231

22932232
/**
@@ -2324,25 +2263,14 @@ public void trackDispatchesWhenEventHasLaunchedAndRunningExperiments() throws Ex
23242263
eq(Collections.<String, Object>emptyMap())
23252264
)).thenReturn(logEventToDispatch);
23262265

2327-
List<Experiment> eventExperiments = noAudienceProjectConfig.getExperimentsForEventKey(eventType.getKey());
2328-
for (Experiment experiment : eventExperiments) {
2329-
if (experiment.isLaunched()) {
2330-
logbackVerifier.expectMessage(
2331-
Level.INFO,
2332-
"Not tracking event \"" + eventType.getKey() + "\" for experiment \"" + experiment.getKey() +
2333-
"\" because experiment has status \"Launched\"."
2334-
);
2335-
}
2336-
}
2337-
23382266
// The event has 1 launched experiment and 1 running experiment.
23392267
// It should send a track event with the running experiment
23402268
client.track(eventType.getKey(), genericUserId, Collections.<String, String>emptyMap());
23412269
verify(client.eventHandler).dispatchEvent(eq(logEventToDispatch));
23422270
}
23432271

23442272
/**
2345-
* Verify that an event is not dispatched if a user doesn't satisfy audience conditions for an experiment.
2273+
* Verify that an event is dispatched even if a user doesn't satisfy audience conditions for an experiment.
23462274
*/
23472275
@Test
23482276
public void trackDoesNotSendEventWhenUserDoesNotSatisfyAudiences() throws Exception {
@@ -2352,15 +2280,30 @@ public void trackDoesNotSendEventWhenUserDoesNotSatisfyAudiences() throws Except
23522280
// the audience for the experiments is "NOT firefox" so this user shouldn't satisfy audience conditions
23532281
Map<String, String> attributeMap = Collections.singletonMap(attribute.getKey(), "firefox");
23542282

2283+
// setup a mock event builder to return expected conversion params
2284+
EventFactory mockEventFactory = mock(EventFactory.class);
2285+
23552286
Optimizely client = Optimizely.builder(validDatafile, mockEventHandler)
2356-
.withConfig(validProjectConfig)
2357-
.build();
2287+
.withEventBuilder(mockEventFactory)
2288+
.withConfig(validProjectConfig)
2289+
.build();
23582290

2359-
logbackVerifier.expectMessage(Level.INFO, "There are no valid experiments for event \"" + eventType.getKey()
2360-
+ "\" to track.");
2291+
when(mockEventFactory.createConversionEvent(
2292+
eq(validProjectConfig),
2293+
eq(genericUserId),
2294+
eq(eventType.getId()),
2295+
eq(eventType.getKey()),
2296+
eq(attributeMap),
2297+
eq(Collections.<String, Object>emptyMap())))
2298+
.thenReturn(logEventToDispatch);
2299+
2300+
logbackVerifier.expectMessage(Level.INFO, "Tracking event \"" + eventType.getKey() +
2301+
"\" for user \"" + genericUserId + "\".");
2302+
logbackVerifier.expectMessage(Level.DEBUG, "Dispatching conversion event to URL test_url with params " +
2303+
testParams + " and payload \"{}\"");
23612304

23622305
client.track(eventType.getKey(), genericUserId, attributeMap);
2363-
verify(mockEventHandler, never()).dispatchEvent(any(LogEvent.class));
2306+
verify(mockEventHandler).dispatchEvent(eq(logEventToDispatch));
23642307
}
23652308

23662309
/**

0 commit comments

Comments
 (0)