Skip to content

Commit f623b2b

Browse files
committed
added tests
1 parent 85984ca commit f623b2b

File tree

8 files changed

+126
-256
lines changed

8 files changed

+126
-256
lines changed

splitio/engine/impressions/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
import imp
2-
from splitio.engine.impressions.impressions import Manager as ImpressionsManager
31
from splitio.engine.impressions.impressions import ImpressionsMode
42
from splitio.engine.impressions.manager import Counter as ImpressionsCounter
53
from splitio.engine.impressions.strategies import StrategyNoneMode, StrategyDebugMode, StrategyOptimizedMode
64
from splitio.engine.impressions.adapters import InMemorySenderAdapter, RedisSenderAdapter
75
from splitio.tasks.unique_keys_sync import UniqueKeysSyncTask, ClearFilterSyncTask
86
from splitio.sync.unique_keys import UniqueKeysSynchronizer, ClearFilterSynchronizer
9-
from splitio.sync.impression import ImpressionSynchronizer, ImpressionsCountSynchronizer
10-
from splitio.tasks.impressions_sync import ImpressionsSyncTask, ImpressionsCountSyncTask
7+
from splitio.sync.impression import ImpressionsCountSynchronizer
8+
from splitio.tasks.impressions_sync import ImpressionsCountSyncTask
119

1210

1311
def set_classes(storage_mode, impressions_mode, api_adapter):

splitio/engine/impressions/adapters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ def _build_counters(self, counters):
135135
:return: dict with list of impression count dtos
136136
:rtype: dict
137137
"""
138-
return [json.dumps({
138+
return json.dumps({
139139
'pf': [
140140
{
141141
'f': pf_count.feature,
142142
'm': pf_count.timeframe,
143143
'rc': pf_count.count
144144
} for pf_count in counters
145145
]
146-
})]
146+
})

splitio/engine/impressions/impressions.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@ def __init__(self, listener=None, strategy=None):
1717
"""
1818
Construct a manger to track and forward impressions to the queue.
1919
20-
:param mode: Impressions capturing mode.
21-
:type mode: ImpressionsMode
22-
23-
:param standalone: whether the SDK is running in standalone sending impressions by itself
24-
:type standalone: bool
25-
2620
:param listener: Optional impressions listener that will capture all seen impressions.
2721
:type listener: splitio.client.listener.ImpressionListenerWrapper
22+
23+
:param strategy: Impressions stragetgy instance
24+
:type strategy: (BaseStrategy)
2825
"""
2926

3027
self._strategy = strategy

tests/client/test_factory.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ def test_redis_client_creation(self, mocker):
9595
assert isinstance(factory._get_storage('impressions'), redis.RedisImpressionsStorage)
9696
assert isinstance(factory._get_storage('events'), redis.RedisEventsStorage)
9797

98-
assert factory._sync_manager is None
99-
10098
adapter = factory._get_storage('splits')._redis
10199
assert adapter == factory._get_storage('segments')._redis
102100
assert adapter == factory._get_storage('impressions')._redis

tests/engine/test_impressions.py

Lines changed: 3 additions & 233 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
from splitio.models.impressions import Impression
77
from splitio.client.listener import ImpressionListenerWrapper
88

9-
import pytest
10-
119
def 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

Comments
 (0)