mock_redis 0.5.4 → 0.31.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,164 @@
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 all entries with a lower limit of 0-0' do
58
+ expect(@redises.xrange(@key, '0-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
+ ['1234567891299-0', { 'key6' => 'value6' }]
66
+ ]
67
+ )
68
+ end
69
+
70
+ it 'returns entries with an upper limit' do
71
+ expect(@redises.xrange(@key, '-', '1234567891285-0')).to eq(
72
+ [
73
+ ['1234567891234-0', { 'key1' => 'value1' }],
74
+ ['1234567891245-0', { 'key2' => 'value2' }],
75
+ ['1234567891245-1', { 'key3' => 'value3' }],
76
+ ['1234567891278-0', { 'key4' => 'value4' }],
77
+ ['1234567891278-1', { 'key5' => 'value5' }]
78
+ ]
79
+ )
80
+ end
81
+
82
+ it 'returns entries with both a lower and an upper limit inclusive' do
83
+ expect(@redises.xrange(@key, '1234567891245-0', '1234567891278-0')).to eq(
84
+ [
85
+ ['1234567891245-0', { 'key2' => 'value2' }],
86
+ ['1234567891245-1', { 'key3' => 'value3' }],
87
+ ['1234567891278-0', { 'key4' => 'value4' }]
88
+ ]
89
+ )
90
+ end
91
+
92
+ it 'returns entries with both a lower and an upper limit exclusive' do
93
+ expect(@redises.xrange(@key, '(1234567891245-0', '1234567891285-1')).to eq(
94
+ [
95
+ # We no longer get '1234567891245-0'
96
+ ['1234567891245-1', { 'key3' => 'value3' }],
97
+ ['1234567891278-0', { 'key4' => 'value4' }],
98
+ ['1234567891278-1', { 'key5' => 'value5' }] # Note sequence -1
99
+ ]
100
+ )
101
+ end
102
+
103
+ it 'finds the list with sequence numbers' do
104
+ expect(@redises.xrange(@key, '1234567891245-1', '1234567891278-0')).to eq(
105
+ [
106
+ ['1234567891245-1', { 'key3' => 'value3' }],
107
+ ['1234567891278-0', { 'key4' => 'value4' }]
108
+ ]
109
+ )
110
+ end
111
+
112
+ it 'finds the list with lower bound without sequence numbers' do
113
+ expect(@redises.xrange(@key, '1234567891245', '+')).to eq(
114
+ [
115
+ ['1234567891245-0', { 'key2' => 'value2' }],
116
+ ['1234567891245-1', { 'key3' => 'value3' }],
117
+ ['1234567891278-0', { 'key4' => 'value4' }],
118
+ ['1234567891278-1', { 'key5' => 'value5' }],
119
+ ['1234567891299-0', { 'key6' => 'value6' }]
120
+ ]
121
+ )
122
+ end
123
+
124
+ it 'finds the list with upper bound without sequence numbers' do
125
+ expect(@redises.xrange(@key, '-', '1234567891278')).to eq(
126
+ [
127
+ ['1234567891234-0', { 'key1' => 'value1' }],
128
+ ['1234567891245-0', { 'key2' => 'value2' }],
129
+ ['1234567891245-1', { 'key3' => 'value3' }],
130
+ ['1234567891278-0', { 'key4' => 'value4' }],
131
+ ['1234567891278-1', { 'key5' => 'value5' }]
132
+ ]
133
+ )
134
+ end
135
+
136
+ it 'accepts limits as integers' do
137
+ expect(@redises.xrange(@key, 1_234_567_891_245, 1_234_567_891_278)).to eq(
138
+ [
139
+ ['1234567891245-0', { 'key2' => 'value2' }],
140
+ ['1234567891245-1', { 'key3' => 'value3' }],
141
+ ['1234567891278-0', { 'key4' => 'value4' }],
142
+ ['1234567891278-1', { 'key5' => 'value5' }]
143
+ ]
144
+ )
145
+ end
146
+
147
+ it 'returns a limited number of items' do
148
+ expect(@redises.xrange(@key, '-', '+', count: 2)).to eq(
149
+ [
150
+ ['1234567891234-0', { 'key1' => 'value1' }],
151
+ ['1234567891245-0', { 'key2' => 'value2' }]
152
+ ]
153
+ )
154
+ end
155
+ end
156
+
157
+ it 'raises an invalid stream id error' do
158
+ expect { @redises.xrange(@key, 'X', '+') }
159
+ .to raise_error(
160
+ Redis::CommandError,
161
+ 'ERR Invalid stream ID specified as stream command argument'
162
+ )
163
+ end
164
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#xread(keys, ids)' do
4
+ before :all do
5
+ sleep 1 - (Time.now.to_f % 1)
6
+ @key = 'mock-redis-test:xread'
7
+ @key1 = 'mock-redis-test:xread1'
8
+ end
9
+
10
+ it 'reads a single entry' do
11
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-0')
12
+ expect(@redises.xread(@key, '0-0'))
13
+ .to eq({ @key => [['1234567891234-0', { 'key' => 'value' }]] })
14
+ end
15
+
16
+ it 'reads multiple entries from the beginning of the stream' do
17
+ @redises.xadd(@key, { key0: 'value0' }, id: '1234567891234-0')
18
+ @redises.xadd(@key, { key1: 'value1' }, id: '1234567891234-1')
19
+ expect(@redises.xread(@key, '0-0'))
20
+ .to eq({ @key => [['1234567891234-0', { 'key0' => 'value0' }],
21
+ ['1234567891234-1', { 'key1' => 'value1' }]] })
22
+ end
23
+
24
+ it 'reads entries greater than the ID passed' do
25
+ @redises.xadd(@key, { key0: 'value0' }, id: '1234567891234-0')
26
+ @redises.xadd(@key, { key1: 'value1' }, id: '1234567891234-1')
27
+ expect(@redises.xread(@key, '1234567891234-0'))
28
+ .to eq({ @key => [['1234567891234-1', { 'key1' => 'value1' }]] })
29
+ end
30
+
31
+ it 'reads from multiple streams' do
32
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-0')
33
+ @redises.xadd(@key1, { key1: 'value1' }, id: '1234567891234-0')
34
+ expect(@redises.xread([@key, @key1], %w[0-0 0-0]))
35
+ .to eq({ @key => [['1234567891234-0', { 'key' => 'value' }]],
36
+ @key1 => [['1234567891234-0', { 'key1' => 'value1' }]] })
37
+ end
38
+
39
+ it 'reads from multiple streams at the given IDs' do
40
+ @redises.xadd(@key, { key: 'value0' }, id: '1234567891234-0')
41
+ @redises.xadd(@key, { key: 'value1' }, id: '1234567891234-1')
42
+ @redises.xadd(@key, { key: 'value2' }, id: '1234567891234-2')
43
+ @redises.xadd(@key1, { key1: 'value0' }, id: '1234567891234-0')
44
+ @redises.xadd(@key1, { key1: 'value1' }, id: '1234567891234-1')
45
+ @redises.xadd(@key1, { key1: 'value2' }, id: '1234567891234-2')
46
+ # The first stream won't return anything since we specify the last ID
47
+ expect(@redises.xread([@key, @key1], %w[1234567891234-2 1234567891234-1]))
48
+ .to eq({ @key1 => [['1234567891234-2', { 'key1' => 'value2' }]] })
49
+ end
50
+
51
+ it 'supports the block parameter' do
52
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-0')
53
+ expect(@redises.xread(@key, '0-0', block: 1000))
54
+ .to eq({ @key => [['1234567891234-0', { 'key' => 'value' }]] })
55
+ end
56
+
57
+ it 'limits results with count' do
58
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-0')
59
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-1')
60
+ @redises.xadd(@key, { key: 'value' }, id: '1234567891234-2')
61
+ expect(@redises.xread(@key, '0-0', count: 1))
62
+ .to eq({ @key => [['1234567891234-0', { 'key' => 'value' }]] })
63
+ expect(@redises.xread(@key, '1234567891234-0', count: 1))
64
+ .to eq({ @key => [['1234567891234-1', { 'key' => 'value' }]] })
65
+ end
66
+ 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,36 @@
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 'returns 0 if count is greater than size' do
20
+ initial = @redises.xrange(@key, '-', '+')
21
+ expect(@redises.xtrim(@key, 1000)).to eq 0
22
+ expect(@redises.xrange(@key, '-', '+')).to eql(initial)
23
+ end
24
+
25
+ it 'deletes the oldes elements' do
26
+ @redises.xtrim(@key, 4)
27
+ expect(@redises.xrange(@key, '-', '+')).to eq(
28
+ [
29
+ ['1234567891245-1', { 'key3' => 'value3' }],
30
+ ['1234567891278-0', { 'key4' => 'value4' }],
31
+ ['1234567891278-1', { 'key5' => 'value5' }],
32
+ ['1234567891299-0', { 'key6' => 'value6' }]
33
+ ]
34
+ )
35
+ end
36
+ end
@@ -1,40 +1,129 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#zadd(key, score, member)" do
3
+ describe '#zadd(key, score, member)' do
4
4
  before { @key = 'mock-redis-test:zadd' }
5
5
 
6
6
  it "returns true if member wasn't present in the set" do
7
- @redises.zadd(@key, 1, 'foo').should be_true
7
+ @redises.zadd(@key, 1, 'foo').should == true
8
8
  end
9
9
 
10
- it "returns false if member was present in the set" do
10
+ it 'returns false if member was present in the set' do
11
11
  @redises.zadd(@key, 1, 'foo')
12
- @redises.zadd(@key, 1, 'foo').should be_false
12
+ @redises.zadd(@key, 1, 'foo').should == false
13
13
  end
14
14
 
15
- it "adds member to the set" do
15
+ it 'adds member to the set' do
16
16
  @redises.zadd(@key, 1, 'foo')
17
17
  @redises.zrange(@key, 0, -1).should == ['foo']
18
18
  end
19
19
 
20
- it "treats integer members as strings" do
20
+ it 'treats integer members as strings' do
21
21
  member = 11
22
22
  @redises.zadd(@key, 1, member)
23
23
  @redises.zrange(@key, 0, -1).should == [member.to_s]
24
24
  end
25
25
 
26
- it "updates the score" do
26
+ it 'allows scores to be set to Float::INFINITY' do
27
+ member = '1'
28
+ @redises.zadd(@key, Float::INFINITY, member)
29
+ @redises.zrange(@key, 0, -1).should == [member]
30
+ end
31
+
32
+ it 'updates the score' do
27
33
  @redises.zadd(@key, 1, 'foo')
28
34
  @redises.zadd(@key, 2, 'foo')
29
35
 
30
36
  @redises.zscore(@key, 'foo').should == 2.0
31
37
  end
32
38
 
33
- it "supports a variable number of arguments" do
39
+ it 'with XX option command do nothing if element not exist' do
40
+ @redises.zadd(@key, 1, 'foo')
41
+ @redises.zadd(@key, 2, 'bar', xx: true)
42
+ @redises.zrange(@key, 0, -1).should_not include 'bar'
43
+ end
44
+
45
+ it 'with XX option command update index on exist element' do
46
+ @redises.zadd(@key, 1, 'foo')
47
+ @redises.zadd(@key, 2, 'foo', xx: true)
48
+ @redises.zscore(@key, 'foo').should == 2.0
49
+ end
50
+
51
+ it 'with XX option and multiple elements command update index on exist element' do
52
+ @redises.zadd(@key, 1, 'foo')
53
+ added_count = @redises.zadd(@key, [[2, 'foo'], [2, 'bar']], xx: true)
54
+ added_count.should == 0
55
+
56
+ @redises.zscore(@key, 'foo').should == 2.0
57
+ @redises.zrange(@key, 0, -1).should_not include 'bar'
58
+ end
59
+
60
+ it "with NX option don't update current element" do
61
+ @redises.zadd(@key, 1, 'foo')
62
+ @redises.zadd(@key, 2, 'foo', nx: true)
63
+ @redises.zscore(@key, 'foo').should == 1.0
64
+ end
65
+
66
+ it 'with NX option create new element' do
67
+ @redises.zadd(@key, 1, 'foo')
68
+ @redises.zadd(@key, 2, 'bar', nx: true)
69
+ @redises.zrange(@key, 0, -1).should include 'bar'
70
+ end
71
+
72
+ it 'with NX option and multiple elements command only create element' do
73
+ @redises.zadd(@key, 1, 'foo')
74
+ added_count = @redises.zadd(@key, [[2, 'foo'], [2, 'bar']], nx: true)
75
+ added_count.should == 1
76
+ @redises.zscore(@key, 'bar').should == 2.0
77
+ @redises.zrange(@key, 0, -1).should eq %w[foo bar]
78
+ end
79
+
80
+ it 'XX and NX options in same time raise error' do
81
+ lambda do
82
+ @redises.zadd(@key, 1, 'foo', nx: true, xx: true)
83
+ end.should raise_error(Redis::CommandError)
84
+ end
85
+
86
+ it 'with INCR is act like zincrby' do
87
+ @redises.zadd(@key, 10, 'bert', incr: true).should == 10.0
88
+ @redises.zadd(@key, 3, 'bert', incr: true).should == 13.0
89
+ end
90
+
91
+ it 'with INCR and XX not create element' do
92
+ @redises.zadd(@key, 10, 'bert', xx: true, incr: true).should be_nil
93
+ end
94
+
95
+ it 'with INCR and XX increase score for exist element' do
96
+ @redises.zadd(@key, 2, 'bert')
97
+ @redises.zadd(@key, 10, 'bert', xx: true, incr: true).should == 12.0
98
+ end
99
+
100
+ it 'with INCR and NX create element with score' do
101
+ @redises.zadd(@key, 11, 'bert', nx: true, incr: true).should == 11.0
102
+ end
103
+
104
+ it 'with INCR and NX not update element' do
105
+ @redises.zadd(@key, 1, 'bert')
106
+ @redises.zadd(@key, 10, 'bert', nx: true, incr: true).should be_nil
107
+ end
108
+
109
+ it 'with INCR with variable number of arguments raise error' do
110
+ lambda do
111
+ @redises.zadd(@key, [[1, 'one'], [2, 'two']], incr: true)
112
+ end.should raise_error(Redis::CommandError)
113
+ end
114
+
115
+ it 'supports a variable number of arguments' do
34
116
  @redises.zadd(@key, [[1, 'one'], [2, 'two']])
35
- @redises.zrange(@key, 0, -1).should == ['one', 'two']
117
+ @redises.zadd(@key, [[3, 'three']])
118
+ @redises.zrange(@key, 0, -1).should == %w[one two three]
119
+ end
120
+
121
+ it 'raises an error if an empty array is given' do
122
+ lambda do
123
+ @redises.zadd(@key, [])
124
+ end.should raise_error(Redis::CommandError)
36
125
  end
37
126
 
38
- it_should_behave_like "arg 1 is a score"
39
- it_should_behave_like "a zset-only command"
127
+ it_should_behave_like 'arg 1 is a score'
128
+ it_should_behave_like 'a zset-only command'
40
129
  end
@@ -1,19 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#zcard(key)" do
3
+ describe '#zcard(key)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:zcard'
6
6
  end
7
7
 
8
- it "returns the number of elements in the zset" do
8
+ it 'returns the number of elements in the zset' do
9
9
  @redises.zadd(@key, 1, 'Washington')
10
10
  @redises.zadd(@key, 2, 'Adams')
11
11
  @redises.zcard(@key).should == 2
12
12
  end
13
13
 
14
- it "returns 0 for nonexistent sets" do
14
+ it 'returns 0 for nonexistent sets' do
15
15
  @redises.zcard(@key).should == 0
16
16
  end
17
17
 
18
- it_should_behave_like "a zset-only command"
18
+ it_should_behave_like 'a zset-only command'
19
19
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#zcount(key, min, max)" do
3
+ describe '#zcount(key, min, max)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:zcount'
6
6
  @redises.zadd(@key, 1, 'Washington')
@@ -9,23 +9,31 @@ describe "#zcount(key, min, max)" do
9
9
  @redises.zadd(@key, 4, 'Madison')
10
10
  end
11
11
 
12
- it "returns the number of members in the zset with scores in (min..max)" do
12
+ it 'returns the number of members in the zset with scores in (min..max)' do
13
13
  @redises.zcount(@key, 3, 10).should == 2
14
14
  end
15
15
 
16
- it "returns 0 if there are no such members" do
16
+ it 'returns 0 if there are no such members' 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
20
+ it 'returns count of all elements when -inf to +inf' do
21
+ @redises.zcount(@key, '-inf', '+inf').should == 4
22
22
  end
23
23
 
24
- it "returns a proper count of elements using +inf upper bound" do
25
- @redises.zcount(@key, 3, "+inf").should == 2
24
+ it 'returns a proper count of elements using +inf upper bound' do
25
+ @redises.zcount(@key, 3, '+inf').should == 2
26
26
  end
27
27
 
28
- it_should_behave_like "arg 1 is a score"
29
- it_should_behave_like "arg 2 is a score"
30
- it_should_behave_like "a zset-only command"
28
+ it 'returns a proper count of elements using exclusive lower bound' do
29
+ @redises.zcount(@key, '(3', '+inf').should == 1
30
+ end
31
+
32
+ it 'returns a proper count of elements using exclusive upper bound' do
33
+ @redises.zcount(@key, '-inf', '(3').should == 2
34
+ end
35
+
36
+ it_should_behave_like 'arg 1 is a score'
37
+ it_should_behave_like 'arg 2 is a score'
38
+ it_should_behave_like 'a zset-only command'
31
39
  end
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "#zincrby(key, increment, member)" do
3
+ describe '#zincrby(key, increment, member)' do
4
4
  before do
5
5
  @key = 'mock-redis-test:zincrby'
6
6
  @redises.zadd(@key, 1, 'bert')
7
7
  end
8
8
 
9
- it "returns the new score as a string" do
9
+ it 'returns the new score as a string' do
10
10
  @redises.zincrby(@key, 10, 'bert').should == 11.0
11
11
  end
12
12
 
@@ -15,17 +15,17 @@ describe "#zincrby(key, increment, member)" do
15
15
  @redises.zscore(@key, 'bert').should == 11.0
16
16
  end
17
17
 
18
- it "handles integer members correctly" do
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
22
  @redises.zscore(@key, member).should == 2.0
23
23
  end
24
24
 
25
- it "adds missing members with score increment" do
25
+ it 'adds missing members with score increment' do
26
26
  @redises.zincrby(@key, 5.5, 'bigbird').should == 5.5
27
27
  end
28
28
 
29
- it_should_behave_like "arg 1 is a score"
30
- it_should_behave_like "a zset-only command"
29
+ it_should_behave_like 'arg 1 is a score'
30
+ it_should_behave_like 'a zset-only command'
31
31
  end