66from splitio .engine .strategies .strategy_optimized_mode import StrategyOptimizedMode
77from splitio .models .impressions import Impression
88from splitio .client .listener import ImpressionListenerWrapper
9- import pytest
109
1110def utctime_ms_reimplement ():
1211 """Re-implementation of utctime_ms to avoid conflicts with mock/patching."""
@@ -100,8 +99,8 @@ def test_standalone_optimized(self, mocker):
10099 utc_time_mock .return_value = utc_now
101100 mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
102101
103- manager = Manager () # no listener
104- assert manager ._counter is not None
102+ manager = Manager (None , StrategyOptimizedMode ( Counter ()) ) # no listener
103+ assert manager ._strategy . _counter is not None
105104 assert manager ._strategy ._observer is not None
106105 assert manager ._listener is None
107106 assert isinstance (manager ._strategy , StrategyOptimizedMode )
@@ -116,7 +115,7 @@ def test_standalone_optimized(self, mocker):
116115 Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
117116
118117 assert [Counter .CountPerFeature (k .feature , k .timeframe , v )
119- for (k , v ) in manager ._counter ._data .items ()] == [
118+ for (k , v ) in manager ._strategy . _counter ._data .items ()] == [
120119 Counter .CountPerFeature ('f1' , truncate_time (utc_now - 3 ), 1 ),
121120 Counter .CountPerFeature ('f2' , truncate_time (utc_now - 3 ), 1 )]
122121
@@ -146,9 +145,9 @@ def test_standalone_optimized(self, mocker):
146145 Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
147146
148147 assert len (manager ._strategy ._observer ._cache ._data ) == 3 # distinct impressions seen
149- assert len (manager ._counter ._data ) == 3 # 2 distinct features. 1 seen in 2 different timeframes
148+ assert len (manager ._strategy . _counter ._data ) == 3 # 2 distinct features. 1 seen in 2 different timeframes
150149
151- assert set (manager ._counter .pop_all ()) == set ([
150+ assert set (manager ._strategy . _counter .pop_all ()) == set ([
152151 Counter .CountPerFeature ('f1' , truncate_time (old_utc ), 3 ),
153152 Counter .CountPerFeature ('f2' , truncate_time (old_utc ), 1 ),
154153 Counter .CountPerFeature ('f1' , truncate_time (utc_now ), 2 )
@@ -163,8 +162,7 @@ def test_standalone_debug(self, mocker):
163162 utc_time_mock .return_value = utc_now
164163 mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
165164
166- manager = Manager (ImpressionsMode .DEBUG ) # no listener
167- assert manager .get_counts () == []
165+ manager = Manager (None , StrategyDebugMode ()) # no listener
168166 assert manager ._strategy ._observer is not None
169167 assert manager ._listener is None
170168 assert isinstance (manager ._strategy , StrategyDebugMode )
@@ -213,9 +211,9 @@ def test_non_standalone_optimized(self, mocker):
213211 utc_time_mock .return_value = utc_now
214212 mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
215213
216- manager = Manager (ImpressionsMode . OPTIMIZED , False ) # no listener
217- assert manager ._counter is None
218- assert manager ._strategy ._observer is None
214+ manager = Manager (None , StrategyOptimizedMode ( Counter ()) ) # no listener
215+ assert manager ._strategy . _counter is not None
216+ assert manager ._strategy ._observer is not None
219217 assert manager ._listener is None
220218 assert isinstance (manager ._strategy , StrategyOptimizedMode )
221219
@@ -227,19 +225,26 @@ def test_non_standalone_optimized(self, mocker):
227225 assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
228226 Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
229227
230- # Tracking the same impression a ms later should not be empty
228+ assert [Counter .CountPerFeature (k .feature , k .timeframe , v )
229+ for (k , v ) in manager ._strategy ._counter ._data .items ()] == [
230+ Counter .CountPerFeature ('f1' , truncate_time (utc_now - 3 ), 1 ),
231+ Counter .CountPerFeature ('f2' , truncate_time (utc_now - 3 ), 1 )]
232+
233+ # Tracking the same impression a ms later should be empty
231234 imps = manager .process_impressions ([
232235 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
233236 ])
234- assert imps == [Impression ( 'k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ) ]
237+ assert imps == []
235238
236239 # Tracking a in impression with a different key makes it to the queue
237240 imps = manager .process_impressions ([
238241 (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None )
239242 ])
240243 assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
241244
245+
242246 # Advance the perceived clock one hour
247+ old_utc = utc_now # save it to compare captured impressions
243248 utc_now += 3600 * 1000
244249 utc_time_mock .return_value = utc_now
245250
@@ -248,8 +253,8 @@ def test_non_standalone_optimized(self, mocker):
248253 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
249254 (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
250255 ])
251- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ),
252- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 )]
256+ assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
257+ Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
253258
254259 def test_non_standalone_debug (self , mocker ):
255260 """Test impressions manager in optimized mode with sdk in standalone mode."""
@@ -260,10 +265,9 @@ def test_non_standalone_debug(self, mocker):
260265 utc_time_mock .return_value = utc_now
261266 mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
262267
263- manager = Manager (ImpressionsMode .DEBUG , False ) # no listener
264- assert manager .get_counts () == []
265- assert manager ._strategy ._observer is None
268+ manager = Manager (None , StrategyDebugMode ()) # no listener
266269 assert manager ._listener is None
270+ assert manager ._strategy ._observer is not None
267271 assert isinstance (manager ._strategy , StrategyDebugMode )
268272
269273 # An impression that hasn't happened in the last hour (pt = None) should be tracked
@@ -278,7 +282,7 @@ def test_non_standalone_debug(self, mocker):
278282 imps = manager .process_impressions ([
279283 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
280284 ])
281- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 )]
285+ assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , utc_now - 3 )]
282286
283287 # Tracking a in impression with a different key makes it to the queue
284288 imps = manager .process_impressions ([
@@ -287,6 +291,7 @@ def test_non_standalone_debug(self, mocker):
287291 assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
288292
289293 # Advance the perceived clock one hour
294+ old_utc = utc_now # save it to compare captured impressions
290295 utc_now += 3600 * 1000
291296 utc_time_mock .return_value = utc_now
292297
@@ -295,8 +300,8 @@ def test_non_standalone_debug(self, mocker):
295300 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
296301 (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
297302 ])
298- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ),
299- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 )]
303+ assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
304+ Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
300305
301306 def test_standalone_optimized_listener (self , mocker ):
302307 """Test impressions manager in optimized mode with sdk in standalone mode."""
@@ -308,9 +313,8 @@ def test_standalone_optimized_listener(self, mocker):
308313 mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
309314
310315 listener = mocker .Mock (spec = ImpressionListenerWrapper )
311-
312- manager = Manager (listener = listener ) # no listener
313- assert manager ._counter is not None
316+ manager = Manager (listener , StrategyOptimizedMode (Counter ()))
317+ assert manager ._strategy ._counter is not None
314318 assert manager ._strategy ._observer is not None
315319 assert manager ._listener is not None
316320 assert isinstance (manager ._strategy , StrategyOptimizedMode )
@@ -323,7 +327,7 @@ def test_standalone_optimized_listener(self, mocker):
323327 assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
324328 Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
325329 assert [Counter .CountPerFeature (k .feature , k .timeframe , v )
326- for (k , v ) in manager ._counter ._data .items ()] == [
330+ for (k , v ) in manager ._strategy . _counter ._data .items ()] == [
327331 Counter .CountPerFeature ('f1' , truncate_time (utc_now - 3 ), 1 ),
328332 Counter .CountPerFeature ('f2' , truncate_time (utc_now - 3 ), 1 )]
329333
@@ -353,9 +357,9 @@ def test_standalone_optimized_listener(self, mocker):
353357 Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
354358
355359 assert len (manager ._strategy ._observer ._cache ._data ) == 3 # distinct impressions seen
356- assert len (manager ._counter ._data ) == 3 # 2 distinct features. 1 seen in 2 different timeframes
360+ assert len (manager ._strategy . _counter ._data ) == 3 # 2 distinct features. 1 seen in 2 different timeframes
357361
358- assert set (manager ._counter .pop_all ()) == set ([
362+ assert set (manager ._strategy . _counter .pop_all ()) == set ([
359363 Counter .CountPerFeature ('f1' , truncate_time (old_utc ), 3 ),
360364 Counter .CountPerFeature ('f2' , truncate_time (old_utc ), 1 ),
361365 Counter .CountPerFeature ('f1' , truncate_time (utc_now ), 2 )
@@ -381,9 +385,7 @@ def test_standalone_debug_listener(self, mocker):
381385
382386 imps = []
383387 listener = mocker .Mock (spec = ImpressionListenerWrapper )
384- manager = Manager (ImpressionsMode .DEBUG , listener = listener )
385- assert manager .get_counts () == []
386- assert manager ._strategy ._observer is not None
388+ manager = Manager (listener , StrategyDebugMode ())
387389 assert manager ._listener is not None
388390 assert isinstance (manager ._strategy , StrategyDebugMode )
389391
@@ -442,9 +444,9 @@ def test_non_standalone_optimized_listener(self, mocker):
442444
443445 imps = []
444446 listener = mocker .Mock (spec = ImpressionListenerWrapper )
445- manager = Manager (ImpressionsMode . OPTIMIZED , False , listener ) # no listener
446- assert manager ._counter is None
447- assert manager ._strategy ._observer is None
447+ manager = Manager (listener , StrategyOptimizedMode ( Counter ()))
448+ assert manager ._strategy . _counter is not None
449+ assert manager ._strategy ._observer is not None
448450 assert manager ._listener is not None
449451 assert isinstance (manager ._strategy , StrategyOptimizedMode )
450452
@@ -456,19 +458,23 @@ def test_non_standalone_optimized_listener(self, mocker):
456458 assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
457459 Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
458460
459- # Tracking the same impression a ms later should return the imp
461+ assert [Counter .CountPerFeature (k .feature , k .timeframe , v )
462+ for (k , v ) in manager ._strategy ._counter ._data .items ()] == [
463+ Counter .CountPerFeature ('f1' , truncate_time (utc_now - 3 ), 1 ),
464+ Counter .CountPerFeature ('f2' , truncate_time (utc_now - 3 ), 1 )]
465+
466+ # Tracking the same impression a ms later should be empty
460467 imps = manager .process_impressions ([
461468 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
462469 ])
463- assert imps == [Impression ( 'k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ) ]
470+ assert imps == []
464471
465472 # Tracking a in impression with a different key makes it to the queue
466473 imps = manager .process_impressions ([
467474 (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None )
468475 ])
469476 assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
470477
471- # Advance the perceived clock one hour
472478 old_utc = utc_now # save it to compare captured impressions
473479 utc_now += 3600 * 1000
474480 utc_time_mock .return_value = utc_now
@@ -478,16 +484,17 @@ def test_non_standalone_optimized_listener(self, mocker):
478484 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
479485 (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
480486 ])
481- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ),
482- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 )]
487+ assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
488+ Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
489+
483490
484491 assert listener .log_impression .mock_calls == [
485492 mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
486493 mocker .call (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
487- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 2 ), None ),
494+ mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 2 , old_utc - 3 ), None ),
488495 mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 1 ), None ),
489- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
490- mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
496+ mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ), None ),
497+ mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 ), None )
491498 ]
492499
493500 def test_non_standalone_debug_listener (self , mocker ):
@@ -500,9 +507,7 @@ def test_non_standalone_debug_listener(self, mocker):
500507 mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
501508
502509 listener = mocker .Mock (spec = ImpressionListenerWrapper )
503- manager = Manager (ImpressionsMode .DEBUG , False , listener ) # no listener
504- assert manager .get_counts () == []
505- assert manager ._strategy ._observer is None
510+ manager = Manager (listener , StrategyDebugMode ())
506511 assert manager ._listener is not None
507512 assert isinstance (manager ._strategy , StrategyDebugMode )
508513
@@ -518,7 +523,7 @@ def test_non_standalone_debug_listener(self, mocker):
518523 imps = manager .process_impressions ([
519524 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
520525 ])
521- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 )]
526+ assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , utc_now - 3 )]
522527
523528 # Tracking a in impression with a different key makes it to the queue
524529 imps = manager .process_impressions ([
@@ -536,14 +541,14 @@ def test_non_standalone_debug_listener(self, mocker):
536541 (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
537542 (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
538543 ])
539- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ),
540- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 )]
544+ assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
545+ Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
541546
542547 assert listener .log_impression .mock_calls == [
543548 mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
544549 mocker .call (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
545- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 2 ), None ),
550+ mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 2 , old_utc - 3 ), None ),
546551 mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 1 ), None ),
547- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
548- mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
552+ mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ), None ),
553+ mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 ), None )
549554 ]
0 commit comments