mock_redis 0.5.4 → 0.31.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 (201) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/lint.yml +31 -0
  3. data/.github/workflows/tests.yml +63 -0
  4. data/.gitignore +1 -1
  5. data/.overcommit.yml +21 -0
  6. data/.rspec +1 -1
  7. data/.rubocop.yml +148 -0
  8. data/.rubocop_todo.yml +35 -0
  9. data/.simplecov +4 -0
  10. data/CHANGELOG.md +278 -0
  11. data/Gemfile +9 -5
  12. data/LICENSE.md +21 -0
  13. data/README.md +52 -16
  14. data/Rakefile +0 -8
  15. data/lib/mock_redis/assertions.rb +0 -1
  16. data/lib/mock_redis/connection_method.rb +13 -0
  17. data/lib/mock_redis/database.rb +193 -257
  18. data/lib/mock_redis/expire_wrapper.rb +2 -2
  19. data/lib/mock_redis/future.rb +23 -0
  20. data/lib/mock_redis/geospatial_methods.rb +240 -0
  21. data/lib/mock_redis/hash_methods.rb +83 -24
  22. data/lib/mock_redis/indifferent_hash.rb +11 -0
  23. data/lib/mock_redis/info_method.rb +160 -0
  24. data/lib/mock_redis/list_methods.rb +34 -19
  25. data/lib/mock_redis/multi_db_wrapper.rb +8 -7
  26. data/lib/mock_redis/pipelined_wrapper.rb +42 -16
  27. data/lib/mock_redis/set_methods.rb +62 -19
  28. data/lib/mock_redis/sort_method.rb +81 -0
  29. data/lib/mock_redis/stream/id.rb +58 -0
  30. data/lib/mock_redis/stream.rb +88 -0
  31. data/lib/mock_redis/stream_methods.rb +102 -0
  32. data/lib/mock_redis/string_methods.rb +235 -42
  33. data/lib/mock_redis/transaction_wrapper.rb +62 -28
  34. data/lib/mock_redis/utility_methods.rb +62 -11
  35. data/lib/mock_redis/version.rb +4 -1
  36. data/lib/mock_redis/zset.rb +24 -29
  37. data/lib/mock_redis/zset_methods.rb +187 -59
  38. data/lib/mock_redis.rb +77 -27
  39. data/mock_redis.gemspec +23 -15
  40. data/spec/client_spec.rb +29 -0
  41. data/spec/cloning_spec.rb +17 -18
  42. data/spec/commands/append_spec.rb +4 -4
  43. data/spec/commands/auth_spec.rb +1 -1
  44. data/spec/commands/bgrewriteaof_spec.rb +2 -2
  45. data/spec/commands/bgsave_spec.rb +2 -2
  46. data/spec/commands/bitcount_spec.rb +25 -0
  47. data/spec/commands/bitfield_spec.rb +169 -0
  48. data/spec/commands/blpop_spec.rb +19 -21
  49. data/spec/commands/brpop_spec.rb +25 -20
  50. data/spec/commands/brpoplpush_spec.rb +16 -17
  51. data/spec/commands/connected_spec.rb +7 -0
  52. data/spec/commands/connection_spec.rb +15 -0
  53. data/spec/commands/dbsize_spec.rb +3 -3
  54. data/spec/commands/decr_spec.rb +8 -8
  55. data/spec/commands/decrby_spec.rb +8 -8
  56. data/spec/commands/del_spec.rb +35 -3
  57. data/spec/commands/disconnect_spec.rb +7 -0
  58. data/spec/commands/dump_spec.rb +19 -0
  59. data/spec/commands/echo_spec.rb +4 -4
  60. data/spec/commands/eval_spec.rb +7 -0
  61. data/spec/commands/evalsha_spec.rb +10 -0
  62. data/spec/commands/exists_spec.rb +36 -7
  63. data/spec/commands/expire_spec.rb +48 -20
  64. data/spec/commands/expireat_spec.rb +12 -13
  65. data/spec/commands/flushall_spec.rb +5 -5
  66. data/spec/commands/flushdb_spec.rb +5 -5
  67. data/spec/commands/future_spec.rb +30 -0
  68. data/spec/commands/geoadd_spec.rb +58 -0
  69. data/spec/commands/geodist_spec.rb +118 -0
  70. data/spec/commands/geohash_spec.rb +52 -0
  71. data/spec/commands/geopos_spec.rb +55 -0
  72. data/spec/commands/get_spec.rb +14 -6
  73. data/spec/commands/getbit_spec.rb +7 -7
  74. data/spec/commands/getrange_spec.rb +9 -9
  75. data/spec/commands/getset_spec.rb +7 -7
  76. data/spec/commands/hdel_spec.rb +41 -11
  77. data/spec/commands/hexists_spec.rb +11 -11
  78. data/spec/commands/hget_spec.rb +7 -7
  79. data/spec/commands/hgetall_spec.rb +15 -5
  80. data/spec/commands/hincrby_spec.rb +16 -16
  81. data/spec/commands/hincrbyfloat_spec.rb +58 -0
  82. data/spec/commands/hkeys_spec.rb +5 -5
  83. data/spec/commands/hlen_spec.rb +5 -5
  84. data/spec/commands/hmget_spec.rb +19 -9
  85. data/spec/commands/hmset_spec.rb +38 -12
  86. data/spec/commands/hscan_each_spec.rb +48 -0
  87. data/spec/commands/hscan_spec.rb +27 -0
  88. data/spec/commands/hset_spec.rb +26 -12
  89. data/spec/commands/hsetnx_spec.rb +16 -16
  90. data/spec/commands/hvals_spec.rb +5 -5
  91. data/spec/commands/incr_spec.rb +8 -8
  92. data/spec/commands/incrby_spec.rb +13 -13
  93. data/spec/commands/incrbyfloat_spec.rb +13 -13
  94. data/spec/commands/info_spec.rb +54 -5
  95. data/spec/commands/keys_spec.rb +83 -31
  96. data/spec/commands/lastsave_spec.rb +2 -2
  97. data/spec/commands/lindex_spec.rb +20 -10
  98. data/spec/commands/linsert_spec.rb +14 -14
  99. data/spec/commands/llen_spec.rb +4 -4
  100. data/spec/commands/lpop_spec.rb +6 -6
  101. data/spec/commands/lpush_spec.rb +21 -15
  102. data/spec/commands/lpushx_spec.rb +24 -11
  103. data/spec/commands/lrange_spec.rb +24 -8
  104. data/spec/commands/lrem_spec.rb +16 -16
  105. data/spec/commands/lset_spec.rb +17 -12
  106. data/spec/commands/ltrim_spec.rb +17 -7
  107. data/spec/commands/mapped_hmget_spec.rb +13 -9
  108. data/spec/commands/mapped_hmset_spec.rb +12 -12
  109. data/spec/commands/mapped_mget_spec.rb +22 -0
  110. data/spec/commands/mapped_mset_spec.rb +19 -0
  111. data/spec/commands/mapped_msetnx_spec.rb +26 -0
  112. data/spec/commands/mget_spec.rb +48 -17
  113. data/spec/commands/move_spec.rb +37 -37
  114. data/spec/commands/mset_spec.rb +20 -6
  115. data/spec/commands/msetnx_spec.rb +14 -14
  116. data/spec/commands/persist_spec.rb +15 -16
  117. data/spec/commands/pexpire_spec.rb +86 -0
  118. data/spec/commands/pexpireat_spec.rb +48 -0
  119. data/spec/commands/ping_spec.rb +6 -2
  120. data/spec/commands/pipelined_spec.rb +98 -7
  121. data/spec/commands/pttl_spec.rb +41 -0
  122. data/spec/commands/randomkey_spec.rb +3 -3
  123. data/spec/commands/rename_spec.rb +16 -12
  124. data/spec/commands/renamenx_spec.rb +13 -15
  125. data/spec/commands/restore_spec.rb +47 -0
  126. data/spec/commands/rpop_spec.rb +6 -6
  127. data/spec/commands/rpoplpush_spec.rb +13 -8
  128. data/spec/commands/rpush_spec.rb +21 -15
  129. data/spec/commands/rpushx_spec.rb +24 -11
  130. data/spec/commands/sadd_spec.rb +14 -10
  131. data/spec/commands/scan_each_spec.rb +39 -0
  132. data/spec/commands/scan_spec.rb +64 -0
  133. data/spec/commands/scard_spec.rb +3 -3
  134. data/spec/commands/script_spec.rb +9 -0
  135. data/spec/commands/sdiff_spec.rb +13 -13
  136. data/spec/commands/sdiffstore_spec.rb +13 -13
  137. data/spec/commands/select_spec.rb +13 -5
  138. data/spec/commands/set_spec.rb +112 -0
  139. data/spec/commands/setbit_spec.rb +25 -16
  140. data/spec/commands/setex_spec.rb +20 -4
  141. data/spec/commands/setnx_spec.rb +6 -6
  142. data/spec/commands/setrange_spec.rb +12 -12
  143. data/spec/commands/sinter_spec.rb +11 -13
  144. data/spec/commands/sinterstore_spec.rb +12 -12
  145. data/spec/commands/sismember_spec.rb +10 -10
  146. data/spec/commands/smembers_spec.rb +15 -5
  147. data/spec/commands/smove_spec.rb +13 -13
  148. data/spec/commands/sort_list_spec.rb +21 -0
  149. data/spec/commands/sort_set_spec.rb +21 -0
  150. data/spec/commands/sort_zset_spec.rb +21 -0
  151. data/spec/commands/spop_spec.rb +19 -4
  152. data/spec/commands/srandmember_spec.rb +28 -4
  153. data/spec/commands/srem_spec.rb +17 -12
  154. data/spec/commands/sscan_each_spec.rb +48 -0
  155. data/spec/commands/sscan_spec.rb +39 -0
  156. data/spec/commands/strlen_spec.rb +4 -5
  157. data/spec/commands/sunion_spec.rb +13 -11
  158. data/spec/commands/sunionstore_spec.rb +12 -12
  159. data/spec/commands/ttl_spec.rb +11 -6
  160. data/spec/commands/type_spec.rb +1 -1
  161. data/spec/commands/watch_spec.rb +9 -4
  162. data/spec/commands/xadd_spec.rb +122 -0
  163. data/spec/commands/xlen_spec.rb +22 -0
  164. data/spec/commands/xrange_spec.rb +164 -0
  165. data/spec/commands/xread_spec.rb +66 -0
  166. data/spec/commands/xrevrange_spec.rb +130 -0
  167. data/spec/commands/xtrim_spec.rb +36 -0
  168. data/spec/commands/zadd_spec.rb +100 -11
  169. data/spec/commands/zcard_spec.rb +4 -4
  170. data/spec/commands/zcount_spec.rb +18 -10
  171. data/spec/commands/zincrby_spec.rb +6 -6
  172. data/spec/commands/zinterstore_spec.rb +54 -20
  173. data/spec/commands/zpopmax_spec.rb +60 -0
  174. data/spec/commands/zpopmin_spec.rb +60 -0
  175. data/spec/commands/zrange_spec.rb +54 -13
  176. data/spec/commands/zrangebyscore_spec.rb +42 -27
  177. data/spec/commands/zrank_spec.rb +4 -4
  178. data/spec/commands/zrem_spec.rb +18 -12
  179. data/spec/commands/zremrangebyrank_spec.rb +5 -5
  180. data/spec/commands/zremrangebyscore_spec.rb +12 -5
  181. data/spec/commands/zrevrange_spec.rb +35 -10
  182. data/spec/commands/zrevrangebyscore_spec.rb +26 -15
  183. data/spec/commands/zrevrank_spec.rb +4 -4
  184. data/spec/commands/zscan_each_spec.rb +48 -0
  185. data/spec/commands/zscan_spec.rb +26 -0
  186. data/spec/commands/zscore_spec.rb +7 -7
  187. data/spec/commands/zunionstore_spec.rb +54 -21
  188. data/spec/mock_redis_spec.rb +61 -0
  189. data/spec/spec_helper.rb +35 -8
  190. data/spec/support/redis_multiplexer.rb +62 -37
  191. data/spec/support/shared_examples/does_not_cleanup_empty_strings.rb +14 -0
  192. data/spec/support/shared_examples/only_operates_on_hashes.rb +5 -3
  193. data/spec/support/shared_examples/only_operates_on_lists.rb +5 -3
  194. data/spec/support/shared_examples/only_operates_on_sets.rb +5 -3
  195. data/spec/support/shared_examples/only_operates_on_strings.rb +4 -4
  196. data/spec/support/shared_examples/only_operates_on_zsets.rb +18 -16
  197. data/spec/support/shared_examples/sorts_enumerables.rb +56 -0
  198. data/spec/transactions_spec.rb +79 -29
  199. metadata +162 -42
  200. data/LICENSE +0 -19
  201. data/spec/commands/hash_operator_spec.rb +0 -21
@@ -1,33 +1,46 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#lpushx(key, value)" do
3
+ describe '#lpushx(key, value)' do
4
4
  before { @key = 'mock-redis-test:81267' }
5
5
 
6
- it "returns the new size of the list" do
6
+ it 'returns the new size of the list' do
7
7
  @redises.lpush(@key, 'X')
8
8
 
9
9
  @redises.lpushx(@key, 'X').should == 2
10
10
  @redises.lpushx(@key, 'X').should == 3
11
11
  end
12
12
 
13
- it "does nothing when run against a nonexistent key" do
13
+ it 'does nothing when run against a nonexistent key' do
14
14
  @redises.lpushx(@key, 'value')
15
15
  @redises.get(@key).should be_nil
16
16
  end
17
17
 
18
- it "prepends items to the list" do
19
- @redises.lpush(@key, "bert")
20
- @redises.lpushx(@key, "ernie")
18
+ it 'prepends items to the list' do
19
+ @redises.lpush(@key, 'bert')
20
+ @redises.lpushx(@key, 'ernie')
21
21
 
22
- @redises.lindex(@key, 0).should == "ernie"
23
- @redises.lindex(@key, 1).should == "bert"
22
+ @redises.lindex(@key, 0).should == 'ernie'
23
+ @redises.lindex(@key, 1).should == 'bert'
24
24
  end
25
25
 
26
- it "stores values as strings" do
26
+ it 'stores values as strings' do
27
27
  @redises.lpush(@key, 1)
28
28
  @redises.lpushx(@key, 2)
29
- @redises.lindex(@key, 0).should == "2"
29
+ @redises.lindex(@key, 0).should == '2'
30
30
  end
31
31
 
32
- it_should_behave_like "a list-only command"
32
+ it 'raises an error if an empty array is given' do
33
+ @redises.lpush(@key, 'X')
34
+ lambda do
35
+ @redises.lpushx(@key, [])
36
+ end.should raise_error(Redis::CommandError)
37
+ end
38
+
39
+ it 'stores multiple items if an array of more than one item is given' do
40
+ @redises.lpush(@key, 'X')
41
+ @redises.lpushx(@key, [1, 2]).should == 3
42
+ @redises.lrange(@key, 0, -1).should == %w[2 1 X]
43
+ end
44
+
45
+ it_should_behave_like 'a list-only command'
33
46
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#lrange(key, start, stop)" do
3
+ describe '#lrange(key, start, stop)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:68036'
6
6
 
@@ -11,25 +11,41 @@ describe "#lrange(key, start, stop)" do
11
11
  @redises.lpush(@key, 'v0')
12
12
  end
13
13
 
14
- it "returns a subset of the list inclusive of the right end" do
14
+ it 'returns a subset of the list inclusive of the right end' do
15
15
  @redises.lrange(@key, 0, 2).should == %w[v0 v1 v2]
16
16
  end
17
17
 
18
- it "returns an empty list when start > end" do
18
+ it 'returns a subset of the list when start and end are strings' do
19
+ @redises.lrange(@key, '0', '2').should == %w[v0 v1 v2]
20
+ end
21
+
22
+ it 'returns an empty list when start > end' do
19
23
  @redises.lrange(@key, 3, 2).should == []
20
24
  end
21
25
 
22
- it "works with negative indices" do
26
+ it 'works with a negative stop index' do
23
27
  @redises.lrange(@key, 2, -1).should == %w[v2 v3 v4]
24
28
  end
25
29
 
26
- it "returns [] when run against a nonexistent value" do
27
- @redises.lrange("mock-redis-test:bogus-key", 0, 1).should == []
30
+ it 'works with negative start and stop indices' do
31
+ @redises.lrange(@key, -2, -1).should == %w[v3 v4]
32
+ end
33
+
34
+ it 'works with negative start indices less than list length' do
35
+ @redises.lrange(@key, -10, -2).should == %w[v0 v1 v2 v3]
36
+ end
37
+
38
+ it 'returns [] when run against a nonexistent value' do
39
+ @redises.lrange('mock-redis-test:bogus-key', 0, 1).should == []
40
+ end
41
+
42
+ it 'returns [] when start is too large' do
43
+ @redises.lrange(@key, 100, 100).should == []
28
44
  end
29
45
 
30
- it "finds the end of the list correctly when end is too large" do
46
+ it 'finds the end of the list correctly when end is too large' do
31
47
  @redises.lrange(@key, 4, 10).should == %w[v4]
32
48
  end
33
49
 
34
- it_should_behave_like "a list-only command"
50
+ it_should_behave_like 'a list-only command'
35
51
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#lrem(key, count, value)" do
3
+ describe '#lrem(key, count, value)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:66767'
6
6
 
@@ -8,12 +8,12 @@ describe "#lrem(key, count, value)" do
8
8
  99 bottles of beer
9
9
  take one down
10
10
  pass it around
11
- 98 bottles of beer on the wall].reverse.each do |x|
11
+ 98 bottles of beer on the wall].reverse_each do |x|
12
12
  @redises.lpush(@key, x)
13
13
  end
14
14
  end
15
15
 
16
- it "deletes the first count instances of key when count > 0" do
16
+ it 'deletes the first count instances of key when count > 0' do
17
17
  @redises.lrem(@key, 2, 'bottles')
18
18
 
19
19
  @redises.lrange(@key, 0, 8).should == %w[
@@ -24,7 +24,7 @@ describe "#lrem(key, count, value)" do
24
24
  @redises.lrange(@key, -7, -1).should == %w[98 bottles of beer on the wall]
25
25
  end
26
26
 
27
- it "deletes the last count instances of key when count < 0" do
27
+ it 'deletes the last count instances of key when count < 0' do
28
28
  @redises.lrem(@key, -2, 'bottles')
29
29
 
30
30
  @redises.lrange(@key, 0, 9).should == %w[
@@ -35,39 +35,39 @@ describe "#lrem(key, count, value)" do
35
35
  @redises.lrange(@key, -6, -1).should == %w[98 of beer on the wall]
36
36
  end
37
37
 
38
- it "deletes all instances of key when count == 0" do
38
+ it 'deletes all instances of key when count == 0' do
39
39
  @redises.lrem(@key, 0, 'bottles')
40
40
  @redises.lrange(@key, 0, -1).grep(/bottles/).should be_empty
41
41
  end
42
42
 
43
- it "returns the number of elements deleted" do
43
+ it 'returns the number of elements deleted' do
44
44
  @redises.lrem(@key, 2, 'bottles').should == 2
45
45
  end
46
46
 
47
- it "returns the number of elements deleted even if you ask for more" do
47
+ it 'returns the number of elements deleted even if you ask for more' do
48
48
  @redises.lrem(@key, 10, 'bottles').should == 3
49
49
  end
50
50
 
51
- it "stringifies value" do
51
+ it 'stringifies value' do
52
52
  @redises.lrem(@key, 0, 99).should == 2
53
53
  end
54
54
 
55
- it "returns 0 when run against a nonexistent value" do
56
- @redises.lrem("mock-redis-test:bogus-key", 0, 1).should == 0
55
+ it 'returns 0 when run against a nonexistent value' do
56
+ @redises.lrem('mock-redis-test:bogus-key', 0, 1).should == 0
57
57
  end
58
58
 
59
- it "returns 0 when run against an empty list" do
59
+ it 'returns 0 when run against an empty list' do
60
60
  @redises.llen(@key).times { @redises.lpop(@key) } # empty the list
61
- @redises.lrem(@key, 0, "beer").should == 0
61
+ @redises.lrem(@key, 0, 'beer').should == 0
62
62
  end
63
63
 
64
- it "raises an error if the value does not look like an integer" do
64
+ it 'raises an error if the value does not look like an integer' do
65
65
  lambda do
66
66
  @redises.lrem(@key, 'foo', 'bottles')
67
- end.should raise_error(RuntimeError)
67
+ end.should raise_error(Redis::CommandError)
68
68
  end
69
69
 
70
- it "removes empty lists" do
70
+ it 'removes empty lists' do
71
71
  other_key = "mock-redis-test:lrem-#{__LINE__}"
72
72
 
73
73
  @redises.lpush(other_key, 'foo')
@@ -76,5 +76,5 @@ describe "#lrem(key, count, value)" do
76
76
  @redises.get(other_key).should be_nil
77
77
  end
78
78
 
79
- it_should_behave_like "a list-only command"
79
+ it_should_behave_like 'a list-only command'
80
80
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#lset(key, index, value)" do
3
+ describe '#lset(key, index, value)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:21522'
6
6
 
@@ -9,30 +9,35 @@ describe "#lset(key, index, value)" do
9
9
  end
10
10
 
11
11
  it "returns 'OK'" do
12
- @redises.lset(@key, 0, "newthing").should == 'OK'
12
+ @redises.lset(@key, 0, 'newthing').should == 'OK'
13
13
  end
14
14
 
15
15
  it "sets the list's value at index to value" do
16
- @redises.lset(@key, 0, "newthing")
17
- @redises.lindex(@key, 0).should == "newthing"
16
+ @redises.lset(@key, 0, 'newthing')
17
+ @redises.lindex(@key, 0).should == 'newthing'
18
18
  end
19
19
 
20
- it "stringifies value" do
21
- @redises.lset(@key, 0, 12345)
22
- @redises.lindex(@key, 0).should == "12345"
20
+ it "sets the list's value at index to value when the index is a string" do
21
+ @redises.lset(@key, '0', 'newthing')
22
+ @redises.lindex(@key, 0).should == 'newthing'
23
23
  end
24
24
 
25
- it "raises an exception for nonexistent keys" do
25
+ it 'stringifies value' do
26
+ @redises.lset(@key, 0, 12_345)
27
+ @redises.lindex(@key, 0).should == '12345'
28
+ end
29
+
30
+ it 'raises an exception for nonexistent keys' do
26
31
  lambda do
27
32
  @redises.lset('mock-redis-test:bogus-key', 100, 'value')
28
- end.should raise_error(RuntimeError)
33
+ end.should raise_error(Redis::CommandError)
29
34
  end
30
35
 
31
- it "raises an exception for out-of-range indices" do
36
+ it 'raises an exception for out-of-range indices' do
32
37
  lambda do
33
38
  @redises.lset(@key, 100, 'value')
34
- end.should raise_error(RuntimeError)
39
+ end.should raise_error(Redis::CommandError)
35
40
  end
36
41
 
37
- it_should_behave_like "a list-only command"
42
+ it_should_behave_like 'a list-only command'
38
43
  end
@@ -1,35 +1,45 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#ltrim(key, start, stop)" do
3
+ describe '#ltrim(key, start, stop)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:22310'
6
6
 
7
- %w[v0 v1 v2 v3 v4].reverse.each{|v| @redises.lpush(@key, v)}
7
+ %w[v0 v1 v2 v3 v4].reverse_each { |v| @redises.lpush(@key, v) }
8
8
  end
9
9
 
10
10
  it "returns 'OK'" do
11
11
  @redises.ltrim(@key, 1, 3).should == 'OK'
12
12
  end
13
13
 
14
- it "trims the list to include only the specified elements" do
14
+ it 'trims the list to include only the specified elements' do
15
15
  @redises.ltrim(@key, 1, 3)
16
16
  @redises.lrange(@key, 0, -1).should == %w[v1 v2 v3]
17
17
  end
18
18
 
19
- it "trims the list to include only the specified elements (negative indices)" do
19
+ it 'trims the list when start and stop are strings' do
20
+ @redises.ltrim(@key, '1', '3')
21
+ @redises.lrange(@key, 0, -1).should == %w[v1 v2 v3]
22
+ end
23
+
24
+ it 'trims the list to include only the specified elements (negative indices)' do
20
25
  @redises.ltrim(@key, -2, -1)
21
26
  @redises.lrange(@key, 0, -1).should == %w[v3 v4]
22
27
  end
23
28
 
24
- it "does not crash on overly-large indices" do
29
+ it 'trims the list to include only the specified elements (out of range negative indices)' do
30
+ @redises.ltrim(@key, -10, -2)
31
+ @redises.lrange(@key, 0, -1).should == %w[v0 v1 v2 v3]
32
+ end
33
+
34
+ it 'does not crash on overly-large indices' do
25
35
  @redises.ltrim(@key, 100, 200)
26
36
  @redises.lrange(@key, 0, -1).should == %w[]
27
37
  end
28
38
 
29
- it "removes empty lists" do
39
+ it 'removes empty lists' do
30
40
  @redises.ltrim(@key, 1, 0)
31
41
  @redises.get(@key).should be_nil
32
42
  end
33
43
 
34
- it_should_behave_like "a list-only command"
44
+ it_should_behave_like 'a list-only command'
35
45
  end
@@ -1,25 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#mapped_hmget(key, *fields)" do
3
+ describe '#mapped_hmget(key, *fields)' do
4
4
  before do
5
- @key = "mock-redis-test:mapped_hmget"
5
+ @key = 'mock-redis-test:mapped_hmget'
6
6
  @redises.hmset(@key, 'k1', 'v1', 'k2', 'v2')
7
7
  end
8
8
 
9
- it "returns values stored at key" do
10
- @redises.mapped_hmget(@key, 'k1', 'k2').should == {'k1' => 'v1', 'k2' => 'v2'}
9
+ it 'returns values stored at key' do
10
+ @redises.mapped_hmget(@key, 'k1', 'k2').should == { 'k1' => 'v1', 'k2' => 'v2' }
11
11
  end
12
12
 
13
- it "returns nils for missing fields" do
13
+ it 'returns nils for missing fields' do
14
14
  @redises.mapped_hmget(@key, 'k1', 'mock-redis-test:nonesuch').
15
- should == {'k1' => 'v1', 'mock-redis-test:nonesuch' => nil}
15
+ should == { 'k1' => 'v1', 'mock-redis-test:nonesuch' => nil }
16
16
  end
17
17
 
18
- it "raises an error if given no fields" do
18
+ it 'treats an array as the first key' do
19
+ @redises.mapped_hmget(@key, %w[k1 k2]).should == { %w[k1 k2] => 'v1' }
20
+ end
21
+
22
+ it 'raises an error if given no fields' do
19
23
  lambda do
20
24
  @redises.mapped_hmget(@key)
21
- end.should raise_error(RuntimeError)
25
+ end.should raise_error(Redis::CommandError)
22
26
  end
23
27
 
24
- it_should_behave_like "a hash-only command"
28
+ it_should_behave_like 'a hash-only command'
25
29
  end
@@ -1,45 +1,45 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#mapped_hmset(key, hash={})" do
3
+ describe '#mapped_hmset(key, hash={})' do
4
4
  before do
5
- @key = "mock-redis-test:mapped_hmset"
5
+ @key = 'mock-redis-test:mapped_hmset'
6
6
  end
7
7
 
8
8
  it "returns 'OK'" do
9
- @redises.mapped_hmset(@key, {'k1'=>'v1', 'k2'=>'v2'}).should == 'OK'
9
+ @redises.mapped_hmset(@key, 'k1' => 'v1', 'k2' => 'v2').should == 'OK'
10
10
  end
11
11
 
12
- it "sets the values" do
13
- @redises.mapped_hmset(@key, {'k1'=>'v1', 'k2'=>'v2'})
12
+ it 'sets the values' do
13
+ @redises.mapped_hmset(@key, 'k1' => 'v1', 'k2' => 'v2')
14
14
  @redises.hmget(@key, 'k1', 'k2').should == %w[v1 v2]
15
15
  end
16
16
 
17
- it "updates an existing hash" do
17
+ it 'updates an existing hash' do
18
18
  @redises.hmset(@key, 'foo', 'bar')
19
- @redises.mapped_hmset(@key, {'bert' => 'ernie', 'diet' => 'coke'})
19
+ @redises.mapped_hmset(@key, 'bert' => 'ernie', 'diet' => 'coke')
20
20
 
21
21
  @redises.hmget(@key, 'foo', 'bert', 'diet').
22
22
  should == %w[bar ernie coke]
23
23
  end
24
24
 
25
- it "stores the values as strings" do
26
- @redises.mapped_hmset(@key, {'one' => 1})
25
+ it 'stores the values as strings' do
26
+ @redises.mapped_hmset(@key, 'one' => 1)
27
27
  @redises.hget(@key, 'one').should == '1'
28
28
  end
29
29
 
30
- it "raises an error if given no hash" do
30
+ it 'raises an error if given no hash' do
31
31
  lambda do
32
32
  @redises.mapped_hmset(@key)
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
36
+ it 'raises an error if given a an odd length array' do
37
37
  lambda do
38
38
  @redises.mapped_hmset(@key, [1])
39
39
  end.should raise_error(Redis::CommandError)
40
40
  end
41
41
 
42
- it "raises an error if given a non-hash value" do
42
+ it 'raises an error if given a non-hash value' do
43
43
  lambda do
44
44
  @redises.mapped_hmset(@key, 1)
45
45
  end.should raise_error(NoMethodError)
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#mapped_mget(*keys)' do
4
+ before do
5
+ @key1 = 'mock-redis-test:a'
6
+ @key2 = 'mock-redis-test:b'
7
+ @key3 = 'mock-redis-test:c'
8
+
9
+ @redises.set(@key1, '1')
10
+ @redises.set(@key2, '2')
11
+ end
12
+
13
+ it 'returns a hash' do
14
+ @redises.mapped_mget(@key1, @key2, @key3).should eq(@key1 => '1',
15
+ @key2 => '2',
16
+ @key3 => nil)
17
+ end
18
+
19
+ it 'returns a hash even when no matches' do
20
+ @redises.mapped_mget('qwer').should eq('qwer' => nil)
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#mapped_mset(hash)' do
4
+ before do
5
+ @key1 = 'mock-redis-test:a'
6
+ @key2 = 'mock-redis-test:b'
7
+ @key3 = 'mock-redis-test:c'
8
+
9
+ @redises.set(@key1, '1')
10
+ @redises.set(@key2, '2')
11
+ end
12
+
13
+ it 'sets the values properly' do
14
+ @redises.mapped_mset(@key1 => 'one', @key3 => 'three').should eq('OK')
15
+ @redises.get(@key1).should eq('one')
16
+ @redises.get(@key2).should eq('2') # left alone
17
+ @redises.get(@key3).should eq('three')
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#mapped_msetnx(hash)' do
4
+ before do
5
+ @key1 = 'mock-redis-test:a'
6
+ @key2 = 'mock-redis-test:b'
7
+ @key3 = 'mock-redis-test:c'
8
+
9
+ @redises.set(@key1, '1')
10
+ @redises.set(@key2, '2')
11
+ end
12
+
13
+ it 'sets properly when none collide' do
14
+ @redises.mapped_msetnx(@key3 => 'three').should eq(true)
15
+ @redises.get(@key1).should eq('1') # existed; untouched
16
+ @redises.get(@key2).should eq('2') # existed; untouched
17
+ @redises.get(@key3).should eq('three')
18
+ end
19
+
20
+ it 'does not set any when any collide' do
21
+ @redises.mapped_msetnx(@key1 => 'one', @key3 => 'three').should eq(false)
22
+ @redises.get(@key1).should eq('1') # existed; untouched
23
+ @redises.get(@key2).should eq('2') # existed; untouched
24
+ @redises.get(@key3).should be_nil
25
+ end
26
+ end
@@ -1,34 +1,65 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#mget(key [, key, ...])" do
3
+ describe '#mget(key [, key, ...])' do
4
4
  before do
5
- @key1 = "mock-redis-test:mget1"
6
- @key2 = "mock-redis-test:mget2"
5
+ @key1 = 'mock-redis-test:mget1'
6
+ @key2 = 'mock-redis-test:mget2'
7
7
 
8
8
  @redises.set(@key1, 1)
9
9
  @redises.set(@key2, 2)
10
10
  end
11
11
 
12
- it "returns an array of values" do
13
- @redises.mget(@key1, @key2).should == %w[1 2]
14
- end
12
+ context 'emulate param array' do
13
+ it 'returns an array of values' do
14
+ @redises.mget([@key1, @key2]).should == %w[1 2]
15
+ end
16
+
17
+ it 'returns an array of values' do
18
+ @redises.mget([@key1, @key2]).should == %w[1 2]
19
+ end
20
+
21
+ it 'returns nil for non-string keys' do
22
+ list = 'mock-redis-test:mget-list'
23
+
24
+ @redises.lpush(list, 'bork bork bork')
15
25
 
16
- it "returns nil for missing keys" do
17
- @redises.mget(@key1, 'mock-redis-test:not-found', @key2).
18
- should == ["1", nil, "2"]
26
+ @redises.mget([@key1, @key2, list]).should == ['1', '2', nil]
27
+ end
19
28
  end
20
29
 
21
- it "returns nil for non-string keys" do
22
- list = "mock-redis-test:mget-list"
30
+ context 'emulate params strings' do
31
+ it 'returns an array of values' do
32
+ @redises.mget(@key1, @key2).should == %w[1 2]
33
+ end
34
+
35
+ it 'returns nil for missing keys' do
36
+ @redises.mget(@key1, 'mock-redis-test:not-found', @key2).should == ['1', nil, '2']
37
+ end
38
+
39
+ it 'returns nil for non-string keys' do
40
+ list = 'mock-redis-test:mget-list'
41
+
42
+ @redises.lpush(list, 'bork bork bork')
43
+
44
+ @redises.mget(@key1, @key2, list).should == ['1', '2', nil]
45
+ end
23
46
 
24
- @redises.lpush(list, 'bork bork bork')
47
+ it 'raises an error if you pass it 0 arguments' do
48
+ lambda do
49
+ @redises.mget
50
+ end.should raise_error(Redis::CommandError)
51
+ end
25
52
 
26
- @redises.mget(@key1, @key2, list).should == ["1", "2", nil]
53
+ it 'raises an error if you pass it empty array' do
54
+ lambda do
55
+ @redises.mget([])
56
+ end.should raise_error(Redis::CommandError)
57
+ end
27
58
  end
28
59
 
29
- it "raises an error if you pass it 0 arguments" do
30
- lambda do
31
- @redises.mget()
32
- end.should raise_error(RuntimeError)
60
+ context 'emulate block' do
61
+ it 'returns an array of values' do
62
+ @redises.mget(@key1, @key2) { |values| values.map(&:to_i) }.should == [1, 2]
63
+ end
33
64
  end
34
65
  end