|
2 | 2 | #pylint: disable=no-self-use |
3 | 3 |
|
4 | 4 | import json |
| 5 | +import time |
5 | 6 |
|
6 | 7 | from splitio.client.util import get_metadata |
7 | 8 | from splitio.storage.redis import RedisEventsStorage, RedisImpressionsStorage, \ |
@@ -32,12 +33,42 @@ def test_get_split(self, mocker): |
32 | 33 | adapter.reset_mock() |
33 | 34 | from_raw.reset_mock() |
34 | 35 | adapter.get.return_value = None |
35 | | - |
36 | 36 | result = storage.get('some_split') |
37 | 37 | assert result is None |
38 | 38 | assert adapter.get.mock_calls == [mocker.call('SPLITIO.split.some_split')] |
39 | 39 | assert not from_raw.mock_calls |
40 | 40 |
|
| 41 | + def test_get_split_with_cache(self, mocker): |
| 42 | + """Test retrieving a split works.""" |
| 43 | + adapter = mocker.Mock(spec=RedisAdapter) |
| 44 | + adapter.get.return_value = '{"name": "some_split"}' |
| 45 | + from_raw = mocker.Mock() |
| 46 | + mocker.patch('splitio.models.splits.from_raw', new=from_raw) |
| 47 | + |
| 48 | + storage = RedisSplitStorage(adapter, True, 1) |
| 49 | + storage.get('some_split') |
| 50 | + assert adapter.get.mock_calls == [mocker.call('SPLITIO.split.some_split')] |
| 51 | + assert from_raw.mock_calls == [mocker.call({"name": "some_split"})] |
| 52 | + |
| 53 | + # hit the cache: |
| 54 | + storage.get('some_split') |
| 55 | + storage.get('some_split') |
| 56 | + storage.get('some_split') |
| 57 | + assert adapter.get.mock_calls == [mocker.call('SPLITIO.split.some_split')] |
| 58 | + assert from_raw.mock_calls == [mocker.call({"name": "some_split"})] |
| 59 | + |
| 60 | + # Test that a missing split returns None and doesn't call from_raw |
| 61 | + adapter.reset_mock() |
| 62 | + from_raw.reset_mock() |
| 63 | + adapter.get.return_value = None |
| 64 | + |
| 65 | + result = storage.get('some_split') |
| 66 | + assert result is not None |
| 67 | + time.sleep(1) # wait for expiration |
| 68 | + result = storage.get('some_split') |
| 69 | + assert result is None |
| 70 | + assert adapter.get.mock_calls == [mocker.call('SPLITIO.split.some_split')] |
| 71 | + assert not from_raw.mock_calls |
41 | 72 |
|
42 | 73 | def test_get_changenumber(self, mocker): |
43 | 74 | """Test fetching changenumber.""" |
@@ -100,6 +131,22 @@ def test_is_valid_traffic_type(self, mocker): |
100 | 131 | adapter.get.return_value = None |
101 | 132 | assert storage.is_valid_traffic_type('any') is False |
102 | 133 |
|
| 134 | + def test_is_valid_traffic_type_with_cache(self, mocker): |
| 135 | + """Test that traffic type validation works.""" |
| 136 | + adapter = mocker.Mock(spec=RedisAdapter) |
| 137 | + storage = RedisSplitStorage(adapter, True, 1) |
| 138 | + |
| 139 | + adapter.get.return_value = '1' |
| 140 | + assert storage.is_valid_traffic_type('any') is True |
| 141 | + |
| 142 | + adapter.get.return_value = '0' |
| 143 | + assert storage.is_valid_traffic_type('any') is True |
| 144 | + time.sleep(1) |
| 145 | + assert storage.is_valid_traffic_type('any') is False |
| 146 | + |
| 147 | + adapter.get.return_value = None |
| 148 | + time.sleep(1) |
| 149 | + assert storage.is_valid_traffic_type('any') is False |
103 | 150 |
|
104 | 151 |
|
105 | 152 | class RedisSegmentStorageTests(object): |
|
0 commit comments