-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathtest_manager.py
More file actions
162 lines (136 loc) · 6.66 KB
/
test_manager.py
File metadata and controls
162 lines (136 loc) · 6.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
"""SDK main manager test module."""
import pytest
import queue
import asyncio
from splitio.client.factory import SplitFactory
from splitio.client.manager import SplitManager, SplitManagerAsync, _LOGGER as _logger
from splitio.models import splits
from splitio.storage.inmemmory import InMemoryTelemetryStorage, InMemoryTelemetryStorageAsync, InMemorySplitStorage, InMemorySplitStorageAsync
from splitio.engine.impressions.impressions import Manager as ImpressionManager
from splitio.engine.telemetry import TelemetryStorageProducer, TelemetryStorageProducerAsync, TelemetryStorageConsumer, TelemetryStorageConsumerAsync
from splitio.recorder.recorder import StandardRecorder, StandardRecorderAsync
from tests.integration import splits_json
class SplitManagerTests(object): # pylint: disable=too-few-public-methods
"""Split manager test cases."""
def test_manager_calls(self, mocker):
telemetry_storage = InMemoryTelemetryStorage()
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
events_queue = queue.Queue()
storage = InMemorySplitStorage(events_queue)
factory = mocker.Mock(spec=SplitFactory)
factory._storages = {'split': storage}
factory._telemetry_init_producer = telemetry_producer._telemetry_init_producer
factory.destroyed = False
factory._waiting_fork.return_value = False
factory.ready = True
manager = SplitManager(factory)
split1 = splits.from_raw(splits_json["splitChange1_1"]['ff']['d'][0])
split2 = splits.from_raw(splits_json["splitChange1_3"]['ff']['d'][0])
storage.update([split1, split2], [], -1)
manager._storage = storage
assert manager.split_names() == ['SPLIT_2', 'SPLIT_1']
assert manager.split('SPLIT_3') is None
assert manager.split('SPLIT_2') == split1.to_split_view()
assert manager.splits() == [split.to_split_view() for split in storage.get_all_splits()]
def test_evaluations_before_running_post_fork(self, mocker):
destroyed_property = mocker.PropertyMock()
destroyed_property.return_value = False
impmanager = mocker.Mock(spec=ImpressionManager)
telemetry_storage = InMemoryTelemetryStorage()
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
recorder = StandardRecorder(impmanager, mocker.Mock(), mocker.Mock(), telemetry_producer.get_telemetry_evaluation_producer(),
telemetry_producer.get_telemetry_runtime_producer())
factory = SplitFactory(mocker.Mock(),
{'splits': mocker.Mock(),
'segments': mocker.Mock(),
'impressions': mocker.Mock(),
'events': mocker.Mock()},
mocker.Mock(),
recorder,
mocker.Mock(),
mocker.Mock(),
impmanager,
mocker.Mock(),
telemetry_producer,
telemetry_producer.get_telemetry_init_producer(),
mocker.Mock(),
True
)
expected_msg = [
mocker.call('Client is not ready - no calls possible')
]
manager = SplitManager(factory)
_logger = mocker.Mock()
mocker.patch('splitio.client.manager._LOGGER', new=_logger)
assert manager.split_names() == []
assert _logger.error.mock_calls == expected_msg
_logger.reset_mock()
assert manager.split('some_feature') is None
assert _logger.error.mock_calls == expected_msg
_logger.reset_mock()
assert manager.splits() == []
assert _logger.error.mock_calls == expected_msg
_logger.reset_mock()
class SplitManagerAsyncTests(object): # pylint: disable=too-few-public-methods
"""Split manager test cases."""
@pytest.mark.asyncio
async def test_manager_calls(self, mocker):
internal_events_queue = asyncio.Queue()
telemetry_storage = InMemoryTelemetryStorageAsync()
telemetry_producer = TelemetryStorageProducerAsync(telemetry_storage)
storage = InMemorySplitStorageAsync(internal_events_queue)
factory = mocker.Mock(spec=SplitFactory)
factory._storages = {'split': storage}
factory._telemetry_init_producer = telemetry_producer._telemetry_init_producer
factory.destroyed = False
factory._waiting_fork.return_value = False
factory.ready = True
manager = SplitManagerAsync(factory)
split1 = splits.from_raw(splits_json["splitChange1_1"]['ff']['d'][0])
split2 = splits.from_raw(splits_json["splitChange1_3"]['ff']['d'][0])
await storage.update([split1, split2], [], -1)
manager._storage = storage
assert await manager.split_names() == ['SPLIT_2', 'SPLIT_1']
assert await manager.split('SPLIT_3') is None
assert await manager.split('SPLIT_2') == split1.to_split_view()
assert await manager.splits() == [split.to_split_view() for split in await storage.get_all_splits()]
@pytest.mark.asyncio
async def test_evaluations_before_running_post_fork(self, mocker):
destroyed_property = mocker.PropertyMock()
destroyed_property.return_value = False
impmanager = mocker.Mock(spec=ImpressionManager)
telemetry_storage = InMemoryTelemetryStorageAsync()
telemetry_producer = TelemetryStorageProducerAsync(telemetry_storage)
recorder = StandardRecorderAsync(impmanager, mocker.Mock(), mocker.Mock(), telemetry_producer.get_telemetry_evaluation_producer(),
telemetry_producer.get_telemetry_runtime_producer())
factory = SplitFactory(mocker.Mock(),
{'splits': mocker.Mock(),
'segments': mocker.Mock(),
'impressions': mocker.Mock(),
'events': mocker.Mock()},
mocker.Mock(),
recorder,
mocker.Mock(),
mocker.Mock(),
impmanager,
mocker.Mock(),
telemetry_producer,
telemetry_producer.get_telemetry_init_producer(),
mocker.Mock(),
True
)
expected_msg = [
mocker.call('Client is not ready - no calls possible')
]
manager = SplitManagerAsync(factory)
_logger = mocker.Mock()
mocker.patch('splitio.client.manager._LOGGER', new=_logger)
assert await manager.split_names() == []
assert _logger.error.mock_calls == expected_msg
_logger.reset_mock()
assert await manager.split('some_feature') is None
assert _logger.error.mock_calls == expected_msg
_logger.reset_mock()
assert await manager.splits() == []
assert _logger.error.mock_calls == expected_msg
_logger.reset_mock()