Skip to content

Commit 17b6d2f

Browse files
committed
fixed tests and pluggable fetching flagset
1 parent f483caf commit 17b6d2f

7 files changed

Lines changed: 61 additions & 22 deletions

File tree

splitio/storage/pluggable.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def __init__(self, pluggable_adapter, prefix=None, config_flag_sets=[]):
3636
self._prefix = prefix + "." + self._prefix
3737
self._traffic_type_prefix = prefix + "." + self._traffic_type_prefix
3838
self._feature_flag_till_prefix = prefix + "." + self._feature_flag_till_prefix
39-
self._feature_flag_set_prefix = prefix + "." + self._feature_flag_till_prefix
39+
self._feature_flag_set_prefix = prefix + "." + self._feature_flag_set_prefix
4040

4141
def get(self, feature_flag_name):
4242
"""
@@ -91,13 +91,14 @@ def get_feature_flags_by_sets(self, flag_sets):
9191
return []
9292

9393
keys = [self._feature_flag_set_prefix.format(flag_set=flag_set) for flag_set in sets_to_fetch]
94-
return self._pluggable_adapter.get_many(keys)
94+
result_sets = []
95+
[result_sets.append(set(key)) for key in self._pluggable_adapter.get_many(keys)]
96+
return list(combine_valid_flag_sets(result_sets))
9597
except Exception:
9698
_LOGGER.error('Error fetching feature flag from storage')
9799
_LOGGER.debug('Error: ', exc_info=True)
98100
return None
99101

100-
101102
# TODO: To be added when producer mode is supported
102103
# def put_many(self, splits, change_number):
103104
# """

tests/client/test_client.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,9 @@ def test_get_treatments_by_flag_sets(self, mocker):
441441
mocker.patch('splitio.client.client.utctime_ms', new=lambda: 1000)
442442
mocker.patch('splitio.client.client.get_latency_bucket_index', new=lambda x: 5)
443443
def get_feature_flags_by_sets(flag_sets):
444-
if flag_sets == ['set1', 'set2']:
444+
if sorted(flag_sets) == ['set1', 'set2']:
445445
return ['f1', 'f2']
446-
if flag_sets == ['set3', 'set4']:
446+
if sorted(flag_sets) == ['set3', 'set4']:
447447
return ['f3', 'f4']
448448
if flag_sets == ['set5']:
449449
return ['some_feature']
@@ -465,6 +465,7 @@ def evaluate_features(feature_flag_names, matching_key, bucketing_key, attribute
465465
client._evaluator.evaluate_features = evaluate_features
466466
_logger = mocker.Mock()
467467
client._send_impression_to_listener = mocker.Mock()
468+
# pytest.set_trace()
468469
assert client.get_treatments_by_flag_sets('key', ['set1', 'set2']) == {'f1': 'on', 'f2': 'on'}
469470

470471
impressions_called = impmanager.process_impressions.mock_calls[0][1][0]
@@ -623,9 +624,9 @@ def test_get_treatments_with_config_by_flag_sets(self, mocker):
623624
mocker.patch('splitio.client.client.utctime_ms', new=lambda: 1000)
624625
mocker.patch('splitio.client.client.get_latency_bucket_index', new=lambda x: 5)
625626
def get_feature_flags_by_sets(flag_sets):
626-
if flag_sets == ['set1', 'set2']:
627+
if sorted(flag_sets) == ['set1', 'set2']:
627628
return ['f1', 'f2']
628-
if flag_sets == ['set3', 'set4']:
629+
if sorted(flag_sets) == ['set3', 'set4']:
629630
return ['f3', 'f4']
630631
if flag_sets == ['set5']:
631632
return ['some_feature']

tests/integration/test_client_e2e.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,6 @@ def setup_method(self):
11791179
if split.get('sets') is not None:
11801180
for flag_set in split.get('sets'):
11811181
self.pluggable_storage_adapter.push_items(split_storage._feature_flag_set_prefix.format(flag_set=flag_set), split['name'])
1182-
11831182
self.pluggable_storage_adapter.set(split_storage._feature_flag_till_prefix, data['till'])
11841183

11851184
segment_fn = os.path.join(os.path.dirname(__file__), 'files', 'segmentEmployeesChanges.json')

tests/storage/test_pluggable.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,7 @@ def get_many(self, keys):
8585
returned_keys = []
8686
for key in self._keys:
8787
if key in keys:
88-
if isinstance(self._keys[key], list):
89-
returned_keys.extend(self._keys[key])
90-
else:
91-
returned_keys.append(self._keys[key])
88+
returned_keys.append(self._keys[key])
9289
return returned_keys
9390

9491
def add_items(self, key, added_items):

tests/sync/test_splits_synchronizer.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ def run(x, c):
6363
run._calls = 0
6464
api.fetch_splits.side_effect = run
6565
storage.get_change_number.return_value = -1
66+
class flag_set_filter():
67+
def should_filter():
68+
return False
69+
70+
def intersect(sets):
71+
return True
72+
storage.flag_set_filter = flag_set_filter
73+
storage.flag_set_filter.flag_sets = {}
6674

6775
split_synchronizer = SplitSynchronizer(api, storage)
6876

@@ -87,8 +95,8 @@ def should_filter():
8795

8896
def intersect(sets):
8997
return True
90-
9198
storage.flag_set_filter = flag_set_filter
99+
storage.flag_set_filter.flag_sets = {}
92100

93101
api = mocker.Mock()
94102
def get_changes(*args, **kwargs):
@@ -112,8 +120,10 @@ def get_changes(*args, **kwargs):
112120
split_synchronizer = SplitSynchronizer(api, storage)
113121
split_synchronizer.synchronize_splits()
114122

115-
assert mocker.call(-1, FetchOptions(True)) in api.fetch_splits.mock_calls
116-
assert mocker.call(123, FetchOptions(True)) in api.fetch_splits.mock_calls
123+
assert api.fetch_splits.mock_calls[0][1][0] == -1
124+
assert api.fetch_splits.mock_calls[0][1][1].cache_control_headers == True
125+
assert api.fetch_splits.mock_calls[1][1][0] == 123
126+
assert api.fetch_splits.mock_calls[1][1][1].cache_control_headers == True
117127

118128
inserted_split = storage.update.mock_calls[0][1][0][0]
119129
assert isinstance(inserted_split, Split)
@@ -122,6 +132,14 @@ def get_changes(*args, **kwargs):
122132
def test_not_called_on_till(self, mocker):
123133
"""Test that sync is not called when till is less than previous changenumber"""
124134
storage = mocker.Mock(spec=InMemorySplitStorage)
135+
class flag_set_filter():
136+
def should_filter():
137+
return False
138+
139+
def intersect(sets):
140+
return True
141+
storage.flag_set_filter = flag_set_filter
142+
storage.flag_set_filter.flag_sets = {}
125143

126144
def change_number_mock():
127145
return 2
@@ -184,17 +202,21 @@ def intersect(sets):
184202
return True
185203

186204
storage.flag_set_filter = flag_set_filter
205+
storage.flag_set_filter.flag_sets = {}
187206

188207
split_synchronizer = SplitSynchronizer(api, storage)
189208
split_synchronizer._backoff = Backoff(1, 1)
190209
split_synchronizer.synchronize_splits()
191210

192-
assert mocker.call(-1, FetchOptions(True)) in api.fetch_splits.mock_calls
193-
assert mocker.call(123, FetchOptions(True)) in api.fetch_splits.mock_calls
211+
assert api.fetch_splits.mock_calls[0][1][0] == -1
212+
assert api.fetch_splits.mock_calls[0][1][1].cache_control_headers == True
213+
assert api.fetch_splits.mock_calls[1][1][0] == 123
214+
assert api.fetch_splits.mock_calls[1][1][1].cache_control_headers == True
194215

195216
split_synchronizer._backoff = Backoff(1, 0.1)
196217
split_synchronizer.synchronize_splits(12345)
197-
assert mocker.call(12345, FetchOptions(True, 1234)) in api.fetch_splits.mock_calls
218+
assert api.fetch_splits.mock_calls[3][1][0] == 1234
219+
assert api.fetch_splits.mock_calls[3][1][1].cache_control_headers == True
198220
assert len(api.fetch_splits.mock_calls) == 8 # 2 ok + BACKOFF(2 since==till + 2 re-attempts) + CDN(2 since==till)
199221

200222
inserted_split = storage.update.mock_calls[0][1][0][0]

tests/sync/test_synchronizer.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ class SynchronizerTests(object):
2323
def test_sync_all_failed_splits(self, mocker):
2424
api = mocker.Mock()
2525
storage = mocker.Mock()
26+
class flag_set_filter():
27+
def should_filter():
28+
return False
29+
def intersect(sets):
30+
return True
31+
storage.flag_set_filter = flag_set_filter
32+
storage.flag_set_filter.flag_sets = {}
2633

2734
def run(x, c):
2835
raise APIException("something broke")
@@ -41,6 +48,13 @@ def run(x, c):
4148
def test_sync_all_failed_splits_with_flagsets(self, mocker):
4249
api = mocker.Mock()
4350
storage = mocker.Mock()
51+
class flag_set_filter():
52+
def should_filter():
53+
return False
54+
def intersect(sets):
55+
return True
56+
storage.flag_set_filter = flag_set_filter
57+
storage.flag_set_filter.flag_sets = {}
4458

4559
def run(x, c):
4660
raise APIException("something broke", 414)
@@ -164,11 +178,11 @@ def test_sync_all(self, mocker):
164178
class flag_set_filter():
165179
def should_filter():
166180
return False
167-
168181
def intersect(sets):
169182
return True
170-
171183
split_storage.flag_set_filter = flag_set_filter
184+
split_storage.flag_set_filter.flag_sets = {}
185+
172186
split_api = mocker.Mock()
173187
split_api.fetch_splits.return_value = {'splits': self.splits, 'since': 123,
174188
'till': 123}

tests/tasks/test_split_sync.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def should_filter():
3232
def intersect(sets):
3333
return True
3434
storage.flag_set_filter = flag_set_filter
35+
storage.flag_set_filter.flag_sets = {}
3536

3637
api = mocker.Mock()
3738
splits = [{
@@ -97,8 +98,12 @@ def get_changes(*args, **kwargs):
9798
task.stop(stop_event)
9899
stop_event.wait()
99100
assert not task.is_running()
100-
assert mocker.call(-1, fetch_options) in api.fetch_splits.mock_calls
101-
assert mocker.call(123, fetch_options) in api.fetch_splits.mock_calls
101+
assert api.fetch_splits.mock_calls[0][1][0] == -1
102+
assert api.fetch_splits.mock_calls[0][1][1].cache_control_headers == True
103+
assert api.fetch_splits.mock_calls[1][1][0] == 123
104+
assert api.fetch_splits.mock_calls[1][1][1].cache_control_headers == True
105+
# assert mocker.call(-1, fetch_options) in api.fetch_splits.mock_calls
106+
# assert mocker.call(123, fetch_options) in api.fetch_splits.mock_calls
102107

103108
inserted_split = storage.update.mock_calls[0][1][0][0]
104109
assert isinstance(inserted_split, Split)

0 commit comments

Comments
 (0)