mock_redis 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/CHANGELOG.md +11 -0
  2. data/Gemfile +1 -1
  3. data/lib/mock_redis/assertions.rb +2 -2
  4. data/lib/mock_redis/database.rb +16 -8
  5. data/lib/mock_redis/expire_wrapper.rb +2 -2
  6. data/lib/mock_redis/hash_methods.rb +12 -6
  7. data/lib/mock_redis/list_methods.rb +10 -8
  8. data/lib/mock_redis/multi_db_wrapper.rb +3 -3
  9. data/lib/mock_redis/pipelined_wrapper.rb +45 -0
  10. data/lib/mock_redis/set_methods.rb +14 -5
  11. data/lib/mock_redis/string_methods.rb +6 -6
  12. data/lib/mock_redis/transaction_wrapper.rb +13 -8
  13. data/lib/mock_redis/version.rb +1 -1
  14. data/lib/mock_redis/zset_methods.rb +52 -22
  15. data/lib/mock_redis.rb +92 -5
  16. data/mock_redis.gemspec +1 -1
  17. data/spec/cloning_spec.rb +1 -1
  18. data/spec/commands/blpop_spec.rb +3 -3
  19. data/spec/commands/brpop_spec.rb +3 -3
  20. data/spec/commands/brpoplpush_spec.rb +3 -3
  21. data/spec/commands/hdel_spec.rb +5 -0
  22. data/spec/commands/lpush_spec.rb +7 -0
  23. data/spec/commands/mapped_hmset_spec.rb +7 -1
  24. data/spec/commands/move_spec.rb +2 -2
  25. data/spec/commands/msetnx_spec.rb +2 -2
  26. data/spec/commands/pipelined_spec.rb +12 -0
  27. data/spec/commands/rename_spec.rb +7 -0
  28. data/spec/commands/renamenx_spec.rb +7 -0
  29. data/spec/commands/rpush_spec.rb +7 -0
  30. data/spec/commands/sadd_spec.rb +1 -1
  31. data/spec/commands/sdiff_spec.rb +1 -1
  32. data/spec/commands/sdiffstore_spec.rb +3 -3
  33. data/spec/commands/sinterstore_spec.rb +2 -2
  34. data/spec/commands/smembers_spec.rb +4 -4
  35. data/spec/commands/srem_spec.rb +5 -0
  36. data/spec/commands/sunion_spec.rb +2 -2
  37. data/spec/commands/sunionstore_spec.rb +3 -3
  38. data/spec/commands/watch_spec.rb +2 -2
  39. data/spec/commands/zadd_spec.rb +6 -1
  40. data/spec/commands/zcount_spec.rb +8 -0
  41. data/spec/commands/zincrby_spec.rb +4 -4
  42. data/spec/commands/zinterstore_spec.rb +7 -7
  43. data/spec/commands/zrange_spec.rb +6 -2
  44. data/spec/commands/zrangebyscore_spec.rb +2 -2
  45. data/spec/commands/zrem_spec.rb +5 -0
  46. data/spec/commands/zrevrange_spec.rb +2 -2
  47. data/spec/commands/zrevrangebyscore_spec.rb +2 -2
  48. data/spec/commands/zscore_spec.rb +2 -2
  49. data/spec/commands/zunionstore_spec.rb +9 -9
  50. data/spec/mock_redis_spec.rb +21 -0
  51. data/spec/support/redis_multiplexer.rb +23 -19
  52. data/spec/transactions_spec.rb +17 -0
  53. metadata +67 -84
  54. data/lib/mock_redis/distributed.rb +0 -6
data/lib/mock_redis.rb CHANGED
@@ -2,20 +2,59 @@ require 'set'
2
2
 
3
3
  require 'mock_redis/assertions'
4
4
  require 'mock_redis/database'
5
- require 'mock_redis/distributed'
6
5
  require 'mock_redis/expire_wrapper'
7
6
  require 'mock_redis/multi_db_wrapper'
7
+ require 'mock_redis/pipelined_wrapper'
8
8
  require 'mock_redis/transaction_wrapper'
9
9
  require 'mock_redis/undef_redis_methods'
10
10
 
11
11
  class MockRedis
12
12
  include UndefRedisMethods
13
13
 
14
+ attr_reader :options
15
+
16
+ DEFAULTS = {
17
+ :scheme => "redis",
18
+ :host => "127.0.0.1",
19
+ :port => 6379,
20
+ :path => nil,
21
+ :timeout => 5.0,
22
+ :password => nil,
23
+ :db => 0,
24
+ }
25
+
14
26
  def initialize(*args)
15
- @db = TransactionWrapper.new(
16
- ExpireWrapper.new(
17
- MultiDbWrapper.new(
18
- Database.new(*args))))
27
+ @options = _parse_options(args.first)
28
+
29
+ @db = PipelinedWrapper.new(
30
+ TransactionWrapper.new(
31
+ ExpireWrapper.new(
32
+ MultiDbWrapper.new(
33
+ Database.new(*args)))))
34
+ end
35
+
36
+ def id
37
+ "redis://#{self.host}:#{self.port}/#{self.db}"
38
+ end
39
+
40
+ def call(command, &block)
41
+ self.send(*command)
42
+ end
43
+
44
+ def host
45
+ self.options[:host]
46
+ end
47
+
48
+ def port
49
+ self.options[:port]
50
+ end
51
+
52
+ def db
53
+ self.options[:db]
54
+ end
55
+
56
+ def client
57
+ self
19
58
  end
20
59
 
21
60
  def respond_to?(method, include_private=false)
@@ -30,4 +69,52 @@ class MockRedis
30
69
  super
31
70
  @db = @db.clone
32
71
  end
72
+
73
+
74
+ protected
75
+
76
+ def _parse_options(options)
77
+ return {} if options.nil?
78
+
79
+ defaults = DEFAULTS.dup
80
+
81
+ url = options[:url] || ENV["REDIS_URL"]
82
+
83
+ # Override defaults from URL if given
84
+ if url
85
+ require "uri"
86
+
87
+ uri = URI(url)
88
+
89
+ if uri.scheme == "unix"
90
+ defaults[:path] = uri.path
91
+ else
92
+ # Require the URL to have at least a host
93
+ raise ArgumentError, "invalid url" unless uri.host
94
+
95
+ defaults[:scheme] = uri.scheme
96
+ defaults[:host] = uri.host
97
+ defaults[:port] = uri.port if uri.port
98
+ defaults[:password] = uri.password if uri.password
99
+ defaults[:db] = uri.path[1..-1].to_i if uri.path
100
+ end
101
+ end
102
+
103
+ options = defaults.merge(options)
104
+
105
+ if options[:path]
106
+ options[:scheme] = "unix"
107
+ options.delete(:host)
108
+ options.delete(:port)
109
+ else
110
+ options[:host] = options[:host].to_s
111
+ options[:port] = options[:port].to_i
112
+ end
113
+
114
+ options[:timeout] = options[:timeout].to_f
115
+ options[:db] = options[:db].to_i
116
+
117
+ options
118
+ end
119
+
33
120
  end
data/mock_redis.gemspec CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_development_dependency "rake", "~> 0.9.2"
22
- s.add_development_dependency "redis", "~> 2.2.1"
22
+ s.add_development_dependency "redis", "~> 3.0.0"
23
23
  s.add_development_dependency "rspec", "~> 2.6.0"
24
24
  end
data/spec/cloning_spec.rb CHANGED
@@ -42,7 +42,7 @@ describe "MockRedis#clone" do
42
42
 
43
43
  it "performs a deep copy (zset values)" do
44
44
  @mock.zadd('foozset', 2, 'bar')
45
- @clone.zscore('foozset', 'bar').should == "1"
45
+ @clone.zscore('foozset', 'bar').should == 1.0
46
46
  end
47
47
  end
48
48
 
@@ -27,16 +27,16 @@ describe '#blpop(key [, key, ...,], timeout)' do
27
27
  [@list1, 'one']
28
28
  end
29
29
 
30
- it "raises an error on non-integer timeout" do
30
+ it "allows subsecond timeouts" do
31
31
  lambda do
32
32
  @redises.blpop(@list1, @list2, 0.5)
33
- end.should raise_error(RuntimeError)
33
+ end.should_not raise_error(Redis::CommandError)
34
34
  end
35
35
 
36
36
  it "raises an error on negative timeout" do
37
37
  lambda do
38
38
  @redises.blpop(@list1, @list2, -1)
39
- end.should raise_error(RuntimeError)
39
+ end.should raise_error(Redis::CommandError)
40
40
  end
41
41
 
42
42
  it_should_behave_like "a list-only command"
@@ -26,16 +26,16 @@ describe '#brpop(key [, key, ...,], timeout)' do
26
26
  [@list1, 'two']
27
27
  end
28
28
 
29
- it "raises an error on non-integer timeout" do
29
+ it "allows subsecond timeouts" do
30
30
  lambda do
31
31
  @redises.brpop(@list1, @list2, 0.5)
32
- end.should raise_error(RuntimeError)
32
+ end.should_not raise_error(Redis::CommandError)
33
33
  end
34
34
 
35
35
  it "raises an error on negative timeout" do
36
36
  lambda do
37
37
  @redises.brpop(@list1, @list2, -1)
38
- end.should raise_error(RuntimeError)
38
+ end.should raise_error(Redis::CommandError)
39
39
  end
40
40
 
41
41
  it_should_behave_like "a list-only command"
@@ -24,16 +24,16 @@ describe '#brpoplpush(source, destination, timeout)' do
24
24
  @redises.brpoplpush(@list1, @list2, 0).should == "B"
25
25
  end
26
26
 
27
- it "raises an error on non-integer timeout" do
27
+ it "allows subsecond timeout" do
28
28
  lambda do
29
29
  @redises.brpoplpush(@list1, @list2, 0.5)
30
- end.should raise_error(RuntimeError)
30
+ end.should_not raise_error(Redis::CommandError)
31
31
  end
32
32
 
33
33
  it "raises an error on negative timeout" do
34
34
  lambda do
35
35
  @redises.brpoplpush(@list1, @list2, -1)
36
- end.should raise_error(RuntimeError)
36
+ end.should raise_error(Redis::CommandError)
37
37
  end
38
38
 
39
39
  it_should_behave_like "a list-only command"
@@ -38,5 +38,10 @@ describe "#hdel(key, field)" do
38
38
  @redises.get(@key).should be_nil
39
39
  end
40
40
 
41
+ it "supports a variable number of arguments" do
42
+ @redises.hdel(@key, ['k1', 'k2'])
43
+ @redises.get(@key).should be_nil
44
+ end
45
+
41
46
  it_should_behave_like "a hash-only command"
42
47
  end
@@ -26,5 +26,12 @@ describe "#lpush(key, value)" do
26
26
  @redises.lindex(@key, 0).should == "1"
27
27
  end
28
28
 
29
+ it "supports a variable number of arguments" do
30
+ @redises.lpush(@key, [1, 2, 3]).should == 3
31
+ @redises.lindex(@key, 0).should == "3"
32
+ @redises.lindex(@key, 1).should == "2"
33
+ @redises.lindex(@key, 2).should == "1"
34
+ end
35
+
29
36
  it_should_behave_like "a list-only command"
30
37
  end
@@ -33,9 +33,15 @@ describe "#mapped_hmset(key, hash={})" do
33
33
  end.should raise_error(ArgumentError)
34
34
  end
35
35
 
36
+ it "raises an error if given a an odd length array" do
37
+ lambda do
38
+ @redises.mapped_hmset(@key, [1])
39
+ end.should raise_error(Redis::CommandError)
40
+ end
41
+
36
42
  it "raises an error if given a non-hash value" do
37
43
  lambda do
38
44
  @redises.mapped_hmset(@key, 1)
39
- end.should raise_error(RuntimeError)
45
+ end.should raise_error(NoMethodError)
40
46
  end
41
47
  end
@@ -122,7 +122,7 @@ describe '#move(key, db)' do
122
122
 
123
123
  it "copies key to destdb" do
124
124
  @redises.select(@destdb)
125
- @redises.smembers(@key).should == %w[beer wine]
125
+ @redises.smembers(@key).should == %w[wine beer]
126
126
  end
127
127
  end
128
128
 
@@ -141,7 +141,7 @@ describe '#move(key, db)' do
141
141
  it "copies key to destdb" do
142
142
  @redises.select(@destdb)
143
143
  @redises.zrange(@key, 0, -1, :with_scores => true).should ==
144
- %w[beer 1 wine 2]
144
+ [["beer", 1.0], ["wine", 2.0]]
145
145
  end
146
146
  end
147
147
  end
@@ -7,7 +7,7 @@ describe '#msetnx(key, value [, key, value, ...])' do
7
7
  end
8
8
 
9
9
  it "responds with 1 if any keys were set" do
10
- @redises.msetnx(@key1, 1).should == 1
10
+ @redises.msetnx(@key1, 1).should be_true
11
11
  end
12
12
 
13
13
  it "sets the values" do
@@ -23,7 +23,7 @@ describe '#msetnx(key, value [, key, value, ...])' do
23
23
 
24
24
  it "responds with 0 if any value is already set" do
25
25
  @redises.set(@key1, "old1")
26
- @redises.msetnx(@key1, 'value1', @key2, 'value2').should == 0
26
+ @redises.msetnx(@key1, 'value1', @key2, 'value2').should be_false
27
27
  end
28
28
 
29
29
  it "raises an error if given an odd number of arguments" do
@@ -8,4 +8,16 @@ describe '#pipelined' do
8
8
  end
9
9
  res.should == true
10
10
  end
11
+
12
+ it "returns results of pipelined operations" do
13
+ @redises.set "hello", "world"
14
+ @redises.set "foo", "bar"
15
+
16
+ results = @redises.pipelined do
17
+ @redises.get "hello"
18
+ @redises.get "foo"
19
+ end
20
+
21
+ results.should == ["world", "bar"]
22
+ end
11
23
  end
@@ -17,6 +17,13 @@ describe '#rename(key, newkey)' do
17
17
  @redises.get(@newkey).should == "oof"
18
18
  end
19
19
 
20
+ it "raises an error when the source key is nonexistant" do
21
+ @redises.del(@key)
22
+ lambda do
23
+ @redises.rename(@key, @newkey)
24
+ end.should raise_error(Redis::CommandError)
25
+ end
26
+
20
27
  it "raises an error when key == newkey" do
21
28
  lambda do
22
29
  @redises.rename(@key, @key)
@@ -22,6 +22,13 @@ describe '#renamenx(key, newkey)' do
22
22
  @redises.get(@newkey).should == "oof"
23
23
  end
24
24
 
25
+ it "raises an error when the source key is nonexistant" do
26
+ @redises.del(@key)
27
+ lambda do
28
+ @redises.rename(@key, @newkey)
29
+ end.should raise_error(Redis::CommandError)
30
+ end
31
+
25
32
  it "raises an error when key == newkey" do
26
33
  lambda do
27
34
  @redises.renamenx(@key, @key)
@@ -26,5 +26,12 @@ describe "#rpush(key)" do
26
26
  @redises.lindex(@key, 0).should == "1"
27
27
  end
28
28
 
29
+ it "supports a variable number of arguments" do
30
+ @redises.rpush(@key, [1, 2, 3]).should == 3
31
+ @redises.lindex(@key, 0).should == "1"
32
+ @redises.lindex(@key, 1).should == "2"
33
+ @redises.lindex(@key, 2).should == "3"
34
+ end
35
+
29
36
  it_should_behave_like "a list-only command"
30
37
  end
@@ -15,7 +15,7 @@ describe '#sadd(key, member)' do
15
15
  it "adds member to the set" do
16
16
  @redises.sadd(@key, 1)
17
17
  @redises.sadd(@key, 2)
18
- @redises.smembers(@key).should == %w[1 2]
18
+ @redises.smembers(@key).should == %w[2 1]
19
19
  end
20
20
 
21
21
  it_should_behave_like "a set-only command"
@@ -20,7 +20,7 @@ describe '#sdiff(key [, key, ...])' do
20
20
  end
21
21
 
22
22
  it "treats missing keys as empty sets" do
23
- @redises.sdiff(@evens, 'mock-redis-test:nonesuch').should == %w[10 2 4 6 8]
23
+ @redises.sdiff(@evens, 'mock-redis-test:nonesuch').should == %w[2 4 6 8 10]
24
24
  end
25
25
 
26
26
  it "returns the first set when called with a single argument" do
@@ -18,7 +18,7 @@ describe '#sdiffstore(destination, key [, key, ...])' do
18
18
 
19
19
  it "stores the resulting set" do
20
20
  @redises.sdiffstore(@destination, @numbers, @evens)
21
- @redises.smembers(@destination).should == %w[1 3 5 7 9]
21
+ @redises.smembers(@destination).should == %w[9 7 5 3 1]
22
22
  end
23
23
 
24
24
  it "does not store empty sets" do
@@ -28,14 +28,14 @@ describe '#sdiffstore(destination, key [, key, ...])' do
28
28
 
29
29
  it "treats missing keys as empty sets" do
30
30
  @redises.sdiffstore(@destination, @evens, 'mock-redis-test:nonesuch')
31
- @redises.smembers(@destination).should == %w[10 2 4 6 8]
31
+ @redises.smembers(@destination).should == %w[10 8 6 4 2]
32
32
  end
33
33
 
34
34
  it "removes existing elements in destination" do
35
35
  @redises.sadd(@destination, 42)
36
36
 
37
37
  @redises.sdiffstore(@destination, @primes)
38
- @redises.smembers(@destination).should == %w[2 3 5 7]
38
+ @redises.smembers(@destination).should == %w[7 5 3 2]
39
39
  end
40
40
 
41
41
  it "raises an error if given 0 sets" do
@@ -18,7 +18,7 @@ describe '#sinterstore(destination, key [, key, ...])' do
18
18
 
19
19
  it "stores the resulting set" do
20
20
  @redises.sinterstore(@destination, @numbers, @evens)
21
- @redises.smembers(@destination).should == %w[10 2 4 6 8]
21
+ @redises.smembers(@destination).should == %w[10 8 6 4 2]
22
22
  end
23
23
 
24
24
  it "does not store empty sets" do
@@ -30,7 +30,7 @@ describe '#sinterstore(destination, key [, key, ...])' do
30
30
  @redises.sadd(@destination, 42)
31
31
 
32
32
  @redises.sinterstore(@destination, @primes)
33
- @redises.smembers(@destination).should == %w[2 3 5 7]
33
+ @redises.smembers(@destination).should == %w[7 5 3 2]
34
34
  end
35
35
 
36
36
  it "raises an error if given 0 sets" do
@@ -8,10 +8,10 @@ describe '#smembers(key)' do
8
8
  end
9
9
 
10
10
  it "returns the set's members" do
11
- @redises.sadd(@key, 1)
12
- @redises.sadd(@key, 2)
13
- @redises.sadd(@key, 3)
14
- @redises.smembers(@key).should == %w[1 2 3]
11
+ @redises.sadd(@key, "Hello")
12
+ @redises.sadd(@key, "World")
13
+ @redises.sadd(@key, "Test")
14
+ @redises.smembers(@key).should == %w[Test World Hello]
15
15
  end
16
16
 
17
17
  it_should_behave_like "a set-only command"
@@ -31,5 +31,10 @@ describe '#srem(key, member)' do
31
31
  @redises.get(@key).should be_nil
32
32
  end
33
33
 
34
+ it "supports a variable number of arguments" do
35
+ @redises.srem(@key, ['bert', 'ernie']).should == 2
36
+ @redises.get(@key).should be_nil
37
+ end
38
+
34
39
  it_should_behave_like "a set-only command"
35
40
  end
@@ -10,7 +10,7 @@ describe '#sunion(key [, key, ...])' do
10
10
  end
11
11
 
12
12
  it "returns the elements in the resulting set" do
13
- @redises.sunion(@evens, @primes).should == %w[10 2 3 4 5 6 7 8]
13
+ @redises.sunion(@evens, @primes).should == %w[2 4 6 8 10 3 5 7]
14
14
  end
15
15
 
16
16
  it "treats missing keys as empty sets" do
@@ -37,4 +37,4 @@ describe '#sunion(key [, key, ...])' do
37
37
  end
38
38
  end
39
39
 
40
-
40
+
@@ -16,7 +16,7 @@ describe '#sunionstore(destination, key [, key, ...])' do
16
16
 
17
17
  it "stores the resulting set" do
18
18
  @redises.sunionstore(@destination, @primes, @evens)
19
- @redises.smembers(@destination).should == %w[10 2 3 4 5 6 7 8]
19
+ @redises.smembers(@destination).should == %w[10 8 6 4 7 5 3 2]
20
20
  end
21
21
 
22
22
  it "does not store empty sets" do
@@ -30,13 +30,13 @@ describe '#sunionstore(destination, key [, key, ...])' do
30
30
  @redises.sadd(@destination, 42)
31
31
 
32
32
  @redises.sunionstore(@destination, @primes)
33
- @redises.smembers(@destination).should == %w[2 3 5 7]
33
+ @redises.smembers(@destination).should == %w[7 5 3 2]
34
34
  end
35
35
 
36
36
  it "correctly unions and stores when the destination is empty and is one of the arguments" do
37
37
  @redises.sunionstore(@destination, @destination, @primes)
38
38
 
39
- @redises.smembers(@destination).should == %w[2 3 5 7]
39
+ @redises.smembers(@destination).should == %w[7 5 3 2]
40
40
  end
41
41
 
42
42
  it "raises an error if given 0 sets" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe '#watch(key)' do
4
- it "responds with 'OK'" do
5
- @redises.watch('mock-redis-test').should == 'OK'
4
+ it "responds with nil" do
5
+ @redises.watch('mock-redis-test').should be_nil
6
6
  end
7
7
  end
@@ -27,7 +27,12 @@ describe "#zadd(key, score, member)" do
27
27
  @redises.zadd(@key, 1, 'foo')
28
28
  @redises.zadd(@key, 2, 'foo')
29
29
 
30
- @redises.zscore(@key, 'foo').should == "2"
30
+ @redises.zscore(@key, 'foo').should == 2.0
31
+ end
32
+
33
+ it "supports a variable number of arguments" do
34
+ @redises.zadd(@key, [[1, 'one'], [2, 'two']])
35
+ @redises.zrange(@key, 0, -1).should == ['one', 'two']
31
36
  end
32
37
 
33
38
  it_should_behave_like "arg 1 is a score"
@@ -17,6 +17,14 @@ describe "#zcount(key, min, max)" do
17
17
  @redises.zcount(@key, 100, 200).should == 0
18
18
  end
19
19
 
20
+ it "returns count of all elements when -inf to +inf" do
21
+ @redises.zcount(@key, "-inf", '+inf').should == 4
22
+ end
23
+
24
+ it "returns a proper count of elements using +inf upper bound" do
25
+ @redises.zcount(@key, 3, "+inf").should == 2
26
+ end
27
+
20
28
  it_should_behave_like "arg 1 is a score"
21
29
  it_should_behave_like "arg 2 is a score"
22
30
  it_should_behave_like "a zset-only command"
@@ -7,23 +7,23 @@ describe "#zincrby(key, increment, member)" do
7
7
  end
8
8
 
9
9
  it "returns the new score as a string" do
10
- @redises.zincrby(@key, 10, 'bert').should == "11"
10
+ @redises.zincrby(@key, 10, 'bert').should == 11.0
11
11
  end
12
12
 
13
13
  it "updates the item's score" do
14
14
  @redises.zincrby(@key, 10, 'bert')
15
- @redises.zscore(@key, 'bert').should == "11"
15
+ @redises.zscore(@key, 'bert').should == 11.0
16
16
  end
17
17
 
18
18
  it "handles integer members correctly" do
19
19
  member = 11
20
20
  @redises.zadd(@key, 1, member)
21
21
  @redises.zincrby(@key, 1, member)
22
- @redises.zscore(@key, member).should == "2"
22
+ @redises.zscore(@key, member).should == 2.0
23
23
  end
24
24
 
25
25
  it "adds missing members with score increment" do
26
- @redises.zincrby(@key, 5.5, 'bigbird').should == "5.5"
26
+ @redises.zincrby(@key, 5.5, 'bigbird').should == 5.5
27
27
  end
28
28
 
29
29
  it_should_behave_like "arg 1 is a score"
@@ -25,7 +25,7 @@ describe "#zinterstore(destination, keys, [:weights => [w,w,], [:aggregate => :s
25
25
  it "sums the members' scores by default" do
26
26
  @redises.zinterstore(@dest, [@odds, @primes])
27
27
  @redises.zrange(@dest, 0, -1, :with_scores => true).should ==
28
- %w[three 6 five 10 seven 14]
28
+ [["three", 6.0], ["five", 10.0], ["seven", 14.0]]
29
29
  end
30
30
 
31
31
  it "removes existing elements in destination" do
@@ -33,7 +33,7 @@ describe "#zinterstore(destination, keys, [:weights => [w,w,], [:aggregate => :s
33
33
 
34
34
  @redises.zinterstore(@dest, [@primes])
35
35
  @redises.zrange(@dest, 0, -1, :with_scores => true).should ==
36
- %w[two 2 three 3 five 5 seven 7]
36
+ [["two", 2.0], ["three", 3.0], ["five", 5.0], ["seven", 7.0]]
37
37
  end
38
38
 
39
39
  it "raises an error if keys is empty" do
@@ -46,7 +46,7 @@ describe "#zinterstore(destination, keys, [:weights => [w,w,], [:aggregate => :s
46
46
  it "multiplies the scores by the weights while aggregating" do
47
47
  @redises.zinterstore(@dest, [@odds, @primes], :weights => [2, 3])
48
48
  @redises.zrange(@dest, 0, -1, :with_scores => true).should ==
49
- %w[three 15 five 25 seven 35]
49
+ [["three", 15.0], ["five", 25.0], ["seven", 35.0]]
50
50
  end
51
51
 
52
52
  it "raises an error if the number of weights != the number of keys" do
@@ -70,21 +70,21 @@ describe "#zinterstore(destination, keys, [:weights => [w,w,], [:aggregate => :s
70
70
  it "aggregates scores with min when :aggregate => :min is specified" do
71
71
  @redises.zinterstore(@dest, [@bigs, @smalls], :aggregate => :min)
72
72
  @redises.zrange(@dest, 0, -1, :with_scores => true).should ==
73
- %w[bert 1 ernie 2]
73
+ [["bert", 1.0], ["ernie", 2.0]]
74
74
  end
75
75
 
76
76
  it "aggregates scores with max when :aggregate => :max is specified" do
77
77
  @redises.zinterstore(@dest, [@bigs, @smalls], :aggregate => :max)
78
78
  @redises.zrange(@dest, 0, -1, :with_scores => true).should ==
79
- %w[bert 100 ernie 200]
79
+ [["bert", 100.0], ["ernie", 200.0]]
80
80
  end
81
81
 
82
82
  it "allows 'min', 'MIN', etc. as aliases for :min" do
83
83
  @redises.zinterstore(@dest, [@bigs, @smalls], :aggregate => 'min')
84
- @redises.zscore(@dest, 'bert').should == '1'
84
+ @redises.zscore(@dest, 'bert').should == 1.0
85
85
 
86
86
  @redises.zinterstore(@dest, [@bigs, @smalls], :aggregate => 'MIN')
87
- @redises.zscore(@dest, 'bert').should == '1'
87
+ @redises.zscore(@dest, 'bert').should == 1.0
88
88
  end
89
89
 
90
90
  it "raises an error for unknown aggregation function" do
@@ -9,6 +9,10 @@ describe "#zrange(key, start, stop [, :with_scores => true])" do
9
9
  @redises.zadd(@key, 4, 'Madison')
10
10
  end
11
11
 
12
+ it "returns the elements when the range is given as strings" do
13
+ @redises.zrange(@key, "0", "1").should == ['Washington', 'Adams']
14
+ end
15
+
12
16
  it "returns the elements in order by score" do
13
17
  @redises.zrange(@key, 0, 1).should == ['Washington', 'Adams']
14
18
  end
@@ -23,12 +27,12 @@ describe "#zrange(key, start, stop [, :with_scores => true])" do
23
27
 
24
28
  it "returns the scores when :with_scores is specified" do
25
29
  @redises.zrange(@key, 0, 1, :with_scores => true).
26
- should == ["Washington", "1", "Adams", "2"]
30
+ should == [["Washington", 1.0], ["Adams", 2.0]]
27
31
  end
28
32
 
29
33
  it "returns the scores when :withscores is specified" do
30
34
  @redises.zrange(@key, 0, 1, :withscores => true).
31
- should == ["Washington", "1", "Adams", "2"]
35
+ should == [["Washington", 1.0], ["Adams", 2.0]]
32
36
  end
33
37
 
34
38
  it_should_behave_like "a zset-only command"
@@ -15,12 +15,12 @@ describe "#zrangebyscore(key, start, stop [:with_scores => true] [:limit => [off
15
15
 
16
16
  it "returns the scores when :with_scores is specified" do
17
17
  @redises.zrangebyscore(@key, 1, 2, :with_scores => true).
18
- should == ["Washington", "1", "Adams", "2"]
18
+ should == [["Washington", 1.0], ["Adams", 2.0]]
19
19
  end
20
20
 
21
21
  it "returns the scores when :withscores is specified" do
22
22
  @redises.zrangebyscore(@key, 1, 2, :withscores => true).
23
- should == ["Washington", "1", "Adams", "2"]
23
+ should == [["Washington", 1.0], ["Adams", 2.0]]
24
24
  end
25
25
 
26
26
  it "honors the :limit => [offset count] argument" do
@@ -28,5 +28,10 @@ describe "#zrem(key, member)" do
28
28
  @redises.zrange(@key, 0, -1).should == ['one', 'two']
29
29
  end
30
30
 
31
+ it "supports a variable number of arguments" do
32
+ @redises.zrem(@key, ['one', 'two'])
33
+ @redises.zrange(@key, 0, -1).should be_empty
34
+ end
35
+
31
36
  it_should_behave_like "a zset-only command"
32
37
  end