mock_redis 0.19.0 → 0.24.0

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +32 -5
  3. data/.rubocop_todo.yml +1 -1
  4. data/.travis.yml +9 -10
  5. data/CHANGELOG.md +46 -0
  6. data/Gemfile +2 -2
  7. data/LICENSE.md +21 -0
  8. data/README.md +39 -15
  9. data/lib/mock_redis.rb +0 -5
  10. data/lib/mock_redis/database.rb +59 -22
  11. data/lib/mock_redis/future.rb +1 -1
  12. data/lib/mock_redis/geospatial_methods.rb +14 -22
  13. data/lib/mock_redis/hash_methods.rb +23 -15
  14. data/lib/mock_redis/indifferent_hash.rb +0 -8
  15. data/lib/mock_redis/info_method.rb +2 -2
  16. data/lib/mock_redis/list_methods.rb +2 -2
  17. data/lib/mock_redis/multi_db_wrapper.rb +2 -2
  18. data/lib/mock_redis/pipelined_wrapper.rb +25 -6
  19. data/lib/mock_redis/set_methods.rb +16 -4
  20. data/lib/mock_redis/stream.rb +62 -0
  21. data/lib/mock_redis/stream/id.rb +60 -0
  22. data/lib/mock_redis/stream_methods.rb +87 -0
  23. data/lib/mock_redis/string_methods.rb +31 -20
  24. data/lib/mock_redis/transaction_wrapper.rb +27 -14
  25. data/lib/mock_redis/utility_methods.rb +6 -3
  26. data/lib/mock_redis/version.rb +1 -1
  27. data/lib/mock_redis/zset_methods.rb +54 -11
  28. data/mock_redis.gemspec +6 -6
  29. data/spec/client_spec.rb +12 -0
  30. data/spec/commands/blpop_spec.rb +0 -6
  31. data/spec/commands/brpop_spec.rb +6 -5
  32. data/spec/commands/dump_spec.rb +19 -0
  33. data/spec/commands/exists_spec.rb +34 -5
  34. data/spec/commands/future_spec.rb +11 -1
  35. data/spec/commands/geoadd_spec.rb +1 -1
  36. data/spec/commands/geodist_spec.rb +8 -4
  37. data/spec/commands/geohash_spec.rb +4 -4
  38. data/spec/commands/geopos_spec.rb +4 -4
  39. data/spec/commands/get_spec.rb +1 -0
  40. data/spec/commands/hdel_spec.rb +18 -2
  41. data/spec/commands/hmset_spec.rb +26 -0
  42. data/spec/commands/hset_spec.rb +6 -6
  43. data/spec/commands/keys_spec.rb +17 -0
  44. data/spec/commands/mget_spec.rb +34 -15
  45. data/spec/commands/move_spec.rb +5 -5
  46. data/spec/commands/mset_spec.rb +14 -0
  47. data/spec/commands/pipelined_spec.rb +72 -0
  48. data/spec/commands/restore_spec.rb +47 -0
  49. data/spec/commands/scan_spec.rb +9 -0
  50. data/spec/commands/set_spec.rb +12 -2
  51. data/spec/commands/setbit_spec.rb +1 -0
  52. data/spec/commands/setex_spec.rb +16 -0
  53. data/spec/commands/spop_spec.rb +15 -0
  54. data/spec/commands/srandmember_spec.rb +1 -1
  55. data/spec/commands/srem_spec.rb +5 -0
  56. data/spec/commands/watch_spec.rb +8 -3
  57. data/spec/commands/xadd_spec.rb +104 -0
  58. data/spec/commands/xlen_spec.rb +20 -0
  59. data/spec/commands/xrange_spec.rb +141 -0
  60. data/spec/commands/xrevrange_spec.rb +130 -0
  61. data/spec/commands/xtrim_spec.rb +30 -0
  62. data/spec/commands/zinterstore_spec.rb +34 -0
  63. data/spec/commands/zpopmax_spec.rb +60 -0
  64. data/spec/commands/zpopmin_spec.rb +60 -0
  65. data/spec/commands/zrange_spec.rb +1 -1
  66. data/spec/commands/zrangebyscore_spec.rb +1 -1
  67. data/spec/commands/zrevrange_spec.rb +1 -1
  68. data/spec/commands/zrevrangebyscore_spec.rb +1 -1
  69. data/spec/commands/zunionstore_spec.rb +33 -0
  70. data/spec/mock_redis_spec.rb +4 -6
  71. data/spec/spec_helper.rb +6 -2
  72. data/spec/support/redis_multiplexer.rb +18 -1
  73. data/spec/support/shared_examples/does_not_cleanup_empty_strings.rb +14 -0
  74. data/spec/support/shared_examples/only_operates_on_hashes.rb +2 -0
  75. data/spec/support/shared_examples/only_operates_on_lists.rb +2 -0
  76. data/spec/support/shared_examples/only_operates_on_sets.rb +2 -0
  77. data/spec/support/shared_examples/only_operates_on_zsets.rb +2 -0
  78. data/spec/transactions_spec.rb +30 -26
  79. metadata +45 -31
  80. data/LICENSE +0 -19
  81. data/spec/commands/hash_operator_spec.rb +0 -21
@@ -0,0 +1,141 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#xrange("mystream", first: "0-1", last: "0-3", count: 10)' do
4
+ before { @key = 'mock-redis-test:xrange' }
5
+
6
+ it 'finds an empty range' do
7
+ expect(@redises.xrange(@key, '-', '+')).to eq []
8
+ end
9
+
10
+ it 'finds a single entry with a full range' do
11
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-0')
12
+ expect(@redises.xrange(@key, '-', '+'))
13
+ .to eq [['1234567891234-0', { 'key' => 'value' }]]
14
+ end
15
+
16
+ it 'finds multiple key/value pairs with a full range' do
17
+ @redises.xadd(@key, { key1: 'value1', key2: 'value2', key3: 'value3' }, id: '1234567891234-0')
18
+ expect(@redises.xrange(@key, '-', '+'))
19
+ .to eq [['1234567891234-0', { 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' }]]
20
+ end
21
+
22
+ context 'six items on the list' do
23
+ before :each do
24
+ @redises.xadd(@key, { key1: 'value1' }, id: '1234567891234-0')
25
+ @redises.xadd(@key, { key2: 'value2' }, id: '1234567891245-0')
26
+ @redises.xadd(@key, { key3: 'value3' }, id: '1234567891245-1')
27
+ @redises.xadd(@key, { key4: 'value4' }, id: '1234567891278-0')
28
+ @redises.xadd(@key, { key5: 'value5' }, id: '1234567891278-1')
29
+ @redises.xadd(@key, { key6: 'value6' }, id: '1234567891299-0')
30
+ end
31
+
32
+ it 'returns entries in sequential order' do
33
+ expect(@redises.xrange(@key, '-', '+')).to eq(
34
+ [
35
+ ['1234567891234-0', { 'key1' => 'value1' }],
36
+ ['1234567891245-0', { 'key2' => 'value2' }],
37
+ ['1234567891245-1', { 'key3' => 'value3' }],
38
+ ['1234567891278-0', { 'key4' => 'value4' }],
39
+ ['1234567891278-1', { 'key5' => 'value5' }],
40
+ ['1234567891299-0', { 'key6' => 'value6' }]
41
+ ]
42
+ )
43
+ end
44
+
45
+ it 'returns entries with a lower limit' do
46
+ expect(@redises.xrange(@key, '1234567891239-0', '+')).to eq(
47
+ [
48
+ ['1234567891245-0', { 'key2' => 'value2' }],
49
+ ['1234567891245-1', { 'key3' => 'value3' }],
50
+ ['1234567891278-0', { 'key4' => 'value4' }],
51
+ ['1234567891278-1', { 'key5' => 'value5' }],
52
+ ['1234567891299-0', { 'key6' => 'value6' }]
53
+ ]
54
+ )
55
+ end
56
+
57
+ it 'returns entries with an upper limit' do
58
+ expect(@redises.xrange(@key, '-', '1234567891285-0')).to eq(
59
+ [
60
+ ['1234567891234-0', { 'key1' => 'value1' }],
61
+ ['1234567891245-0', { 'key2' => 'value2' }],
62
+ ['1234567891245-1', { 'key3' => 'value3' }],
63
+ ['1234567891278-0', { 'key4' => 'value4' }],
64
+ ['1234567891278-1', { 'key5' => 'value5' }]
65
+ ]
66
+ )
67
+ end
68
+
69
+ it 'returns entries with both a lower and an upper limit' do
70
+ expect(@redises.xrange(@key, '1234567891239-0', '1234567891285-0')).to eq(
71
+ [
72
+ ['1234567891245-0', { 'key2' => 'value2' }],
73
+ ['1234567891245-1', { 'key3' => 'value3' }],
74
+ ['1234567891278-0', { 'key4' => 'value4' }],
75
+ ['1234567891278-1', { 'key5' => 'value5' }]
76
+ ]
77
+ )
78
+ end
79
+
80
+ it 'finds the list with sequence numbers' do
81
+ expect(@redises.xrange(@key, '1234567891245-1', '1234567891278-0')).to eq(
82
+ [
83
+ ['1234567891245-1', { 'key3' => 'value3' }],
84
+ ['1234567891278-0', { 'key4' => 'value4' }]
85
+ ]
86
+ )
87
+ end
88
+
89
+ it 'finds the list with lower bound without sequence numbers' do
90
+ expect(@redises.xrange(@key, '1234567891245', '+')).to eq(
91
+ [
92
+ ['1234567891245-0', { 'key2' => 'value2' }],
93
+ ['1234567891245-1', { 'key3' => 'value3' }],
94
+ ['1234567891278-0', { 'key4' => 'value4' }],
95
+ ['1234567891278-1', { 'key5' => 'value5' }],
96
+ ['1234567891299-0', { 'key6' => 'value6' }]
97
+ ]
98
+ )
99
+ end
100
+
101
+ it 'finds the list with upper bound without sequence numbers' do
102
+ expect(@redises.xrange(@key, '-', '1234567891278')).to eq(
103
+ [
104
+ ['1234567891234-0', { 'key1' => 'value1' }],
105
+ ['1234567891245-0', { 'key2' => 'value2' }],
106
+ ['1234567891245-1', { 'key3' => 'value3' }],
107
+ ['1234567891278-0', { 'key4' => 'value4' }],
108
+ ['1234567891278-1', { 'key5' => 'value5' }]
109
+ ]
110
+ )
111
+ end
112
+
113
+ it 'accepts limits as integers' do
114
+ expect(@redises.xrange(@key, 1_234_567_891_245, 1_234_567_891_278)).to eq(
115
+ [
116
+ ['1234567891245-0', { 'key2' => 'value2' }],
117
+ ['1234567891245-1', { 'key3' => 'value3' }],
118
+ ['1234567891278-0', { 'key4' => 'value4' }],
119
+ ['1234567891278-1', { 'key5' => 'value5' }]
120
+ ]
121
+ )
122
+ end
123
+
124
+ it 'returns a limited number of items' do
125
+ expect(@redises.xrange(@key, '-', '+', count: 2)).to eq(
126
+ [
127
+ ['1234567891234-0', { 'key1' => 'value1' }],
128
+ ['1234567891245-0', { 'key2' => 'value2' }]
129
+ ]
130
+ )
131
+ end
132
+ end
133
+
134
+ it 'raises an invalid stream id error' do
135
+ expect { @redises.xrange(@key, 'X', '+') }
136
+ .to raise_error(
137
+ Redis::CommandError,
138
+ 'ERR Invalid stream ID specified as stream command argument'
139
+ )
140
+ end
141
+ end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#xrevrange(key, start, end)' do
4
+ before { @key = 'mock-redis-test:xrevrange' }
5
+
6
+ it 'finds an empty range' do
7
+ expect(@redises.xrevrange(@key, '-', '+')).to eq []
8
+ end
9
+
10
+ it 'finds a single entry with a full range' do
11
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-0')
12
+ expect(@redises.xrevrange(@key, '+', '-'))
13
+ .to eq [['1234567891234-0', { 'key' => 'value' }]]
14
+ end
15
+
16
+ it 'finds multiple key/value pairs with a full range' do
17
+ @redises.xadd(@key, { key1: 'value1', key2: 'value2', key3: 'value3' }, id: '1234567891234-0')
18
+ expect(@redises.xrevrange(@key, '+', '-'))
19
+ .to eq [['1234567891234-0', { 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' }]]
20
+ end
21
+
22
+ context 'six items on the list' do
23
+ before :each do
24
+ @redises.xadd(@key, { key1: 'value1' }, id: '1234567891234-0')
25
+ @redises.xadd(@key, { key2: 'value2' }, id: '1234567891245-0')
26
+ @redises.xadd(@key, { key3: 'value3' }, id: '1234567891245-1')
27
+ @redises.xadd(@key, { key4: 'value4' }, id: '1234567891278-0')
28
+ @redises.xadd(@key, { key5: 'value5' }, id: '1234567891278-1')
29
+ @redises.xadd(@key, { key6: 'value6' }, id: '1234567891299-0')
30
+ end
31
+
32
+ it 'returns entries in sequential order' do
33
+ expect(@redises.xrevrange(@key, '+', '-')).to eq(
34
+ [
35
+ ['1234567891299-0', { 'key6' => 'value6' }],
36
+ ['1234567891278-1', { 'key5' => 'value5' }],
37
+ ['1234567891278-0', { 'key4' => 'value4' }],
38
+ ['1234567891245-1', { 'key3' => 'value3' }],
39
+ ['1234567891245-0', { 'key2' => 'value2' }],
40
+ ['1234567891234-0', { 'key1' => 'value1' }],
41
+ ]
42
+ )
43
+ end
44
+
45
+ it 'returns entries with a lower limit' do
46
+ expect(@redises.xrevrange(@key, '+', '1234567891239-0')).to eq(
47
+ [
48
+ ['1234567891299-0', { 'key6' => 'value6' }],
49
+ ['1234567891278-1', { 'key5' => 'value5' }],
50
+ ['1234567891278-0', { 'key4' => 'value4' }],
51
+ ['1234567891245-1', { 'key3' => 'value3' }],
52
+ ['1234567891245-0', { 'key2' => 'value2' }],
53
+ ]
54
+ )
55
+ end
56
+
57
+ it 'returns entries with an upper limit' do
58
+ expect(@redises.xrevrange(@key, '1234567891285-0', '-')).to eq(
59
+ [
60
+ ['1234567891278-1', { 'key5' => 'value5' }],
61
+ ['1234567891278-0', { 'key4' => 'value4' }],
62
+ ['1234567891245-1', { 'key3' => 'value3' }],
63
+ ['1234567891245-0', { 'key2' => 'value2' }],
64
+ ['1234567891234-0', { 'key1' => 'value1' }],
65
+ ]
66
+ )
67
+ end
68
+
69
+ it 'returns entries with both a lower and an upper limit' do
70
+ expect(@redises.xrevrange(@key, '1234567891285-0', '1234567891239-0')).to eq(
71
+ [
72
+ ['1234567891278-1', { 'key5' => 'value5' }],
73
+ ['1234567891278-0', { 'key4' => 'value4' }],
74
+ ['1234567891245-1', { 'key3' => 'value3' }],
75
+ ['1234567891245-0', { 'key2' => 'value2' }],
76
+ ]
77
+ )
78
+ end
79
+
80
+ it 'finds the list with sequence numbers' do
81
+ expect(@redises.xrevrange(@key, '1234567891278-0', '1234567891245-1')).to eq(
82
+ [
83
+ ['1234567891278-0', { 'key4' => 'value4' }],
84
+ ['1234567891245-1', { 'key3' => 'value3' }],
85
+ ]
86
+ )
87
+ end
88
+
89
+ it 'finds the list with lower bound without sequence numbers' do
90
+ expect(@redises.xrevrange(@key, '+', '1234567891245')).to eq(
91
+ [
92
+ ['1234567891299-0', { 'key6' => 'value6' }],
93
+ ['1234567891278-1', { 'key5' => 'value5' }],
94
+ ['1234567891278-0', { 'key4' => 'value4' }],
95
+ ['1234567891245-1', { 'key3' => 'value3' }],
96
+ ['1234567891245-0', { 'key2' => 'value2' }],
97
+ ]
98
+ )
99
+ end
100
+
101
+ it 'finds the list with upper bound without sequence numbers' do
102
+ expect(@redises.xrevrange(@key, '1234567891278', '-')).to eq(
103
+ [
104
+ ['1234567891278-1', { 'key5' => 'value5' }],
105
+ ['1234567891278-0', { 'key4' => 'value4' }],
106
+ ['1234567891245-1', { 'key3' => 'value3' }],
107
+ ['1234567891245-0', { 'key2' => 'value2' }],
108
+ ['1234567891234-0', { 'key1' => 'value1' }],
109
+ ]
110
+ )
111
+ end
112
+
113
+ it 'returns a limited number of items' do
114
+ expect(@redises.xrevrange(@key, count: 2)).to eq(
115
+ [
116
+ ['1234567891299-0', { 'key6' => 'value6' }],
117
+ ['1234567891278-1', { 'key5' => 'value5' }],
118
+ ]
119
+ )
120
+ end
121
+ end
122
+
123
+ it 'raises an invalid stream id error' do
124
+ expect { @redises.xrevrange(@key, 'X', '-') }
125
+ .to raise_error(
126
+ Redis::CommandError,
127
+ 'ERR Invalid stream ID specified as stream command argument'
128
+ )
129
+ end
130
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#xtrim("mystream", 1000, approximate: true)' do
4
+ before { @key = 'mock-redis-test:xtrim' }
5
+
6
+ before :each do
7
+ @redises.xadd(@key, { key1: 'value1' }, id: '1234567891234-0')
8
+ @redises.xadd(@key, { key2: 'value2' }, id: '1234567891245-0')
9
+ @redises.xadd(@key, { key3: 'value3' }, id: '1234567891245-1')
10
+ @redises.xadd(@key, { key4: 'value4' }, id: '1234567891278-0')
11
+ @redises.xadd(@key, { key5: 'value5' }, id: '1234567891278-1')
12
+ @redises.xadd(@key, { key6: 'value6' }, id: '1234567891299-0')
13
+ end
14
+
15
+ it 'returns the number of elements deleted' do
16
+ expect(@redises.xtrim(@key, 4)).to eq 2
17
+ end
18
+
19
+ it 'deletes the oldes elements' do
20
+ @redises.xtrim(@key, 4)
21
+ expect(@redises.xrange(@key, '-', '+')).to eq(
22
+ [
23
+ ['1234567891245-1', { 'key3' => 'value3' }],
24
+ ['1234567891278-0', { 'key4' => 'value4' }],
25
+ ['1234567891278-1', { 'key5' => 'value5' }],
26
+ ['1234567891299-0', { 'key6' => 'value6' }]
27
+ ]
28
+ )
29
+ end
30
+ end
@@ -42,6 +42,40 @@ describe '#zinterstore(destination, keys, [:weights => [w,w,], [:aggregate => :s
42
42
  end.should raise_error(Redis::CommandError)
43
43
  end
44
44
 
45
+ context 'when used with a set' do
46
+ before do
47
+ @primes_text = 'mock-redis-test:zinterstore:primes-text'
48
+
49
+ @redises.sadd(@primes_text, 'two')
50
+ @redises.sadd(@primes_text, 'three')
51
+ @redises.sadd(@primes_text, 'five')
52
+ @redises.sadd(@primes_text, 'seven')
53
+ end
54
+
55
+ it 'returns the number of elements in the new set' do
56
+ @redises.zinterstore(@dest, [@odds, @primes_text]).should == 3
57
+ end
58
+
59
+ it 'sums the scores, substituting 1.0 for set values' do
60
+ @redises.zinterstore(@dest, [@odds, @primes_text])
61
+ @redises.zrange(@dest, 0, -1, :with_scores => true).should ==
62
+ [['three', 4.0], ['five', 6.0], ['seven', 8.0]]
63
+ end
64
+ end
65
+
66
+ context 'when used with a non-coercible structure' do
67
+ before do
68
+ @non_set = 'mock-redis-test:zinterstore:non-set'
69
+
70
+ @redises.set(@non_set, 'one')
71
+ end
72
+ it 'raises an error for wrong value type' do
73
+ lambda do
74
+ @redises.zinterstore(@dest, [@odds, @non_set])
75
+ end.should raise_error(Redis::CommandError)
76
+ end
77
+ end
78
+
45
79
  context 'the :weights argument' do
46
80
  it 'multiplies the scores by the weights while aggregating' do
47
81
  @redises.zinterstore(@dest, [@odds, @primes], :weights => [2, 3])
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#zpopmax(key, count)' do
4
+ before(:each) do
5
+ @key = 'mock-redis-test:zpopmax'
6
+ @redises.del(@key)
7
+ @redises.zadd(@key, 1, 'one')
8
+ @redises.zadd(@key, 2, 'two')
9
+ @redises.zadd(@key, 3, 'three')
10
+ end
11
+
12
+ context 'when count is unspecified' do
13
+ it 'returns nil if the set does not exist' do
14
+ @redises.zpopmax('does-not-exist').should nil
15
+ end
16
+
17
+ it 'returns the highest ranked element' do
18
+ @redises.zpopmax(@key).should == ['three', 3]
19
+ @redises.zcard(@key).should == 2
20
+ end
21
+ end
22
+
23
+ context 'when count is 1' do
24
+ let(:count) { 1 }
25
+
26
+ it 'returns nil if the set does not exist' do
27
+ @redises.zpopmax('does-not-exist', count).should nil
28
+ end
29
+
30
+ it 'returns the highest ranked element' do
31
+ @redises.zpopmax(@key, count).should == ['three', 3]
32
+ @redises.zcard(@key).should == 2
33
+ end
34
+ end
35
+
36
+ context 'when count is greater than 1' do
37
+ let(:count) { 2 }
38
+
39
+ it 'returns empty array if the set does not exist' do
40
+ @redises.zpopmax('does-not-exist', count).should == []
41
+ end
42
+
43
+ it 'returns the highest ranked elements' do
44
+ @redises.zpopmax(@key, count).should == [['three', 3], ['two', 2]]
45
+ @redises.zcard(@key).should == 1
46
+ end
47
+ end
48
+
49
+ context 'when count is greater than the size of the set' do
50
+ let(:count) { 4 }
51
+
52
+ it 'returns the entire set' do
53
+ before = @redises.zrange(@key, 0, count, with_scores: true).reverse
54
+ @redises.zpopmax(@key, count).should == before
55
+ @redises.zcard(@key).should == 0
56
+ end
57
+ end
58
+
59
+ it_should_behave_like 'a zset-only command'
60
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#zpopmin(key, count)' do
4
+ before(:each) do
5
+ @key = 'mock-redis-test:zpopmin'
6
+ @redises.del(@key)
7
+ @redises.zadd(@key, 1, 'one')
8
+ @redises.zadd(@key, 2, 'two')
9
+ @redises.zadd(@key, 3, 'three')
10
+ end
11
+
12
+ context 'when count is unspecified' do
13
+ it 'returns nil if the set does not exist' do
14
+ @redises.zpopmin('does-not-exist').should nil
15
+ end
16
+
17
+ it 'returns the lowest ranked element' do
18
+ @redises.zpopmin(@key).should == ['one', 1]
19
+ @redises.zcard(@key).should == 2
20
+ end
21
+ end
22
+
23
+ context 'when count is 1' do
24
+ let(:count) { 1 }
25
+
26
+ it 'returns nil if the set does not exist' do
27
+ @redises.zpopmin('does-not-exist', count).should nil
28
+ end
29
+
30
+ it 'returns the lowest ranked element' do
31
+ @redises.zpopmin(@key, count).should == ['one', 1]
32
+ @redises.zcard(@key).should == 2
33
+ end
34
+ end
35
+
36
+ context 'when count is greater than 1' do
37
+ let(:count) { 2 }
38
+
39
+ it 'returns empty array if the set does not exist' do
40
+ @redises.zpopmin('does-not-exist', count).should == []
41
+ end
42
+
43
+ it 'returns the lowest ranked elements' do
44
+ @redises.zpopmin(@key, count).should == [['one', 1], ['two', 2]]
45
+ @redises.zcard(@key).should == 1
46
+ end
47
+ end
48
+
49
+ context 'when count is greater than the size of the set' do
50
+ let(:count) { 4 }
51
+
52
+ it 'returns the entire set' do
53
+ before = @redises.zrange(@key, 0, count, with_scores: true)
54
+ @redises.zpopmin(@key, count).should == before
55
+ @redises.zcard(@key).should == 0
56
+ end
57
+ end
58
+
59
+ it_should_behave_like 'a zset-only command'
60
+ end