redis-file 0.4.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,425 @@
1
+ require 'spec_helper'
2
+
3
+ module RedisFile
4
+ Infinity = 1.0/0.0
5
+
6
+ describe "SortedSetsMethods" do
7
+ before(:each) do
8
+ @client = Redis.new
9
+ end
10
+
11
+ it "should add a member to a sorted set, or update its score if it already exists" do
12
+ @client.zadd("key", 1, "val").should be(true)
13
+ @client.zscore("key", "val").should be == 1.0
14
+
15
+ @client.zadd("key", 2, "val").should be(false)
16
+ @client.zscore("key", "val").should be == 2.0
17
+
18
+ # These assertions only work in redis-rb v3.0.2 or higher
19
+ @client.zadd("key2", "inf", "val").should be == true
20
+ @client.zscore("key2", "val").should be == Infinity
21
+
22
+ @client.zadd("key3", "+inf", "val").should be == true
23
+ @client.zscore("key3", "val").should be == Infinity
24
+
25
+ @client.zadd("key4", "-inf", "val").should be == true
26
+ @client.zscore("key4", "val").should be == -Infinity
27
+ end
28
+
29
+ it "should return a nil score for value not in a sorted set or empty key" do
30
+ @client.zadd "key", 1, "val"
31
+
32
+ @client.zscore("key", "val").should be == 1.0
33
+ @client.zscore("key", "val2").should be_nil
34
+ @client.zscore("key2", "val").should be_nil
35
+ end
36
+
37
+ it "should add multiple members to a sorted set, or update its score if it already exists" do
38
+ @client.zadd("key", [1, "val", 2, "val2"]).should be == 2
39
+ @client.zscore("key", "val").should be == 1
40
+ @client.zscore("key", "val2").should be == 2
41
+
42
+ @client.zadd("key", [[5, "val"], [3, "val3"], [4, "val4"]]).should be == 2
43
+ @client.zscore("key", "val").should be == 5
44
+ @client.zscore("key", "val2").should be == 2
45
+ @client.zscore("key", "val3").should be == 3
46
+ @client.zscore("key", "val4").should be == 4
47
+
48
+ @client.zadd("key", [[5, "val5"], [3, "val6"]]).should be == 2
49
+ @client.zscore("key", "val5").should be == 5
50
+ @client.zscore("key", "val6").should be == 3
51
+ end
52
+
53
+ it "should error with wrong number of arguments when adding members" do
54
+ lambda { @client.zadd("key") }.should raise_error(ArgumentError, "wrong number of arguments")
55
+ lambda { @client.zadd("key", 1) }.should raise_error(ArgumentError, "wrong number of arguments")
56
+ lambda { @client.zadd("key", [1]) }.should raise_error(Redis::CommandError, "ERR wrong number of arguments for 'zadd' command")
57
+ lambda { @client.zadd("key", [1, "val", 2]) }.should raise_error(Redis::CommandError, "ERR syntax error")
58
+ lambda { @client.zadd("key", [[1, "val"], [2]]) }.should raise_error(Redis::CommandError, "ERR syntax error")
59
+ end
60
+
61
+ it "should allow floats as scores when adding or updating" do
62
+ @client.zadd("key", 4.321, "val").should be(true)
63
+ @client.zscore("key", "val").should be == 4.321
64
+
65
+ @client.zadd("key", 54.3210, "val").should be(false)
66
+ @client.zscore("key", "val").should be == 54.321
67
+ end
68
+
69
+ it "should remove members from sorted sets" do
70
+ @client.zrem("key", "val").should be(false)
71
+ @client.zadd("key", 1, "val").should be(true)
72
+ @client.zrem("key", "val").should be(true)
73
+ end
74
+
75
+ it "should remove multiple members from sorted sets" do
76
+ @client.zrem("key2", %w(val)).should be == 0
77
+ @client.zrem("key2", %w(val val2 val3)).should be == 0
78
+
79
+ @client.zadd("key2", 1, "val")
80
+ @client.zadd("key2", 1, "val2")
81
+ @client.zadd("key2", 1, "val3")
82
+
83
+ @client.zrem("key2", %w(val val2 val3 val4)).should be == 3
84
+ end
85
+
86
+ it "should remove sorted set's key when it is empty" do
87
+ @client.zadd("key", 1, "val")
88
+ @client.zrem("key", "val")
89
+ @client.exists("key").should be == false
90
+ end
91
+
92
+ it "should get the number of members in a sorted set" do
93
+ @client.zadd("key", 1, "val2")
94
+ @client.zadd("key", 2, "val1")
95
+ @client.zadd("key", 5, "val3")
96
+
97
+ @client.zcard("key").should be == 3
98
+ end
99
+
100
+ it "should count the members in a sorted set with scores within the given values" do
101
+ @client.zadd("key", 1, "val1")
102
+ @client.zadd("key", 2, "val2")
103
+ @client.zadd("key", 3, "val3")
104
+
105
+ @client.zcount("key", 2, 3).should be == 2
106
+ end
107
+
108
+ it "should increment the score of a member in a sorted set" do
109
+ @client.zadd("key", 1, "val1")
110
+ @client.zincrby("key", 2, "val1").should be == 3
111
+ @client.zscore("key", "val1").should be == 3
112
+ end
113
+
114
+ it "initializes the sorted set if the key wasnt already set" do
115
+ @client.zincrby("key", 1, "val1").should be == 1
116
+ end
117
+
118
+ it "should convert the key to a string for zscore" do
119
+ @client.zadd("key", 1, 1)
120
+ @client.zscore("key", 1).should be == 1
121
+ end
122
+
123
+ # These won't pass until redis-rb releases v3.0.2
124
+ it "should handle infinity values when incrementing a sorted set key" do
125
+ @client.zincrby("bar", "+inf", "s2").should be == Infinity
126
+ @client.zincrby("bar", "-inf", "s1").should be == -Infinity
127
+ end
128
+
129
+ it "should return a range of members in a sorted set, by index" do
130
+ @client.zadd("key", 1, "one")
131
+ @client.zadd("key", 2, "two")
132
+ @client.zadd("key", 3, "three")
133
+
134
+ @client.zrange("key", 0, -1).should be == ["one", "two", "three"]
135
+ @client.zrange("key", 1, 2).should be == ["two", "three"]
136
+ @client.zrange("key", 0, -1, :withscores => true).should be == [["one", 1], ["two", 2], ["three", 3]]
137
+ @client.zrange("key", 1, 2, :with_scores => true).should be == [["two", 2], ["three", 3]]
138
+ end
139
+
140
+ it "should sort zrange results logically" do
141
+ @client.zadd("key", 5, "val2")
142
+ @client.zadd("key", 5, "val3")
143
+ @client.zadd("key", 5, "val1")
144
+
145
+ @client.zrange("key", 0, -1).should be == %w(val1 val2 val3)
146
+ @client.zrange("key", 0, -1, :with_scores => true).should be == [["val1", 5], ["val2", 5], ["val3", 5]]
147
+ end
148
+
149
+ it "should return a reversed range of members in a sorted set, by index" do
150
+ @client.zadd("key", 1, "one")
151
+ @client.zadd("key", 2, "two")
152
+ @client.zadd("key", 3, "three")
153
+
154
+ @client.zrevrange("key", 0, -1).should be == ["three", "two", "one"]
155
+ @client.zrevrange("key", 1, 2).should be == ["two", "one"]
156
+ @client.zrevrange("key", 0, -1, :withscores => true).should be == [["three", 3], ["two", 2], ["one", 1]]
157
+ @client.zrevrange("key", 0, -1, :with_scores => true).should be == [["three", 3], ["two", 2], ["one", 1]]
158
+ end
159
+
160
+ it "should return a range of members in a sorted set, by score" do
161
+ @client.zadd("key", 1, "one")
162
+ @client.zadd("key", 2, "two")
163
+ @client.zadd("key", 3, "three")
164
+
165
+ @client.zrangebyscore("key", 0, 100).should be == ["one", "two", "three"]
166
+ @client.zrangebyscore("key", 1, 2).should be == ["one", "two"]
167
+ @client.zrangebyscore("key", 0, 100, :withscores => true).should be == [["one", 1], ["two", 2], ["three", 3]]
168
+ @client.zrangebyscore("key", 1, 2, :with_scores => true).should be == [["one", 1], ["two", 2]]
169
+ @client.zrangebyscore("key", 0, 100, :limit => [0, 1]).should be == ["one"]
170
+ @client.zrangebyscore("key", 0, 100, :limit => [0, -1]).should be == ["one", "two", "three"]
171
+ @client.zrangebyscore("key", 0, 100, :limit => [1, -1], :with_scores => true).should be == [["two", 2], ["three", 3]]
172
+ @client.zrangebyscore("key", '-inf', '+inf').should be == ["one", "two", "three"]
173
+ @client.zrangebyscore("key", 2, '+inf').should be == ["two", "three"]
174
+ @client.zrangebyscore("key", '-inf', 2).should be == ['one', "two"]
175
+ end
176
+
177
+ it "should return a reversed range of members in a sorted set, by score" do
178
+ @client.zadd("key", 1, "one")
179
+ @client.zadd("key", 2, "two")
180
+ @client.zadd("key", 3, "three")
181
+
182
+ @client.zrevrangebyscore("key", 100, 0).should be == ["three", "two", "one"]
183
+ @client.zrevrangebyscore("key", 2, 1).should be == ["two", "one"]
184
+ @client.zrevrangebyscore("key", 1, 2).should be == []
185
+ @client.zrevrangebyscore("key", 2, 1, :with_scores => true).should be == [["two", 2], ["one", 1]]
186
+ @client.zrevrangebyscore("key", 100, 0, :limit => [0, 1]).should be == ["three"]
187
+ @client.zrevrangebyscore("key", 100, 0, :limit => [0, -1]).should be == ["three", "two", "one"]
188
+ @client.zrevrangebyscore("key", 100, 0, :limit => [1, -1], :with_scores => true).should be == [["two", 2], ["one", 1]]
189
+ end
190
+
191
+ it "should determine the index of a member in a sorted set" do
192
+ @client.zadd("key", 1, "one")
193
+ @client.zadd("key", 2, "two")
194
+ @client.zadd("key", 3, "three")
195
+
196
+ @client.zrank("key", "three").should be == 2
197
+ @client.zrank("key", "four").should be_nil
198
+ end
199
+
200
+ it "should determine the reversed index of a member in a sorted set" do
201
+ @client.zadd("key", 1, "one")
202
+ @client.zadd("key", 2, "two")
203
+ @client.zadd("key", 3, "three")
204
+
205
+ @client.zrevrank("key", "three").should be == 0
206
+ @client.zrevrank("key", "four").should be_nil
207
+ end
208
+
209
+ it "should not raise errors for zrank() on accessing a non-existing key in a sorted set" do
210
+ @client.zrank("no_such_key", "no_suck_id").should be_nil
211
+ end
212
+
213
+ it "should not raise errors for zrevrank() on accessing a non-existing key in a sorted set" do
214
+ @client.zrevrank("no_such_key", "no_suck_id").should be_nil
215
+ end
216
+
217
+ describe "#zinterstore" do
218
+ before do
219
+ @client.zadd("key1", 1, "one")
220
+ @client.zadd("key1", 2, "two")
221
+ @client.zadd("key1", 3, "three")
222
+ @client.zadd("key2", 5, "two")
223
+ @client.zadd("key2", 7, "three")
224
+ @client.sadd("key3", 'one')
225
+ @client.sadd("key3", 'two')
226
+ end
227
+
228
+ it "should intersect two keys with custom scores" do
229
+ @client.zinterstore("out", ["key1", "key2"]).should be == 2
230
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [['two', (2 + 5)], ['three', (3 + 7)]]
231
+ end
232
+
233
+ it "should intersect two keys with a default score" do
234
+ @client.zinterstore("out", ["key1", "key3"]).should be == 2
235
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [['one', (1 + 1)], ['two', (2 + 1)]]
236
+ end
237
+
238
+ it "should intersect more than two keys" do
239
+ @client.zinterstore("out", ["key1", "key2", "key3"]).should be == 1
240
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [['two', (2 + 5 + 1)]]
241
+ end
242
+
243
+ it "should not intersect an unknown key" do
244
+ @client.zinterstore("out", ["key1", "no_key"]).should be == 0
245
+ @client.zrange("out", 0, -1, :with_scores => true).should be == []
246
+ end
247
+
248
+ it "should intersect two keys by minimum values" do
249
+ @client.zinterstore("out", ["key1", "key2"], :aggregate => :min).should be == 2
250
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["two", 2], ["three", 3]]
251
+ end
252
+
253
+ it "should intersect two keys by maximum values" do
254
+ @client.zinterstore("out", ["key1", "key2"], :aggregate => :max).should be == 2
255
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["two", 5], ["three", 7]]
256
+ end
257
+
258
+ it "should intersect two keys by explicitly summing values" do
259
+ @client.zinterstore("out", %w(key1 key2), :aggregate => :sum).should be == 2
260
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["two", (2 + 5)], ["three", (3 + 7)]]
261
+ end
262
+
263
+ it "should intersect two keys with weighted values" do
264
+ @client.zinterstore("out", %w(key1 key2), :weights => [10, 1]).should be == 2
265
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["two", (2 * 10 + 5)], ["three", (3 * 10 + 7)]]
266
+ end
267
+
268
+ it "should intersect two keys with weighted minimum values" do
269
+ @client.zinterstore("out", %w(key1 key2), :weights => [10, 1], :aggregate => :min).should be == 2
270
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["two", 5], ["three", 7]]
271
+ end
272
+
273
+ it "should intersect two keys with weighted maximum values" do
274
+ @client.zinterstore("out", %w(key1 key2), :weights => [10, 1], :aggregate => :max).should be == 2
275
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["two", (2 * 10)], ["three", (3 * 10)]]
276
+ end
277
+
278
+ it "should error without enough weights given" do
279
+ lambda { @client.zinterstore("out", %w(key1 key2), :weights => []) }.should raise_error(Redis::CommandError, "ERR syntax error")
280
+ lambda { @client.zinterstore("out", %w(key1 key2), :weights => [10]) }.should raise_error(Redis::CommandError, "ERR syntax error")
281
+ end
282
+
283
+ it "should error with too many weights given" do
284
+ lambda { @client.zinterstore("out", %w(key1 key2), :weights => [10, 1, 1]) }.should raise_error(Redis::CommandError, "ERR syntax error")
285
+ end
286
+
287
+ it "should error with an invalid aggregate" do
288
+ lambda { @client.zinterstore("out", %w(key1 key2), :aggregate => :invalid) }.should raise_error(Redis::CommandError, "ERR syntax error")
289
+ end
290
+ end
291
+
292
+ context "zremrangebyscore" do
293
+ it "should remove items by score" do
294
+ @client.zadd("key", 1, "one")
295
+ @client.zadd("key", 2, "two")
296
+ @client.zadd("key", 3, "three")
297
+
298
+ @client.zremrangebyscore("key", 0, 2).should be == 2
299
+ @client.zcard("key").should be == 1
300
+ end
301
+
302
+ it "should remove items by score with infinity" do # Issue #50
303
+ @client.zadd("key", 10.0, "one")
304
+ @client.zadd("key", 20.0, "two")
305
+ @client.zadd("key", 30.0, "three")
306
+ @client.zremrangebyscore("key", "-inf", "+inf").should be == 3
307
+ @client.zcard("key").should be == 0
308
+ @client.zscore("key", "one").should be_nil
309
+ @client.zscore("key", "two").should be_nil
310
+ @client.zscore("key", "three").should be_nil
311
+ end
312
+
313
+ it "should return 0 if the key didn't exist" do
314
+ @client.zremrangebyscore("key", 0, 2).should be == 0
315
+ end
316
+ end
317
+
318
+ context '#zremrangebyrank' do
319
+ it 'removes all elements with in the given range' do
320
+ @client.zadd("key", 1, "one")
321
+ @client.zadd("key", 2, "two")
322
+ @client.zadd("key", 3, "three")
323
+
324
+ @client.zremrangebyrank("key", 0, 1).should be == 2
325
+ @client.zcard('key').should be == 1
326
+ end
327
+
328
+ it 'handles out of range requests' do
329
+ @client.zadd("key", 1, "one")
330
+ @client.zadd("key", 2, "two")
331
+ @client.zadd("key", 3, "three")
332
+
333
+ @client.zremrangebyrank("key", 25, -1).should be == 0
334
+ @client.zcard('key').should be == 3
335
+ end
336
+ end
337
+
338
+ describe "#zunionstore" do
339
+ before do
340
+ @client.zadd("key1", 1, "val1")
341
+ @client.zadd("key1", 2, "val2")
342
+ @client.zadd("key1", 3, "val3")
343
+ @client.zadd("key2", 5, "val2")
344
+ @client.zadd("key2", 7, "val3")
345
+ @client.sadd("key3", "val1")
346
+ @client.sadd("key3", "val2")
347
+ end
348
+
349
+ it "should union two keys with custom scores" do
350
+ @client.zunionstore("out", %w(key1 key2)).should be == 3
351
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", 1], ["val2", (2 + 5)], ["val3", (3 + 7)]]
352
+ end
353
+
354
+ it "should union two keys with a default score" do
355
+ @client.zunionstore("out", %w(key1 key3)).should be == 3
356
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", (1 + 1)], ["val2", (2 + 1)], ["val3", 3]]
357
+ end
358
+
359
+ it "should union more than two keys" do
360
+ @client.zunionstore("out", %w(key1 key2 key3)).should be == 3
361
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", (1 + 1)], ["val2", (2 + 5 + 1)], ["val3", (3 + 7)]]
362
+ end
363
+
364
+ it "should union with an unknown key" do
365
+ @client.zunionstore("out", %w(key1 no_key)).should be == 3
366
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", 1], ["val2", 2], ["val3", 3]]
367
+ end
368
+
369
+ it "should union two keys by minimum values" do
370
+ @client.zunionstore("out", %w(key1 key2), :aggregate => :min).should be == 3
371
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", 1], ["val2", 2], ["val3", 3]]
372
+ end
373
+
374
+ it "should union two keys by maximum values" do
375
+ @client.zunionstore("out", %w(key1 key2), :aggregate => :max).should be == 3
376
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", 1], ["val2", 5], ["val3", 7]]
377
+ end
378
+
379
+ it "should union two keys by explicitly summing values" do
380
+ @client.zunionstore("out", %w(key1 key2), :aggregate => :sum).should be == 3
381
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", 1], ["val2", (2 + 5)], ["val3", (3 + 7)]]
382
+ end
383
+
384
+ it "should union two keys with weighted values" do
385
+ @client.zunionstore("out", %w(key1 key2), :weights => [10, 1]).should be == 3
386
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", (1 * 10)], ["val2", (2 * 10 + 5)], ["val3", (3 * 10 + 7)]]
387
+ end
388
+
389
+ it "should union two keys with weighted minimum values" do
390
+ @client.zunionstore("out", %w(key1 key2), :weights => [10, 1], :aggregate => :min).should be == 3
391
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val2", 5], ["val3", 7], ["val1", (1 * 10)]]
392
+ end
393
+
394
+ it "should union two keys with weighted maximum values" do
395
+ @client.zunionstore("out", %w(key1 key2), :weights => [10, 1], :aggregate => :max).should be == 3
396
+ @client.zrange("out", 0, -1, :with_scores => true).should be == [["val1", (1 * 10)], ["val2", (2 * 10)], ["val3", (3 * 10)]]
397
+ end
398
+
399
+ it "should error without enough weights given" do
400
+ lambda { @client.zunionstore("out", %w(key1 key2), :weights => []) }.should raise_error(Redis::CommandError, "ERR syntax error")
401
+ lambda { @client.zunionstore("out", %w(key1 key2), :weights => [10]) }.should raise_error(Redis::CommandError, "ERR syntax error")
402
+ end
403
+
404
+ it "should error with too many weights given" do
405
+ lambda { @client.zunionstore("out", %w(key1 key2), :weights => [10, 1, 1]) }.should raise_error(Redis::CommandError, "ERR syntax error")
406
+ end
407
+
408
+ it "should error with an invalid aggregate" do
409
+ lambda { @client.zunionstore("out", %w(key1 key2), :aggregate => :invalid) }.should raise_error(Redis::CommandError, "ERR syntax error")
410
+ end
411
+ end
412
+
413
+ #it "should remove all members in a sorted set within the given indexes"
414
+
415
+ #it "should return a range of members in a sorted set, by index, with scores ordered from high to low"
416
+
417
+ #it "should return a range of members in a sorted set, by score, with scores ordered from high to low"
418
+
419
+ #it "should determine the index of a member in a sorted set, with scores ordered from high to low"
420
+
421
+ #it "should get the score associated with the given member in a sorted set"
422
+
423
+ #it "should add multiple sorted sets and store the resulting sorted set in a new key"
424
+ end
425
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'redis-file'
5
+ require "redis-file/rspec"
6
+
7
+ def redisfile?
8
+ true
9
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ # Remove this file driver so we test against actual redis
4
+ Redis::Connection.drivers.pop
5
+
6
+ RSpec.configure do |config|
7
+ config.before(:each) do
8
+ Redis.new.flushall
9
+ end
10
+ end
11
+
12
+ def redisfile?
13
+ false
14
+ end
@@ -0,0 +1,236 @@
1
+ require 'spec_helper'
2
+
3
+ module RedisFile
4
+ describe "StringsMethods" do
5
+
6
+ before(:each) do
7
+ @client = Redis.new
8
+ end
9
+
10
+ it "should append a value to key" do
11
+ @client.set("key1", "Hello")
12
+ @client.append("key1", " World")
13
+
14
+ @client.get("key1").should be == "Hello World"
15
+ end
16
+
17
+ it "should decrement the integer value of a key by one" do
18
+ @client.set("counter", "1")
19
+ @client.decr("counter")
20
+
21
+ @client.get("counter").should be == "0"
22
+ end
23
+
24
+ it "should decrement the integer value of a key by the given number" do
25
+ @client.set("counter", "10")
26
+ @client.decrby("counter", "5")
27
+
28
+ @client.get("counter").should be == "5"
29
+ end
30
+
31
+ it "should get the value of a key" do
32
+ @client.get("key2").should be == nil
33
+ end
34
+
35
+ it "should returns the bit value at offset in the string value stored at key" do
36
+ @client.set("key1", "a")
37
+
38
+ @client.getbit("key1", 1).should be == 1
39
+ @client.getbit("key1", 2).should be == 1
40
+ @client.getbit("key1", 3).should be == 0
41
+ @client.getbit("key1", 4).should be == 0
42
+ @client.getbit("key1", 5).should be == 0
43
+ @client.getbit("key1", 6).should be == 0
44
+ @client.getbit("key1", 7).should be == 1
45
+ end
46
+
47
+ it "should allow direct bit manipulation even if the string isn't set" do
48
+ @client.setbit("key1", 10, 1)
49
+ @client.getbit("key1", 10).should be == 1
50
+ end
51
+
52
+ it "should get a substring of the string stored at a key" do
53
+ @client.set("key1", "This a message")
54
+
55
+ @client.getrange("key1", 0, 3).should be == "This"
56
+ @client.substr("key1", 0, 3).should be == "This"
57
+ end
58
+
59
+ it "should set the string value of a key and return its old value" do
60
+ @client.set("key1","value1")
61
+
62
+ @client.getset("key1", "value2").should be == "value1"
63
+ @client.get("key1").should be == "value2"
64
+ end
65
+
66
+ it "should return nil for #getset if the key does not exist when setting" do
67
+ @client.getset("key1", "value1").should be == nil
68
+ @client.get("key1").should be == "value1"
69
+ end
70
+
71
+ it "should increment the integer value of a key by one" do
72
+ @client.set("counter", "1")
73
+ @client.incr("counter").should be == 2
74
+
75
+ @client.get("counter").should be == "2"
76
+ end
77
+
78
+ it "should not change the expire value of the key during incr" do
79
+ @client.set("counter", "1")
80
+ @client.expire("counter", 600).should be_true
81
+ @client.ttl("counter").should be == 600
82
+ @client.incr("counter").should be == 2
83
+ @client.ttl("counter").should be == 600
84
+ end
85
+
86
+ it "should decrement the integer value of a key by one" do
87
+ @client.set("counter", "1")
88
+ @client.decr("counter").should be == 0
89
+
90
+ @client.get("counter").should be == "0"
91
+ end
92
+
93
+ it "should not change the expire value of the key during decr" do
94
+ @client.set("counter", "2")
95
+ @client.expire("counter", 600).should be_true
96
+ @client.ttl("counter").should be == 600
97
+ @client.decr("counter").should be == 1
98
+ @client.ttl("counter").should be == 600
99
+ end
100
+
101
+ it "should increment the integer value of a key by the given number" do
102
+ @client.set("counter", "10")
103
+ @client.incrby("counter", "5").should be == 15
104
+ @client.incrby("counter", 2).should be == 17
105
+ @client.get("counter").should be == "17"
106
+ end
107
+
108
+ it "should not change the expire value of the key during incrby" do
109
+ @client.set("counter", "1")
110
+ @client.expire("counter", 600).should be_true
111
+ @client.ttl("counter").should be == 600
112
+ @client.incrby("counter", "5").should be == 6
113
+ @client.ttl("counter").should be == 600
114
+ end
115
+
116
+ it "should decrement the integer value of a key by the given number" do
117
+ @client.set("counter", "10")
118
+ @client.decrby("counter", "5").should be == 5
119
+ @client.decrby("counter", 2).should be == 3
120
+ @client.get("counter").should be == "3"
121
+ end
122
+
123
+ it "should not change the expire value of the key during decrby" do
124
+ @client.set("counter", "8")
125
+ @client.expire("counter", 600).should be_true
126
+ @client.ttl("counter").should be == 600
127
+ @client.decrby("counter", "3").should be == 5
128
+ @client.ttl("counter").should be == 600
129
+ end
130
+
131
+ it "should get the values of all the given keys" do
132
+ @client.set("key1", "value1")
133
+ @client.set("key2", "value2")
134
+ @client.set("key3", "value3")
135
+
136
+ @client.mget("key1", "key2", "key3").should be == ["value1", "value2", "value3"]
137
+ @client.mget(["key1", "key2", "key3"]).should be == ["value1", "value2", "value3"]
138
+ end
139
+
140
+ it "returns nil for non existent keys" do
141
+ @client.set("key1", "value1")
142
+ @client.set("key3", "value3")
143
+
144
+ @client.mget("key1", "key2", "key3", "key4").should be == ["value1", nil, "value3", nil]
145
+ @client.mget(["key1", "key2", "key3", "key4"]).should be == ["value1", nil, "value3", nil]
146
+ end
147
+
148
+ it 'raises an argument error when not passed any fields' do
149
+ @client.set("key3", "value3")
150
+
151
+ lambda { @client.mget }.should raise_error(Redis::CommandError)
152
+ end
153
+
154
+ it "should set multiple keys to multiple values" do
155
+ @client.mset(:key1, "value1", :key2, "value2")
156
+
157
+ @client.get("key1").should be == "value1"
158
+ @client.get("key2").should be == "value2"
159
+ end
160
+
161
+ it "should raise error if command arguments count is wrong" do
162
+ expect { @client.mset }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'mset' command")
163
+ expect { @client.mset(:key1) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'mset' command")
164
+ expect { @client.mset(:key1, "value", :key2) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'mset' command")
165
+
166
+ @client.get("key1").should be_nil
167
+ @client.get("key2").should be_nil
168
+ end
169
+
170
+ it "should set multiple keys to multiple values, only if none of the keys exist" do
171
+ @client.msetnx(:key1, "value1", :key2, "value2").should be == true
172
+ @client.msetnx(:key1, "value3", :key2, "value4").should be == false
173
+
174
+ @client.get("key1").should be == "value1"
175
+ @client.get("key2").should be == "value2"
176
+ end
177
+
178
+ it "should set multiple keys to multiple values with a hash" do
179
+ @client.mapped_mset(:key1 => "value1", :key2 => "value2")
180
+
181
+ @client.get("key1").should be == "value1"
182
+ @client.get("key2").should be == "value2"
183
+ end
184
+
185
+ it "should set multiple keys to multiple values with a hash, only if none of the keys exist" do
186
+ @client.mapped_msetnx(:key1 => "value1", :key2 => "value2").should be == true
187
+ @client.mapped_msetnx(:key1 => "value3", :key2 => "value4").should be == false
188
+
189
+ @client.get("key1").should be == "value1"
190
+ @client.get("key2").should be == "value2"
191
+ end
192
+
193
+ it "should set the string value of a key" do
194
+ @client.set("key1", "1")
195
+
196
+ @client.get("key1").should be == "1"
197
+ end
198
+
199
+ it "should sets or clears the bit at offset in the string value stored at key" do
200
+ @client.set("key1", "abc")
201
+ @client.setbit("key1", 11, 1)
202
+
203
+ @client.get("key1").should be == "arc"
204
+ end
205
+
206
+ it "should set the value and expiration of a key" do
207
+ @client.setex("key1", 30, "value1")
208
+
209
+ @client.get("key1").should be == "value1"
210
+ @client.ttl("key1").should be == 30
211
+ end
212
+
213
+ it "should set the value of a key, only if the key does not exist" do
214
+ @client.set("key1", "test value")
215
+ @client.setnx("key1", "new value")
216
+ @client.setnx("key2", "another value")
217
+
218
+ @client.get("key1").should be == "test value"
219
+ @client.get("key2").should be == "another value"
220
+ end
221
+
222
+ it "should overwrite part of a string at key starting at the specified offset" do
223
+ @client.set("key1", "Hello World")
224
+ @client.setrange("key1", 6, "Redis")
225
+
226
+ @client.get("key1").should be == "Hello Redis"
227
+ end
228
+
229
+ it "should get the length of the value stored in a key" do
230
+ @client.set("key1", "abc")
231
+
232
+ @client.strlen("key1").should be == 3
233
+ end
234
+
235
+ end
236
+ end