def test_get_key(self): h = db.Hash('h1') h['hk1'] = 'v1' l = db.List('l1') l.append('i1') s = db.Set('s1') s.add('k1') zs = db.ZSet('z1') zs.add({'i1': 1., 'i2': 2.}) h_db = db.get_key('h1') self.assertTrue(isinstance(h_db, Hash)) self.assertEqual(h_db['hk1'], b'v1') l_db = db.get_key('l1') self.assertTrue(isinstance(l_db, List)) self.assertEqual(l_db[0], b'i1') s_db = db.get_key('s1') self.assertTrue(isinstance(s_db, Set)) self.assertEqual(s_db.members(), set((b'k1', ))) z_db = db.get_key('z1') self.assertTrue(isinstance(z_db, ZSet)) self.assertEqual(z_db.score('i1'), 1.)
def test_sort(self): values = ['charlie', 'zaizee', 'mickey', 'huey'] self.lst.extend(values) self.assertEqual(self.lst.sort(), [b'charlie', b'huey', b'mickey', b'zaizee']) self.lst.sort(ordering='DESC', limit=3, store='l_dest') self.assertList(db.List('l_dest'), [b'zaizee', b'mickey', b'huey'])
def test_sort(self): values = ['charlie', 3, 'zaizee', 2, 'mickey', 6, 'huey', 3] self.zs.add(*values) self.assertEqual(self.zs.sort(), [b'charlie', b'huey', b'mickey', b'zaizee']) self.zs.sort(ordering='DESC', limit=3, store='z_dest') res = db.List('z_dest') self.assertEqual(list(res), [b'zaizee', b'mickey', b'huey'])
def test_rate_limit_rollover(self): rl = db.rate_limit('test-rl2', 3, 100) container = db.List('test-rl2:k1') now = time.time() past = now - 101 # Simulate two events. container.extend([now, now]) # Third event goes through OK. self.assertFalse(rl.limit('k1')) # Fourth event is rate-limited. self.assertTrue(rl.limit('k1')) # There are three timestamps in the container. self.assertEqual(len(container), 3) # Hand modify the oldest timestamp to appear as if it happened over # 100 seconds ago. container[-1] = past # We can again perform an action. self.assertFalse(rl.limit('k1')) # We once again have 3 items all within the last 100 seconds, so we # are rate-limited. self.assertTrue(rl.limit('k1')) # There are only 3 items in the container. self.assertEqual(len(container), 3) # The oldest item is the 2nd we added at the beginning of the test. self.assertEqual(float(container[-1]), now) # Remove an item and make the 2nd timestamp (oldest) in the past. This # gives us 2 actions. container.popright() container[-1] = past self.assertFalse(rl.limit('k1')) self.assertFalse(rl.limit('k1')) self.assertTrue(rl.limit('k1'))
def test_slicing(self): self.lst.extend(['i1', 'i2', 'i3', 'i4']) self.assertEqual(self.lst[:1], [b'i1']) self.assertEqual(self.lst[:2], [b'i1', b'i2']) self.assertEqual(self.lst[:-1], [b'i1', b'i2', b'i3']) self.assertEqual(self.lst[1:2], [b'i2']) self.assertEqual(self.lst[1:], [b'i2', b'i3', b'i4']) l = db.List('l1') l.extend(range(10)) # LTRIM, preserve the 1st to last (removes the 0th element). del l[1:-1] self.assertEqual([int(decode(i)) for i in l], [1, 2, 3, 4, 5, 6, 7, 8, 9]) # Trim the list so that it contains only the values within the # specified range. del l[:3] self.assertEqual([int(decode(i)) for i in l], [1, 2, 3])
def test_decorator(self): rl = db.rate_limit('test-rl2', 3, 100) container = db.List('test-rl2:fake-key') def key_fn(*args, **kwargs): return 'fake-key' @rl.rate_limited(key_function=key_fn) def do_test(): return 'OK' now = time.time() container.extend([now, now]) self.assertEqual(do_test(), 'OK') self.assertRaises(RateLimitException, do_test) container.popright() container[-1] = now - 101 self.assertEqual(do_test(), 'OK') self.assertEqual(do_test(), 'OK') self.assertRaises(RateLimitException, do_test)
def test_as_list(self): self.lst.extend(['foo', 'bar']) self.assertEqual(self.lst.as_list(True), ['foo', 'bar']) self.assertEqual(db.List('test').as_list(), [])
def setUp(self): super(TestList, self).setUp() self.lst = db.List('my-list')