rediska 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,261 @@
1
+ shared_examples 'keys' do
2
+ it 'should delete a key' do
3
+ subject.set('key1', '1')
4
+ subject.set('key2', '2')
5
+ subject.del('key1', 'key2')
6
+
7
+ subject.get('key1').should be_nil
8
+ end
9
+
10
+ it 'should delete multiple keys' do
11
+ subject.set('key1', '1')
12
+ subject.set('key2', '2')
13
+ subject.del(['key1', 'key2'])
14
+
15
+ subject.get('key1').should be_nil
16
+ subject.get('key2').should be_nil
17
+ end
18
+
19
+ it 'should error deleting no keys' do
20
+ expect {
21
+ subject.del
22
+ }.to raise_error(Redis::CommandError)
23
+
24
+ expect {
25
+ subject.del []
26
+ }.to raise_error(Redis::CommandError)
27
+ end
28
+
29
+ it 'should determine if a key exists' do
30
+ subject.set('key1', '1')
31
+
32
+ subject.exists('key1').should be_true
33
+ subject.exists('key2').should be_false
34
+ end
35
+
36
+ it "should set a key's time to live in seconds" do
37
+ subject.set('key1', '1')
38
+ subject.expire('key1', 1)
39
+
40
+ subject.ttl('key1').should eq(1)
41
+ end
42
+
43
+ it "should set the expiration for a key as a UNIX timestamp" do
44
+ subject.set('key1', '1')
45
+ subject.expireat('key1', Time.now.to_i + 100)
46
+
47
+ subject.ttl('key1').should_not eq(-1)
48
+ end
49
+
50
+ it 'should not have an expiration after re-set' do
51
+ subject.set('key1', '1')
52
+ subject.expireat('key1', Time.now.to_i + 2)
53
+ subject.set('key1', '1')
54
+
55
+ subject.ttl('key1').should eq(-1)
56
+ end
57
+
58
+ it 'should not have a ttl if expired' do
59
+ subject.set('key1', '1')
60
+ subject.expireat('key1', Time.now.to_i)
61
+
62
+ subject.ttl('key1').should eq(-1)
63
+ end
64
+
65
+ it 'should not find a key if expired' do
66
+ subject.set('key1', '1')
67
+ subject.expireat('key1', Time.now.to_i)
68
+
69
+ subject.get('key1').should be_nil
70
+ end
71
+
72
+ it 'should not find multiple keys if expired' do
73
+ subject.set('key1', '1')
74
+ subject.set('key2', '2')
75
+ subject.expireat('key1', Time.now.to_i)
76
+
77
+ subject.mget('key1', 'key2').should eq([nil, '2'])
78
+ end
79
+
80
+ it 'should only find keys that are not expired' do
81
+ subject.set('key1', '1')
82
+ subject.set('key2', '2')
83
+ subject.expireat('key1', Time.now.to_i)
84
+
85
+ subject.keys.should eq(['key2'])
86
+ end
87
+
88
+ it 'should not exist if expired' do
89
+ subject.set('key1', '1')
90
+ subject.expireat('key1', Time.now.to_i)
91
+
92
+ subject.exists('key1').should be_false
93
+ end
94
+
95
+ it 'should find all keys matching the given pattern' do
96
+ subject.set('key:a', '1')
97
+ subject.set('key:b', '2')
98
+ subject.set('key:c', '3')
99
+ subject.set('akeyd', '4')
100
+ subject.set('key1', '5')
101
+
102
+ subject.mset('database', 1, 'above', 2, 'suitability', 3, 'able', 4)
103
+
104
+ subject.keys('key:*').should =~ ['key:a', 'key:b', 'key:c']
105
+ subject.keys('ab*').should =~ ['above', 'able']
106
+ end
107
+
108
+ it 'should remove the expiration from a key' do
109
+ subject.set('key1', '1')
110
+ subject.expireat('key1', Time.now.to_i + 1)
111
+ subject.persist('key1').should be_true
112
+ subject.persist('key1').should be_false
113
+
114
+ subject.ttl('key1').should eq(-1)
115
+ end
116
+
117
+ it 'should return a random key from the keyspace' do
118
+ subject.set('key1', '1')
119
+ subject.set('key2', '2')
120
+
121
+ ['key1', 'key2'].should include(subject.randomkey)
122
+ end
123
+
124
+ it 'should rename a key' do
125
+ subject.set('key1', '2')
126
+ subject.rename('key1', 'key2')
127
+
128
+ subject.get('key1').should be_nil
129
+ subject.get('key2').should eq('2')
130
+ end
131
+
132
+ it 'should rename a key, only if new key does not exist' do
133
+ subject.set('key1', '1')
134
+ subject.set('key2', '2')
135
+ subject.set('key3', '3')
136
+ subject.renamenx('key1', 'key2')
137
+ subject.renamenx('key3', 'key4')
138
+
139
+ subject.get('key1').should eq('1')
140
+ subject.get('key2').should eq('2')
141
+ subject.get('key3').should be_nil
142
+ subject.get('key4').should eq('3')
143
+ end
144
+
145
+ it 'should sort the elements in a list, set or sorted set' do
146
+ pending 'SORT Command not implemented yet'
147
+ end
148
+
149
+ it 'should determine the type stored at key' do
150
+ subject.set('key1', '1')
151
+
152
+ subject.type('key1').should eq('string')
153
+ subject.type('key0').should eq('none')
154
+ end
155
+
156
+ it 'should convert the value into a string before storing' do
157
+ subject.set('key1', 1)
158
+ subject.get('key1').should eq('1')
159
+
160
+ subject.setex('key2', 30, 1)
161
+ subject.get('key2').should eq('1')
162
+
163
+ subject.getset('key3', 1)
164
+ subject.get('key3').should eq('1')
165
+ end
166
+
167
+ it "should return 'OK' for the setex command" do
168
+ subject.setex('key4', 30, 1).should eq('OK')
169
+ end
170
+
171
+ it 'should convert the key into a string before storing' do
172
+ subject.set(123, 'foo')
173
+ subject.keys.should include('123')
174
+ subject.get('123').should eq('foo')
175
+
176
+ subject.setex(456, 30, 'foo')
177
+ subject.keys.should include('456')
178
+ subject.get('456').should eq('foo')
179
+
180
+ subject.getset(789, 'foo')
181
+ subject.keys.should include('789')
182
+ subject.get('789').should eq('foo')
183
+ end
184
+
185
+ it 'should only operate against keys containing string values' do
186
+ subject.sadd('key1', 'one')
187
+
188
+ expect {
189
+ subject.get('key1')
190
+ }.to raise_error(Redis::CommandError, 'ERR Operation against a key holding the wrong kind of value')
191
+
192
+ expect {
193
+ subject.getset('key1', 1)
194
+ }.to raise_error(Redis::CommandError, 'ERR Operation against a key holding the wrong kind of value')
195
+
196
+ subject.hset('key2', 'one', 'two')
197
+
198
+ expect {
199
+ subject.get('key2')
200
+ }.to raise_error(Redis::CommandError, 'ERR Operation against a key holding the wrong kind of value')
201
+
202
+ expect {
203
+ subject.getset('key2', 1)
204
+ }.to raise_error(Redis::CommandError, 'ERR Operation against a key holding the wrong kind of value')
205
+ end
206
+
207
+ it 'should move a key from one database to another successfully' do
208
+ subject.select(0)
209
+ subject.set('key1', '1')
210
+
211
+ subject.move('key1', 1).should be_true
212
+
213
+ subject.select(0)
214
+ subject.get('key1').should be_nil
215
+
216
+ subject.select(1)
217
+ subject.get('key1').should eq('1')
218
+ end
219
+
220
+ it 'should fail to move a key that does not exist in the source database' do
221
+ subject.select(0)
222
+ subject.get('key1').should be_nil
223
+
224
+ subject.move('key1', 1).should be_false
225
+
226
+ subject.select(0)
227
+ subject.get('key1').should be_nil
228
+
229
+ subject.select(1)
230
+ subject.get('key1').should be_nil
231
+ end
232
+
233
+ it 'should fail to move a key that exists in the destination database' do
234
+ subject.select(0)
235
+ subject.set('key1', '1')
236
+
237
+ subject.select(1)
238
+ subject.set('key1', '2')
239
+
240
+ subject.select(0)
241
+ subject.move('key1', 1).should be_false
242
+
243
+ subject.select(0)
244
+ subject.get('key1').should eq('1')
245
+
246
+ subject.select(1)
247
+ subject.get('key1').should eq('2')
248
+ end
249
+
250
+ it 'should fail to move a key to the same database' do
251
+ subject.select(0)
252
+ subject.set('key1', '1')
253
+
254
+ expect {
255
+ subject.move('key1', 0)
256
+ }.to raise_error(Redis::CommandError, 'ERR source and destination objects are the same')
257
+
258
+ subject.select(0)
259
+ subject.get('key1').should eq('1')
260
+ end
261
+ end
@@ -0,0 +1,196 @@
1
+ shared_examples 'lists' do
2
+ it 'should get an element from a list by its index' do
3
+ subject.lpush('key1', 'val1')
4
+ subject.lpush('key1', 'val2')
5
+
6
+ subject.lindex('key1', 0).should eq('val2')
7
+ subject.lindex('key1', -1).should eq('val1')
8
+ subject.lindex('key1', 3).should be_nil
9
+ end
10
+
11
+ it 'should insert an element before or after another element in a list' do
12
+ subject.rpush('key1', 'v1')
13
+ subject.rpush('key1', 'v3')
14
+ subject.linsert('key1', :before, 'v3', 'v2')
15
+
16
+ subject.lrange('key1', 0, -1).should eq(['v1', 'v2', 'v3'])
17
+ end
18
+
19
+ it 'should allow multiple values to be added to a list in a single rpush' do
20
+ subject.rpush('key1', [1, 2, 3])
21
+ subject.lrange('key1', 0, -1).should eq(['1', '2', '3'])
22
+ end
23
+
24
+ it 'should allow multiple values to be added to a list in a single lpush' do
25
+ subject.lpush('key1', [1, 2, 3])
26
+ subject.lrange('key1', 0, -1).should eq(['3', '2', '1'])
27
+ end
28
+
29
+ it 'should error if an invalid where argument is given' do
30
+ subject.rpush('key1', 'v1')
31
+ subject.rpush('key1', 'v3')
32
+
33
+ expect {
34
+ subject.linsert('key1', :invalid, 'v3', 'v2')
35
+ }.to raise_error(Redis::CommandError)
36
+ end
37
+
38
+ it 'should get the length of a list' do
39
+ subject.rpush('key1', 'v1')
40
+ subject.rpush('key1', 'v2')
41
+
42
+ subject.llen('key1').should eq(2)
43
+ subject.llen('key2').should eq(0)
44
+ end
45
+
46
+ it 'should remove and get the first element in a list' do
47
+ subject.rpush('key1', 'v1')
48
+ subject.rpush('key1', 'v2')
49
+ subject.rpush('key1', 'v3')
50
+
51
+ subject.lpop('key1').should eq('v1')
52
+ subject.lrange('key1', 0, -1).should eq(['v2', 'v3'])
53
+ end
54
+
55
+ it 'should prepend a value to a list' do
56
+ subject.rpush('key1', 'v1')
57
+ subject.rpush('key1', 'v2')
58
+
59
+ subject.lrange('key1', 0, -1).should eq(['v1', 'v2'])
60
+ end
61
+
62
+ it 'should prepend a value to a list, only if the list exists' do
63
+ subject.lpush('key1', 'v1')
64
+
65
+ subject.lpushx('key1', 'v2')
66
+ subject.lpushx('key2', 'v3')
67
+
68
+ subject.lrange('key1', 0, -1).should eq(['v2', 'v1'])
69
+ subject.llen('key2').should eq(0)
70
+ end
71
+
72
+ it 'should get a range of elements from a list' do
73
+ subject.rpush('key1', 'v1')
74
+ subject.rpush('key1', 'v2')
75
+ subject.rpush('key1', 'v3')
76
+
77
+ subject.lrange('key1', 1, -1).should eq(['v2', 'v3'])
78
+ end
79
+
80
+ it 'should remove elements from a list' do
81
+ subject.rpush('key1', 'v1')
82
+ subject.rpush('key1', 'v2')
83
+ subject.rpush('key1', 'v2')
84
+ subject.rpush('key1', 'v2')
85
+ subject.rpush('key1', 'v1')
86
+
87
+ subject.lrem('key1', 1, 'v1').should eq(1)
88
+ subject.lrem('key1', -2, 'v2').should eq(2)
89
+ subject.llen('key1').should eq(2)
90
+ end
91
+
92
+ it "should remove list's key when list is empty" do
93
+ subject.rpush('key1', 'v1')
94
+ subject.rpush('key1', 'v2')
95
+ subject.lrem('key1', 1, 'v1')
96
+ subject.lrem('key1', 1, 'v2')
97
+
98
+ subject.exists('key1').should be_false
99
+ end
100
+
101
+ it 'should set the value of an element in a list by its index' do
102
+ subject.rpush('key1', 'one')
103
+ subject.rpush('key1', 'two')
104
+ subject.rpush('key1', 'three')
105
+
106
+ subject.lset('key1', 0, 'four')
107
+ subject.lset('key1', -2, 'five')
108
+ subject.lrange('key1', 0, -1).should eq(['four', 'five', 'three'])
109
+
110
+ expect {
111
+ subject.lset('key1', 4, 'six')
112
+ }.to raise_error(Redis::CommandError)
113
+ end
114
+
115
+ it 'should trim a list to the specified range' do
116
+ subject.rpush('key1', 'one')
117
+ subject.rpush('key1', 'two')
118
+ subject.rpush('key1', 'three')
119
+
120
+ subject.ltrim('key1', 1, -1)
121
+ subject.lrange('key1', 0, -1).should eq(['two', 'three'])
122
+ end
123
+
124
+ context 'when the list is smaller than the requested trim' do
125
+ before do
126
+ subject.rpush('listOfOne', 'one')
127
+ end
128
+
129
+ context 'trimming with a negative start (specifying a max)' do
130
+ before do
131
+ subject.ltrim('listOfOne', -5, -1)
132
+ end
133
+
134
+ it 'returns the unmodified list' do
135
+ subject.lrange('listOfOne', 0, -1).should eq(['one'])
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when the list is larger than the requested trim' do
141
+ before do
142
+ subject.rpush('maxTest', 'one')
143
+ subject.rpush('maxTest', 'two')
144
+ subject.rpush('maxTest', 'three')
145
+ subject.rpush('maxTest', 'four')
146
+ subject.rpush('maxTest', 'five')
147
+ subject.rpush('maxTest', 'six')
148
+ end
149
+
150
+ context 'trimming with a negative start (specifying a max)' do
151
+ before do
152
+ subject.ltrim('maxTest', -5, -1)
153
+ end
154
+
155
+ it 'should trim a list to the specified maximum size' do
156
+ subject.lrange('maxTest', 0, -1).should eq(['two','three', 'four', 'five', 'six'])
157
+ end
158
+ end
159
+ end
160
+
161
+ it 'should remove and return the last element in a list' do
162
+ subject.rpush('key1', 'one')
163
+ subject.rpush('key1', 'two')
164
+ subject.rpush('key1', 'three')
165
+
166
+ subject.rpop('key1').should eq('three')
167
+ subject.lrange('key1', 0, -1).should eq(['one', 'two'])
168
+ end
169
+
170
+ it 'should remove the last element in a list, append it to another list and return it' do
171
+ subject.rpush('key1', 'one')
172
+ subject.rpush('key1', 'two')
173
+ subject.rpush('key1', 'three')
174
+
175
+ subject.rpoplpush('key1', 'key2').should eq('three')
176
+
177
+ subject.lrange('key1', 0, -1).should eq(['one', 'two'])
178
+ subject.lrange('key2', 0, -1).should eq(['three'])
179
+ end
180
+
181
+ it 'should append a value to a list' do
182
+ subject.rpush('key1', 'one')
183
+ subject.rpush('key1', 'two')
184
+
185
+ subject.lrange('key1', 0, -1).should eq(['one', 'two'])
186
+ end
187
+
188
+ it 'should append a value to a list, only if the list exists' do
189
+ subject.rpush('key1', 'one')
190
+ subject.rpushx('key1', 'two')
191
+ subject.rpushx('key2', 'two')
192
+
193
+ subject.lrange('key1', 0, -1).should eq(['one', 'two'])
194
+ subject.lrange('key2', 0, -1).should be_empty
195
+ end
196
+ end
@@ -0,0 +1,93 @@
1
+ shared_examples 'server' do
2
+ it 'should return the number of keys in the selected database' do
3
+ subject.set('key1', '1')
4
+ subject.set('key2', '2')
5
+ subject.set('key2', 'two')
6
+
7
+ subject.dbsize.should eq(2)
8
+ end
9
+
10
+ it 'should get information and statistics about the server' do
11
+ subject.info.key?('redis_version').should be_true
12
+ end
13
+
14
+ it 'should handle non-existent methods' do
15
+ expect {
16
+ subject.idontexist
17
+ }.to raise_error(Redis::CommandError)
18
+ end
19
+
20
+ describe 'multiple databases' do
21
+ it 'should default to database 0' do
22
+ subject.inspect.should =~ %r#/0>$#
23
+ end
24
+
25
+ it 'should select another database' do
26
+ subject.select(1)
27
+ subject.inspect.should =~ %r#/1>$#
28
+ end
29
+
30
+ it 'should store keys separately in each database' do
31
+ subject.select(0).should eq('OK')
32
+ subject.set('key1', '1')
33
+ subject.set('key2', '2')
34
+
35
+ subject.select(1)
36
+ subject.set('key3', '3')
37
+ subject.set('key4', '4')
38
+ subject.set('key5', '5')
39
+
40
+ subject.select(0)
41
+ subject.dbsize.should eq(2)
42
+ subject.exists('key1').should be_true
43
+ subject.exists('key3').should be_false
44
+
45
+ subject.select(1)
46
+ subject.dbsize.should eq(3)
47
+ subject.exists('key4').should be_true
48
+ subject.exists('key2').should be_false
49
+
50
+ subject.flushall
51
+ subject.dbsize.should eq(0)
52
+
53
+ subject.select(0)
54
+ subject.dbsize.should eq(0)
55
+ end
56
+
57
+ it 'should flush a database' do
58
+ subject.select(0)
59
+ subject.set('key1', '1')
60
+ subject.set('key2', '2')
61
+ subject.dbsize.should eq(2)
62
+
63
+ subject.select(1)
64
+ subject.set('key3', '3')
65
+ subject.set('key4', '4')
66
+ subject.dbsize.should eq(2)
67
+
68
+ subject.flushdb.should eq('OK')
69
+
70
+ subject.dbsize.should eq(0)
71
+ subject.select(0)
72
+ subject.dbsize.should eq(2)
73
+ end
74
+
75
+ it 'should flush all databases' do
76
+ subject.select(0)
77
+ subject.set('key3', '3')
78
+ subject.set('key4', '4')
79
+ subject.dbsize.should eq(2)
80
+
81
+ subject.select(1)
82
+ subject.set('key3', '3')
83
+ subject.set('key4', '4')
84
+ subject.dbsize.should eq(2)
85
+
86
+ subject.flushall.should eq('OK')
87
+
88
+ subject.dbsize.should eq(0)
89
+ subject.select(0)
90
+ subject.dbsize.should eq(0)
91
+ end
92
+ end
93
+ end