66from splitio .models .impressions import Impression
77from splitio .client .listener import ImpressionListenerWrapper
88
9- import pytest
10-
119def utctime_ms_reimplement ():
1210 """Re-implementation of utctime_ms to avoid conflicts with mock/patching."""
1311 return int ((datetime .utcnow () - datetime (1970 , 1 , 1 )).total_seconds () * 1000 )
@@ -155,7 +153,7 @@ def test_standalone_optimized(self, mocker):
155153 ])
156154
157155 def test_standalone_debug (self , mocker ):
158- """Test impressions manager in optimized mode with sdk in standalone mode."""
156+ """Test impressions manager in debug mode with sdk in standalone mode."""
159157
160158 # Mock utc_time function to be able to play with the clock
161159 utc_now = truncate_time (utctime_ms_reimplement ()) + 1800 * 1000
@@ -204,7 +202,7 @@ def test_standalone_debug(self, mocker):
204202 assert len (manager ._strategy ._observer ._cache ._data ) == 3 # distinct impressions seen
205203
206204 def test_standalone_none (self , mocker ):
207- """Test impressions manager in optimized mode with sdk in standalone mode."""
205+ """Test impressions manager in none mode with sdk in standalone mode."""
208206
209207 # Mock utc_time function to be able to play with the clock
210208 utc_now = truncate_time (utctime_ms_reimplement ()) + 1800 * 1000
@@ -270,111 +268,6 @@ def test_standalone_none(self, mocker):
270268 Counter .CountPerFeature ('f1' , truncate_time (utc_now ), 2 )
271269 ])
272270
273- def test_non_standalone_optimized (self , mocker ):
274- """Test impressions manager in optimized mode with sdk in standalone mode."""
275-
276- # Mock utc_time function to be able to play with the clock
277- utc_now = truncate_time (utctime_ms_reimplement ()) + 1800 * 1000
278- utc_time_mock = mocker .Mock ()
279- utc_time_mock .return_value = utc_now
280- mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
281-
282- manager = Manager (None , StrategyOptimizedMode (Counter ())) # no listener
283- assert manager ._strategy ._counter is not None
284- assert manager ._strategy ._observer is not None
285- assert manager ._listener is None
286- assert isinstance (manager ._strategy , StrategyOptimizedMode )
287-
288- # An impression that hasn't happened in the last hour (pt = None) should be tracked
289- imps = manager .process_impressions ([
290- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None ),
291- (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None )
292- ])
293- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
294- Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
295-
296- assert [Counter .CountPerFeature (k .feature , k .timeframe , v )
297- for (k , v ) in manager ._strategy ._counter ._data .items ()] == [
298- Counter .CountPerFeature ('f1' , truncate_time (utc_now - 3 ), 1 ),
299- Counter .CountPerFeature ('f2' , truncate_time (utc_now - 3 ), 1 )]
300-
301- # Tracking the same impression a ms later should be empty
302- imps = manager .process_impressions ([
303- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
304- ])
305- assert imps == []
306-
307- # Tracking a in impression with a different key makes it to the queue
308- imps = manager .process_impressions ([
309- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None )
310- ])
311- assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
312-
313-
314- # Advance the perceived clock one hour
315- old_utc = utc_now # save it to compare captured impressions
316- utc_now += 3600 * 1000
317- utc_time_mock .return_value = utc_now
318-
319- # Track the same impressions but "one hour later"
320- imps = manager .process_impressions ([
321- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
322- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
323- ])
324- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
325- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
326-
327- def test_non_standalone_debug (self , mocker ):
328- """Test impressions manager in optimized mode with sdk in standalone mode."""
329-
330- # Mock utc_time function to be able to play with the clock
331- utc_now = truncate_time (utctime_ms_reimplement ()) + 1800 * 1000
332- utc_time_mock = mocker .Mock ()
333- utc_time_mock .return_value = utc_now
334- mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
335-
336- manager = Manager (None , StrategyDebugMode ()) # no listener
337- assert manager ._listener is None
338- assert manager ._strategy ._observer is not None
339- assert isinstance (manager ._strategy , StrategyDebugMode )
340-
341- # An impression that hasn't happened in the last hour (pt = None) should be tracked
342- imps = manager .process_impressions ([
343- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None ),
344- (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None )
345- ])
346- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
347- Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
348-
349- # Tracking the same impression a ms later should not be empty
350- imps = manager .process_impressions ([
351- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
352- ])
353- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , utc_now - 3 )]
354-
355- # Tracking a in impression with a different key makes it to the queue
356- imps = manager .process_impressions ([
357- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None )
358- ])
359- assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
360-
361- # Advance the perceived clock one hour
362- old_utc = utc_now # save it to compare captured impressions
363- utc_now += 3600 * 1000
364- utc_time_mock .return_value = utc_now
365-
366- # Track the same impressions but "one hour later"
367- imps = manager .process_impressions ([
368- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
369- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
370- ])
371- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
372- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
373-
374- def test_non_standalone_optimized (self , mocker ):
375- """Test impressions manager in none mode with sdk in none-standalone mode."""
376- # TODO: Will add details here when add redis implementation
377-
378271 def test_standalone_optimized_listener (self , mocker ):
379272 """Test impressions manager in optimized mode with sdk in standalone mode."""
380273
@@ -582,127 +475,4 @@ def test_standalone_none_listener(self, mocker):
582475 mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 1 ), None ),
583476 mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , None ), None ),
584477 mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , None ), None )
585- ]
586-
587- def test_non_standalone_optimized_listener (self , mocker ):
588- """Test impressions manager in optimized mode with sdk in standalone mode."""
589-
590- # Mock utc_time function to be able to play with the clock
591- utc_now = truncate_time (utctime_ms_reimplement ()) + 1800 * 1000
592- utc_time_mock = mocker .Mock ()
593- utc_time_mock .return_value = utc_now
594- mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
595-
596- imps = []
597- listener = mocker .Mock (spec = ImpressionListenerWrapper )
598- manager = Manager (listener , StrategyOptimizedMode (Counter ()))
599- assert manager ._strategy ._counter is not None
600- assert manager ._strategy ._observer is not None
601- assert manager ._listener is not None
602- assert isinstance (manager ._strategy , StrategyOptimizedMode )
603-
604- # An impression that hasn't happened in the last hour (pt = None) should be tracked
605- imps = manager .process_impressions ([
606- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None ),
607- (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None )
608- ])
609- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
610- Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
611-
612- assert [Counter .CountPerFeature (k .feature , k .timeframe , v )
613- for (k , v ) in manager ._strategy ._counter ._data .items ()] == [
614- Counter .CountPerFeature ('f1' , truncate_time (utc_now - 3 ), 1 ),
615- Counter .CountPerFeature ('f2' , truncate_time (utc_now - 3 ), 1 )]
616-
617- # Tracking the same impression a ms later should be empty
618- imps = manager .process_impressions ([
619- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
620- ])
621- assert imps == []
622-
623- # Tracking a in impression with a different key makes it to the queue
624- imps = manager .process_impressions ([
625- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None )
626- ])
627- assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
628-
629- old_utc = utc_now # save it to compare captured impressions
630- utc_now += 3600 * 1000
631- utc_time_mock .return_value = utc_now
632-
633- # Track the same impressions but "one hour later"
634- imps = manager .process_impressions ([
635- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
636- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
637- ])
638- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
639- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
640-
641- assert listener .log_impression .mock_calls == [
642- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
643- mocker .call (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
644- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 2 , old_utc - 3 ), None ),
645- mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 1 ), None ),
646- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ), None ),
647- mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 ), None )
648- ]
649-
650- def test_non_standalone_debug_listener (self , mocker ):
651- """Test impressions manager in optimized mode with sdk in standalone mode."""
652-
653- # Mock utc_time function to be able to play with the clock
654- utc_now = truncate_time (utctime_ms_reimplement ()) + 1800 * 1000
655- utc_time_mock = mocker .Mock ()
656- utc_time_mock .return_value = utc_now
657- mocker .patch ('splitio.util.utctime_ms' , new = utc_time_mock )
658-
659- listener = mocker .Mock (spec = ImpressionListenerWrapper )
660- manager = Manager (listener , StrategyDebugMode ())
661- assert manager ._listener is not None
662- assert isinstance (manager ._strategy , StrategyDebugMode )
663-
664- # An impression that hasn't happened in the last hour (pt = None) should be tracked
665- imps = manager .process_impressions ([
666- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None ),
667- (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 ), None )
668- ])
669- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 3 ),
670- Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , utc_now - 3 )]
671-
672- # Tracking the same impression a ms later should return the imp
673- imps = manager .process_impressions ([
674- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
675- ])
676- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , utc_now - 3 )]
677-
678- # Tracking a in impression with a different key makes it to the queue
679- imps = manager .process_impressions ([
680- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None )
681- ])
682- assert imps == [Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 )]
683-
684- # Advance the perceived clock one hour
685- old_utc = utc_now # save it to compare captured impressions
686- utc_now += 3600 * 1000
687- utc_time_mock .return_value = utc_now
688-
689- # Track the same impressions but "one hour later"
690- imps = manager .process_impressions ([
691- (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 ), None ),
692- (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 ), None )
693- ])
694- assert imps == [Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ),
695- Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 )]
696-
697- assert listener .log_impression .mock_calls == [
698- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
699- mocker .call (Impression ('k1' , 'f2' , 'on' , 'l1' , 123 , None , old_utc - 3 ), None ),
700- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 2 , old_utc - 3 ), None ),
701- mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , old_utc - 1 ), None ),
702- mocker .call (Impression ('k1' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 1 , old_utc - 3 ), None ),
703- mocker .call (Impression ('k2' , 'f1' , 'on' , 'l1' , 123 , None , utc_now - 2 , old_utc - 1 ), None )
704- ]
705-
706- def test_non_standalone_none_listener (self , mocker ):
707- """Test impressions manager in none mode with sdk in non-standalone mode."""
708- # TODO: Will add details here when add redis implementation
478+ ]
0 commit comments