@@ -1586,8 +1586,7 @@ public void trackEventEndToEndForced() throws Exception {
1586
1586
eventType = noAudienceProjectConfig .getEventTypes ().get (0 );
1587
1587
datafile = noAudienceDatafile ;
1588
1588
}
1589
- List <Experiment > allExperiments = new ArrayList <Experiment >();
1590
- allExperiments .add (config .getExperiments ().get (0 ));
1589
+
1591
1590
EventFactory eventFactory = new EventFactory ();
1592
1591
DecisionService spyDecisionService = spy (new DecisionService (mockBucketer ,
1593
1592
mockErrorHandler ,
@@ -1601,44 +1600,11 @@ public void trackEventEndToEndForced() throws Exception {
1601
1600
.withErrorHandler (mockErrorHandler )
1602
1601
.build ();
1603
1602
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
-
1617
1603
// call track
1618
1604
optimizely .track (eventType .getKey (), testUserId );
1619
1605
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
-
1633
1606
// verify that dispatchEvent was called
1634
1607
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
-
1642
1608
}
1643
1609
1644
1610
/**
@@ -1659,7 +1625,6 @@ public void trackEventEndToEnd() throws Exception {
1659
1625
eventType = noAudienceProjectConfig .getEventTypes ().get (0 );
1660
1626
datafile = noAudienceDatafile ;
1661
1627
}
1662
- List <Experiment > allExperiments = config .getExperiments ();
1663
1628
1664
1629
EventFactory eventFactory = new EventFactory ();
1665
1630
DecisionService spyDecisionService = spy (new DecisionService (mockBucketer ,
@@ -1674,29 +1639,10 @@ public void trackEventEndToEnd() throws Exception {
1674
1639
.withErrorHandler (mockErrorHandler )
1675
1640
.build ();
1676
1641
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
- }
1683
1642
1684
1643
// call track
1685
1644
optimizely .track (eventType .getKey (), testUserId );
1686
1645
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
-
1700
1646
// verify that dispatchEvent was called
1701
1647
verify (mockEventHandler ).dispatchEvent (any (LogEvent .class ));
1702
1648
}
@@ -2185,11 +2131,9 @@ public void trackEventWithNullOrEmptyEventKey() throws Exception {
2185
2131
logbackVerifier .expectMessage (Level .INFO , "Not tracking event for user \" " + genericUserId + "\" ." );
2186
2132
2187
2133
}
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
+ */
2193
2137
@ Test
2194
2138
public void trackEventWithNoValidExperiments () throws Exception {
2195
2139
EventType eventType ;
@@ -2199,22 +2143,33 @@ public void trackEventWithNoValidExperiments() throws Exception {
2199
2143
eventType = validProjectConfig .getEventNameMapping ().get ("clicked_purchase" );
2200
2144
}
2201
2145
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
+
2204
2149
Optimizely optimizely = Optimizely .builder (validDatafile , mockEventHandler )
2205
- .withDecisionService (mockDecisionService )
2206
- .build ();
2150
+ .withEventBuilder (mockEventFactory )
2151
+ .withConfig (validProjectConfig )
2152
+ .build ();
2207
2153
2208
2154
Map <String , String > attributes = new HashMap <String , String >();
2209
2155
attributes .put ("browser_type" , "firefox" );
2210
2156
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 );
2216
2165
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 ));
2218
2173
}
2219
2174
2220
2175
/**
@@ -2237,7 +2192,7 @@ public void trackDispatchEventThrowsException() throws Exception {
2237
2192
2238
2193
/**
2239
2194
* 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
2241
2196
*/
2242
2197
@ Test
2243
2198
public void trackDoesNotSendEventWhenExperimentsAreLaunchedOnly () throws Exception {
@@ -2247,47 +2202,31 @@ public void trackDoesNotSendEventWhenExperimentsAreLaunchedOnly() throws Excepti
2247
2202
} else {
2248
2203
eventType = noAudienceProjectConfig .getEventNameMapping ().get ("launched_exp_event" );
2249
2204
}
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 );
2258
2208
2259
2209
Optimizely client = Optimizely .builder (noAudienceDatafile , mockEventHandler )
2260
- . withConfig ( noAudienceProjectConfig )
2261
- . withBucketing ( mockBucketAlgorithm )
2262
- .build ();
2210
+ . withEventBuilder ( mockEventFactory )
2211
+ . withConfig ( noAudienceProjectConfig )
2212
+ .build ();
2263
2213
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 );
2272
2222
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 \" {}\" " );
2281
2227
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 ));
2291
2230
}
2292
2231
2293
2232
/**
@@ -2324,25 +2263,14 @@ public void trackDispatchesWhenEventHasLaunchedAndRunningExperiments() throws Ex
2324
2263
eq (Collections .<String , Object >emptyMap ())
2325
2264
)).thenReturn (logEventToDispatch );
2326
2265
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
-
2338
2266
// The event has 1 launched experiment and 1 running experiment.
2339
2267
// It should send a track event with the running experiment
2340
2268
client .track (eventType .getKey (), genericUserId , Collections .<String , String >emptyMap ());
2341
2269
verify (client .eventHandler ).dispatchEvent (eq (logEventToDispatch ));
2342
2270
}
2343
2271
2344
2272
/**
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.
2346
2274
*/
2347
2275
@ Test
2348
2276
public void trackDoesNotSendEventWhenUserDoesNotSatisfyAudiences () throws Exception {
@@ -2352,15 +2280,30 @@ public void trackDoesNotSendEventWhenUserDoesNotSatisfyAudiences() throws Except
2352
2280
// the audience for the experiments is "NOT firefox" so this user shouldn't satisfy audience conditions
2353
2281
Map <String , String > attributeMap = Collections .singletonMap (attribute .getKey (), "firefox" );
2354
2282
2283
+ // setup a mock event builder to return expected conversion params
2284
+ EventFactory mockEventFactory = mock (EventFactory .class );
2285
+
2355
2286
Optimizely client = Optimizely .builder (validDatafile , mockEventHandler )
2356
- .withConfig (validProjectConfig )
2357
- .build ();
2287
+ .withEventBuilder (mockEventFactory )
2288
+ .withConfig (validProjectConfig )
2289
+ .build ();
2358
2290
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 \" {}\" " );
2361
2304
2362
2305
client .track (eventType .getKey (), genericUserId , attributeMap );
2363
- verify (mockEventHandler , never ()) .dispatchEvent (any ( LogEvent . class ));
2306
+ verify (mockEventHandler ) .dispatchEvent (eq ( logEventToDispatch ));
2364
2307
}
2365
2308
2366
2309
/**
0 commit comments