88
99from os .path import dirname , join
1010from unittest import TestCase
11+ from splitio .tests .utils import MockUtilsMixin
1112from json import load
1213
1314from splitio .redis_support import (RedisSplitCache , RedisSegmentCache , get_redis )
15+ from redis import StrictRedis
16+ from splitio .clients import Client
17+ from splitio .prefix_decorator import PrefixDecorator
18+ from splitio .brokers import RedisBroker
1419
1520class CacheInterfacesTests (TestCase ):
1621 def setUp (self ):
@@ -42,20 +47,58 @@ def test_split_cache_interface(self):
4247 self ._redis_split_cache .set_change_number (1212 )
4348 self .assertEqual (1212 , self ._redis_split_cache .get_change_number ())
4449
50+ # @TODO This tests should be removed regarding that this is not supported by redis now.
51+ # def testSegmentCacheInterface(self):
52+ # with open(self._segment_changes_file_name) as f:
53+ # self._json = load(f)
54+ # segment_name = self._json['name']
55+ # segment_change_number = self._json['till']
56+ # segment_keys = self._json['added']
4557
58+ # self._redis_segment_cache.set_change_number(segment_name, segment_change_number)
59+ # self.assertEqual(segment_change_number, self._redis_segment_cache.get_change_number(segment_name))
4660
47- def testSegmentCacheInterface (self ):
48- with open (self ._segment_changes_file_name ) as f :
61+ # self._redis_segment_cache.add_keys_to_segment(segment_name, segment_keys)
62+ # self.assertTrue(self._redis_segment_cache.is_in_segment(segment_name, segment_keys[0]))
63+
64+ # self._redis_segment_cache.remove_keys_from_segment(segment_name, [segment_keys[0]])
65+ # self.assertFalse(self._redis_segment_cache.is_in_segment(segment_name, segment_keys[0]))
66+
67+ class ReadOnlyRedisMock (PrefixDecorator ):
68+
69+ def __init__ (self , * args , ** kwargs ):
70+ """
71+ Bases on PrefixDecorator.
72+ """
73+ PrefixDecorator .__init__ (self , * args , ** kwargs )
74+
75+ def sadd (self , name , * values ):
76+ """
77+ Decorated sadd to simulate read only exception error.
78+ """
79+ raise Exception ('ReadOnlyError' )
80+
81+ class RedisReadOnlyTest (TestCase , MockUtilsMixin ):
82+ def setUp (self ):
83+ self ._split_changes_file_name = join (dirname (__file__ ), 'splitChangesReadOnly.json' )
84+
85+ with open (self ._split_changes_file_name ) as f :
4986 self ._json = load (f )
50- segment_name = self ._json ['name' ]
51- segment_change_number = self ._json ['till' ]
52- segment_keys = self ._json ['added' ]
87+ split_definition = self ._json ['splits' ][0 ]
88+ split_name = split_definition ['name' ]
89+
90+ self ._redis = get_redis ({'redisPrefix' : 'test' })
5391
54- self ._redis_segment_cache .set_change_number (segment_name , segment_change_number )
55- self .assertEqual (segment_change_number , self ._redis_segment_cache .get_change_number (segment_name ))
92+ self ._mocked_redis = ReadOnlyRedisMock (self ._redis )
93+ self ._redis_split_cache = RedisSplitCache (self ._redis )
94+ self ._redis_split_cache .add_split (split_name , split_definition )
95+ self ._client = Client (RedisBroker (self ._mocked_redis ))
5696
57- self ._redis_segment_cache .add_keys_to_segment (segment_name , segment_keys )
58- self .assertTrue (self ._redis_segment_cache .is_in_segment (segment_name , segment_keys [0 ]))
97+ self ._impression = mock .MagicMock ()
98+ self ._start = mock .MagicMock ()
99+ self ._operation = mock .MagicMock ()
59100
60- self ._redis_segment_cache .remove_keys_from_segment (segment_name , [segment_keys [0 ]])
61- self .assertFalse (self ._redis_segment_cache .is_in_segment (segment_name , segment_keys [0 ]))
101+ def test_redis_read_only_mode (self ):
102+ self .assertEqual (self ._client .get_treatment ('valid' , 'test_read_only_1' ), 'on' )
103+ self .assertEqual (self ._client .get_treatment ('invalid' , 'test_read_only_1' ), 'off' )
104+ self .assertEqual (self ._client .get_treatment ('valid' , 'test_read_only_1_invalid' ), 'control' )
0 commit comments