Skip to content

Commit b8e734b

Browse files
committed
add unit test for string and hash
1 parent 29d3f53 commit b8e734b

File tree

5 files changed

+329
-0
lines changed

5 files changed

+329
-0
lines changed

runtest

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
3+
python tests/test_helper.py

tests/rediswrap.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#! /usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# vim:fenc=utf-8
4+
#
5+
# Copyright © 2018 YanMing <***REMOVED***>
6+
#
7+
# Distributed under terms of the MIT license.
8+
9+
"""
10+
redis client wrapper
11+
"""
12+
13+
import redis
14+
15+
class RedisWrapper:
16+
def __init__(self, ip , port):
17+
self.r = redis.StrictRedis(host=ip, port=port)
18+
19+
def get_instance(self):
20+
return self.r

tests/test_hash.py

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
#! /usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# vim:fenc=utf-8
4+
#
5+
# Copyright © 2018 yongman <yming0221@gmail.com>
6+
#
7+
# Distributed under terms of the MIT license.
8+
9+
"""
10+
unit test for hash type
11+
"""
12+
13+
import unittest
14+
import time
15+
from rediswrap import RedisWrapper
16+
17+
class HashTest(unittest.TestCase):
18+
@classmethod
19+
def setUpClass(cls):
20+
print 'connect to 127.0.0.1:7379\n'
21+
cls.r = RedisWrapper('127.0.0.1', 7379).get_instance()
22+
cls.k1 = '__hash1__'
23+
cls.k2 = '__hash2__'
24+
25+
cls.f1 = 'f1'
26+
cls.f2 = 'f2'
27+
cls.f3 = 'f3'
28+
cls.f4 = 'f4'
29+
30+
cls.v1 = 'value1'
31+
cls.v2 = 'value2'
32+
cls.v3 = 'value3'
33+
cls.v4 = 'value4'
34+
35+
def setUp(self):
36+
self.r.execute_command('hclear', self.k1)
37+
self.r.execute_command('hclear', self.k2)
38+
pass
39+
40+
def test_hget(self):
41+
self.assertEqual(self.r.hset(self.k1, self.f1, self.v1), 1)
42+
self.assertEqual(self.v1, self.r.hget(self.k1, self.f1))
43+
44+
def test_hset(self):
45+
self.assertEqual(self.r.hset(self.k1, self.f1, self.v1), 1)
46+
self.assertEqual(self.v1, self.r.hget(self.k1, self.f1))
47+
48+
def test_hexists(self):
49+
self.assertEqual(self.r.hset(self.k1, self.f1, self.v1), 1)
50+
self.assertTrue(self.r.hexists(self.k1, self.f1))
51+
52+
def test_hstrlen(self):
53+
self.assertEqual(self.r.hset(self.k1, self.f1, self.v1), 1)
54+
self.assertEqual(self.r.hstrlen(self.k1, self.f1), len(self.v1))
55+
56+
def test_hlen(self):
57+
prefix = '__'
58+
for i in range(0, 200):
59+
f = '{}{}'.format(prefix, i)
60+
self.assertEqual(self.r.hset(self.k2, f, f), 1)
61+
self.assertEqual(self.r.hlen(self.k2), 200)
62+
63+
def test_hmget(self):
64+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
65+
self.assertListEqual(self.r.hmget(self.k1, self.f1, self.f2, self.f3), [self.v1, self.v2, self.v3])
66+
67+
def test_hdel(self):
68+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
69+
self.assertEqual(self.r.hdel(self.k1, self.f1, self.f2, self.f3, self.f4), 3)
70+
self.assertEqual(self.r.hlen(self.k1), 0)
71+
72+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
73+
self.assertEqual(self.r.hdel(self.k1, self.f1, self.f2), 2)
74+
self.assertEqual(self.r.hlen(self.k1), 1)
75+
76+
def test_hkeys(self):
77+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
78+
self.assertListEqual(self.r.hkeys(self.k1), [self.f1, self.f2, self.f3])
79+
80+
def test_hvals(self):
81+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
82+
self.assertListEqual(self.r.hvals(self.k1), [self.v1, self.v2, self.v3])
83+
84+
def test_hgetall(self):
85+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
86+
self.assertDictEqual(self.r.hgetall(self.k1), {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3})
87+
88+
def test_hclear(self):
89+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
90+
self.assertTrue(self.r.execute_command("HCLEAR", self.k1))
91+
self.assertEqual(self.r.hlen(self.k1), 0)
92+
93+
def test_hpexpire(self):
94+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
95+
# expire in 5s
96+
self.assertEqual(self.r.execute_command("HPEXPIRE", self.k1, 5000), 1)
97+
self.assertLessEqual(self.r.execute_command("HPTTL", self.k1), 5000)
98+
self.assertEqual(self.r.hlen(self.k1), 3)
99+
time.sleep(6)
100+
self.assertEqual(self.r.hlen(self.k1), 0)
101+
102+
def test_pexpireat(self):
103+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
104+
# expire in 5s
105+
ts = int(round(time.time()*1000)) + 5000
106+
self.assertEqual(self.r.execute_command('hpexpireat', self.k1, ts), 1)
107+
self.assertLessEqual(self.r.execute_command('hpttl', self.k1), 5000)
108+
self.assertEqual(self.r.hlen(self.k1), 3)
109+
time.sleep(6)
110+
self.assertEqual(self.r.hlen(self.k1), 0)
111+
112+
def test_expire(self):
113+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
114+
# expire in 5s
115+
self.assertEqual(self.r.execute_command('hexpire', self.k1, 5), 1)
116+
self.assertLessEqual(self.r.execute_command('httl', self.k1), 5)
117+
self.assertEqual(self.r.hlen(self.k1), 3)
118+
time.sleep(6)
119+
self.assertEqual(self.r.hlen(self.k1), 0)
120+
121+
def test_expireat(self):
122+
self.assertTrue(self.r.hmset(self.k1, {self.f1:self.v1, self.f2:self.v2, self.f3:self.v3}))
123+
# expire in 5s
124+
ts = int(round(time.time())) + 5
125+
self.assertEqual(self.r.execute_command('hexpireat', self.k1, ts), 1)
126+
self.assertLessEqual(self.r.execute_command('httl', self.k1), 5)
127+
self.assertEqual(self.r.hlen(self.k1), 3)
128+
time.sleep(6)
129+
self.assertEqual(self.r.hlen(self.k1), 0)
130+
131+
def tearDown(self):
132+
pass
133+
134+
@classmethod
135+
def tearDownClass(cls):
136+
cls.r.execute_command('hclear', cls.k1)
137+
cls.r.execute_command('hclear', cls.k2)
138+
print '\nclean up\n'

tests/test_helper.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#! /usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# vim:fenc=utf-8
4+
#
5+
# Copyright © 2018 YanMing <***REMOVED***>
6+
#
7+
# Distributed under terms of the MIT license.
8+
9+
"""
10+
all unit tests
11+
"""
12+
13+
import unittest
14+
15+
from test_string import StringTest
16+
from test_hash import HashTest
17+
18+
if __name__ == '__main__':
19+
suite = unittest.TestSuite()
20+
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(StringTest))
21+
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(HashTest))
22+
23+
runner = unittest.TextTestRunner(verbosity=2)
24+
runner.run(suite)

tests/test_string.py

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
#! /usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# vim:fenc=utf-8
4+
#
5+
# Copyright © 2018 yongman <yming0221@gmail.com>
6+
#
7+
# Distributed under terms of the MIT license.
8+
9+
"""
10+
unit test for string type
11+
"""
12+
13+
import unittest
14+
import time
15+
from rediswrap import RedisWrapper
16+
17+
class StringTest(unittest.TestCase):
18+
@classmethod
19+
def setUpClass(cls):
20+
print 'connect to 127.0.0.1:7379\n'
21+
cls.r = RedisWrapper('127.0.0.1', 7379).get_instance()
22+
cls.k1 = '__string1__'
23+
cls.v1 = 'value1'
24+
cls.k2 = '__string2__'
25+
cls.v2 = 'value2'
26+
27+
def setUp(self):
28+
self.r.delete(self.k1)
29+
self.r.delete(self.k2)
30+
pass
31+
32+
def test_get(self):
33+
self.assertTrue(self.r.set(self.k1, self.v1))
34+
v1 = self.r.get(self.k1)
35+
self.assertEqual(self.v1, v1, '{} != {}'.format(v1, self.v1))
36+
37+
def test_set(self):
38+
self.assertTrue(self.r.set(self.k1, self.v1))
39+
v1 = self.r.get(self.k1)
40+
self.assertEqual(self.v1, v1, '{} != {}'.format(v1, self.v1))
41+
42+
def test_del(self):
43+
self.assertTrue(self.r.set(self.k1, self.v1))
44+
v1 = self.r.get(self.k1)
45+
self.assertEqual(self.v1, v1, '{} != {}'.format(v1, self.v1))
46+
v1 = self.r.delete(self.k1)
47+
self.assertEqual(v1, 1, '{} != 1'.format(v1))
48+
v1 = self.r.get(self.k1)
49+
self.assertIsNone(v1, '{} != None'.format(v1))
50+
51+
def test_mget(self):
52+
self.assertTrue(self.r.mset({self.k1:self.v1, self.k2:self.v2}))
53+
self.assertListEqual(self.r.mget(self.k1, self.k2), [self.v1, self.v2])
54+
55+
def test_mset(self):
56+
self.assertTrue(self.r.mset({self.k1:self.v1, self.k2:self.v2}))
57+
self.assertListEqual(self.r.mget(self.k1, self.k2), [self.v1, self.v2])
58+
59+
def test_incr(self):
60+
# incr a new key
61+
self.assertEqual(self.r.incr(self.k1), 1)
62+
# incr a valid number key
63+
self.assertEqual(self.r.incr(self.k1), 2)
64+
65+
# incr a invalid number
66+
self.assertTrue(self.r.set(self.k2, self.v2))
67+
68+
with self.assertRaises(Exception) as cm:
69+
self.r.incr(self.k2)
70+
err = cm.exception
71+
self.assertEqual(str(err), 'value is not an integer or out of range')
72+
73+
def test_incrby(self):
74+
self.assertTrue(self.r.set(self.k1, 12345678))
75+
self.assertEqual(self.r.incrby(self.k1, 12345678), 24691356)
76+
77+
def test_decr(self):
78+
# decr a new key
79+
self.assertEqual(self.r.decr(self.k1), -1)
80+
# decr a valid number key
81+
self.assertEqual(self.r.decr(self.k1), -2)
82+
83+
# decr a invalid number
84+
self.assertTrue(self.r.set(self.k2, self.v2))
85+
86+
with self.assertRaises(Exception) as cm:
87+
self.r.decr(self.k2)
88+
err = cm.exception
89+
self.assertEqual(str(err), 'value is not an integer or out of range')
90+
91+
def test_decrby(self):
92+
self.assertTrue(self.r.set(self.k1, 12345678))
93+
self.assertEqual(self.r.decr(self.k1, 12345679), -1)
94+
95+
def test_strlen(self):
96+
self.assertTrue(self.r.set(self.k1, self.v1))
97+
self.assertEqual(self.r.strlen(self.k1), len(self.v1))
98+
99+
def test_pexpire(self):
100+
self.assertTrue(self.r.set(self.k1, self.v1))
101+
# expire in 5s
102+
self.assertTrue(self.r.pexpire(self.k1, 5000))
103+
self.assertLessEqual(self.r.pttl(self.k1), 5000)
104+
self.assertEqual(self.r.get(self.k1), self.v1)
105+
time.sleep(5)
106+
self.assertIsNone(self.r.get(self.k1))
107+
108+
def test_pexpireat(self):
109+
self.assertTrue(self.r.set(self.k1, self.v1))
110+
# expire in 5s
111+
ts = int(round(time.time()*1000)) + 5000
112+
self.assertTrue(self.r.pexpireat(self.k1, ts))
113+
self.assertLessEqual(self.r.pttl(self.k1), 5000)
114+
self.assertEqual(self.r.get(self.k1), self.v1)
115+
time.sleep(5)
116+
self.assertIsNone(self.r.get(self.k1))
117+
118+
def test_expire(self):
119+
self.assertTrue(self.r.set(self.k1, self.v1))
120+
# expire in 5s
121+
self.assertTrue(self.r.expire(self.k1, 5))
122+
self.assertLessEqual(self.r.ttl(self.k1), 5)
123+
self.assertEqual(self.r.get(self.k1), self.v1)
124+
time.sleep(5)
125+
self.assertIsNone(self.r.get(self.k1))
126+
127+
def test_expireat(self):
128+
self.assertTrue(self.r.set(self.k1, self.v1))
129+
# expire in 5s
130+
ts = int(round(time.time())) + 5
131+
self.assertTrue(self.r.expireat(self.k1, ts))
132+
self.assertLessEqual(self.r.ttl(self.k1), 5)
133+
self.assertEqual(self.r.get(self.k1), self.v1)
134+
time.sleep(5)
135+
self.assertIsNone(self.r.get(self.k1))
136+
137+
def tearDown(self):
138+
pass
139+
140+
@classmethod
141+
def tearDownClass(cls):
142+
cls.r.delete(cls.k1)
143+
cls.r.delete(cls.k2)
144+
print '\nclean up\n'

0 commit comments

Comments
 (0)