mock_redis 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -1
  3. data/.travis.yml +9 -10
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile +2 -2
  6. data/README.md +2 -2
  7. data/lib/mock_redis/database.rb +6 -5
  8. data/lib/mock_redis/geospatial_methods.rb +10 -18
  9. data/lib/mock_redis/hash_methods.rb +4 -4
  10. data/lib/mock_redis/indifferent_hash.rb +0 -8
  11. data/lib/mock_redis/list_methods.rb +2 -2
  12. data/lib/mock_redis/pipelined_wrapper.rb +25 -6
  13. data/lib/mock_redis/set_methods.rb +15 -4
  14. data/lib/mock_redis/stream.rb +62 -0
  15. data/lib/mock_redis/stream/id.rb +53 -0
  16. data/lib/mock_redis/stream_methods.rb +87 -0
  17. data/lib/mock_redis/string_methods.rb +5 -8
  18. data/lib/mock_redis/transaction_wrapper.rb +25 -12
  19. data/lib/mock_redis/utility_methods.rb +1 -1
  20. data/lib/mock_redis/version.rb +1 -1
  21. data/lib/mock_redis/zset_methods.rb +2 -2
  22. data/mock_redis.gemspec +6 -5
  23. data/spec/commands/geodist_spec.rb +8 -4
  24. data/spec/commands/geohash_spec.rb +4 -4
  25. data/spec/commands/geopos_spec.rb +4 -4
  26. data/spec/commands/get_spec.rb +1 -0
  27. data/spec/commands/hdel_spec.rb +2 -2
  28. data/spec/commands/mget_spec.rb +34 -15
  29. data/spec/commands/mset_spec.rb +14 -0
  30. data/spec/commands/pipelined_spec.rb +52 -0
  31. data/spec/commands/spop_spec.rb +15 -0
  32. data/spec/commands/watch_spec.rb +8 -3
  33. data/spec/commands/xadd_spec.rb +102 -0
  34. data/spec/commands/xlen_spec.rb +20 -0
  35. data/spec/commands/xrange_spec.rb +141 -0
  36. data/spec/commands/xrevrange_spec.rb +130 -0
  37. data/spec/commands/xtrim_spec.rb +30 -0
  38. data/spec/spec_helper.rb +2 -0
  39. data/spec/support/redis_multiplexer.rb +17 -1
  40. data/spec/support/shared_examples/does_not_cleanup_empty_strings.rb +14 -0
  41. data/spec/support/shared_examples/only_operates_on_hashes.rb +2 -0
  42. data/spec/support/shared_examples/only_operates_on_lists.rb +2 -0
  43. data/spec/support/shared_examples/only_operates_on_sets.rb +2 -0
  44. data/spec/support/shared_examples/only_operates_on_zsets.rb +2 -0
  45. data/spec/transactions_spec.rb +17 -29
  46. metadata +38 -12
  47. data/spec/commands/hash_operator_spec.rb +0 -21
@@ -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
@@ -12,6 +12,7 @@ require 'rspec/its'
12
12
  require 'redis'
13
13
  $LOAD_PATH.unshift(File.expand_path(File.join(__FILE__, '..', '..', 'lib')))
14
14
  require 'mock_redis'
15
+ require 'timecop'
15
16
 
16
17
  $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
17
18
  Dir['spec/support/**/*.rb'].each { |x| require x }
@@ -59,5 +60,6 @@ RSpec.configure do |config|
59
60
  @redises.send_without_checking(:del, key)
60
61
  end
61
62
  end
63
+ @redises._gsub_clear
62
64
  end
63
65
  end
@@ -10,6 +10,16 @@ class RedisMultiplexer < BlankSlate
10
10
  def initialize(*a)
11
11
  @mock_redis = MockRedis.new(*a)
12
12
  @real_redis = Redis.new(*a)
13
+ _gsub_clear
14
+ end
15
+
16
+ def _gsub(from, to)
17
+ @gsub_from = from
18
+ @gsub_to = to
19
+ end
20
+
21
+ def _gsub_clear
22
+ @gsub_from = @gsub_to = ''
13
23
  end
14
24
 
15
25
  def method_missing(method, *args, &blk)
@@ -71,8 +81,10 @@ class RedisMultiplexer < BlankSlate
71
81
  def equalish?(a, b)
72
82
  if a == b
73
83
  true
84
+ elsif a.is_a?(String) && b.is_a?(String)
85
+ masked(a) == masked(b)
74
86
  elsif a.is_a?(Array) && b.is_a?(Array)
75
- a.collect(&:to_s).sort == b.collect(&:to_s).sort
87
+ a.collect { |c| masked(c.to_s) }.sort == b.collect { |c| masked(c.to_s) }.sort
76
88
  elsif a.is_a?(Exception) && b.is_a?(Exception)
77
89
  a.class == b.class && a.message == b.message
78
90
  elsif a.is_a?(Float) && b.is_a?(Float)
@@ -83,6 +95,10 @@ class RedisMultiplexer < BlankSlate
83
95
  end
84
96
  end
85
97
 
98
+ def masked(str)
99
+ str.gsub(@gsub_from, @gsub_to)
100
+ end
101
+
86
102
  def mock
87
103
  @mock_redis
88
104
  end
@@ -0,0 +1,14 @@
1
+ shared_examples_for 'does not remove empty strings on error' do
2
+ it 'does not remove empty strings on error' do |example|
3
+ key = 'mock-redis-test:not-a-string'
4
+
5
+ method = method_from_description(example)
6
+ args = args_for_method(method).unshift(key)
7
+
8
+ @redises.set(key, '')
9
+ lambda do
10
+ @redises.send(method, *args)
11
+ end.should raise_error(RuntimeError)
12
+ @redises.get(key).should == ''
13
+ end
14
+ end
@@ -10,4 +10,6 @@ shared_examples_for 'a hash-only command' do
10
10
  @redises.send(method, *args)
11
11
  end.should raise_error(RuntimeError)
12
12
  end
13
+
14
+ it_should_behave_like 'does not remove empty strings on error'
13
15
  end
@@ -10,4 +10,6 @@ shared_examples_for 'a list-only command' do
10
10
  @redises.send(method, *args)
11
11
  end.should raise_error(RuntimeError)
12
12
  end
13
+
14
+ it_should_behave_like 'does not remove empty strings on error'
13
15
  end
@@ -10,4 +10,6 @@ shared_examples_for 'a set-only command' do
10
10
  @redises.send(method, *args)
11
11
  end.should raise_error(RuntimeError)
12
12
  end
13
+
14
+ it_should_behave_like 'does not remove empty strings on error'
13
15
  end
@@ -10,6 +10,8 @@ shared_examples_for 'a zset-only command' do
10
10
  @redises.send(method, *args)
11
11
  end.should raise_error(RuntimeError)
12
12
  end
13
+
14
+ it_should_behave_like 'does not remove empty strings on error'
13
15
  end
14
16
 
15
17
  shared_examples_for 'arg 1 is a score' do
@@ -10,11 +10,11 @@ describe 'transactions (multi/exec/discard)' do
10
10
  @redises.multi.should == 'OK'
11
11
  end
12
12
 
13
- it 'forbids nesting' do
13
+ it 'does not permit nesting' do
14
14
  @redises.multi
15
15
  lambda do
16
16
  @redises.multi
17
- end.should raise_error(Redis::CommandError)
17
+ end.should raise_error(Redis::CommandError, 'ERR MULTI calls can not be nested')
18
18
  end
19
19
 
20
20
  it 'cleans state of transaction wrapper if exception occurs during transaction' do
@@ -41,18 +41,18 @@ describe 'transactions (multi/exec/discard)' do
41
41
  r.set('test', 1)
42
42
  r.incr('counter')
43
43
  end
44
- @redises.get('counter').should == '6'
45
- @redises.get('test').should == '1'
44
+ @redises.get('counter').should eq '6'
45
+ @redises.get('test').should eq '1'
46
46
  end
47
47
 
48
- it 'forbids nesting via blocks' do
48
+ it 'permits nesting via blocks' do
49
49
  # Have to use only the mock here. redis-rb has a bug in it where
50
50
  # nested #multi calls raise NoMethodError because it gets a nil
51
51
  # where it's not expecting one.
52
52
  @redises.mock.multi do |r|
53
53
  lambda do
54
54
  r.multi {}
55
- end.should raise_error(Redis::CommandError)
55
+ end.should_not raise_error
56
56
  end
57
57
  end
58
58
 
@@ -64,27 +64,15 @@ describe 'transactions (multi/exec/discard)' do
64
64
  pr.incr('counter')
65
65
  end
66
66
  end
67
- @redises.get('counter').should == '6'
68
- @redises.get('test').should == '1'
69
- end
70
-
71
- it 'allows multi blocks within pipelined blocks' do
72
- @redises.set('counter', 5)
73
- @redises.pipelined do |pr|
74
- pr.multi do |r|
75
- r.set('test', 1)
76
- r.incr('counter')
77
- end
78
- end
79
- @redises.get('counter').should == '6'
80
- @redises.get('test').should == '1'
67
+ @redises.get('counter').should eq '6'
68
+ @redises.get('test').should eq '1'
81
69
  end
82
70
  end
83
71
 
84
72
  context '#discard' do
85
73
  it "responds with 'OK' after #multi" do
86
74
  @redises.multi
87
- @redises.discard.should == 'OK'
75
+ @redises.discard.should eq 'OK'
88
76
  end
89
77
 
90
78
  it "can't be run outside of #multi/#exec" do
@@ -110,8 +98,8 @@ describe 'transactions (multi/exec/discard)' do
110
98
  end
111
99
 
112
100
  it "makes commands respond with 'QUEUED'" do
113
- @redises.set(@string, 'string').should == 'QUEUED'
114
- @redises.lpush(@list, 'list').should == 'QUEUED'
101
+ @redises.set(@string, 'string').should eq 'QUEUED'
102
+ @redises.lpush(@list, 'list').should eq 'QUEUED'
115
103
  end
116
104
 
117
105
  it "gives you the commands' responses when you call #exec" do
@@ -119,7 +107,7 @@ describe 'transactions (multi/exec/discard)' do
119
107
  @redises.lpush(@list, 'list')
120
108
  @redises.lpush(@list, 'list')
121
109
 
122
- @redises.exec.should == ['OK', 1, 2]
110
+ @redises.exec.should eq ['OK', 1, 2]
123
111
  end
124
112
 
125
113
  it "does not raise exceptions, but rather puts them in #exec's response" do
@@ -128,9 +116,9 @@ describe 'transactions (multi/exec/discard)' do
128
116
  @redises.lpush(@list, 'list')
129
117
 
130
118
  responses = @redises.exec
131
- responses[0].should == 'OK'
119
+ responses[0].should eq 'OK'
132
120
  responses[1].should be_a(Redis::CommandError)
133
- responses[2].should == 1
121
+ responses[2].should eq 1
134
122
  end
135
123
  end
136
124
 
@@ -151,9 +139,9 @@ describe 'transactions (multi/exec/discard)' do
151
139
  second_lpush_response = mult.lpush(@list, 'list')
152
140
  end
153
141
 
154
- set_response.value.should == 'OK'
155
- lpush_response.value.should == 1
156
- second_lpush_response.value.should == 2
142
+ set_response.value.should eq 'OK'
143
+ lpush_response.value.should eq 1
144
+ second_lpush_response.value.should eq 2
157
145
  end
158
146
  end
159
147
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mock_redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
- - Brigade Engineering
7
+ - Shane da Silva
8
8
  - Samuel Merritt
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-03 00:00:00.000000000 Z
12
+ date: 2019-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -37,14 +37,14 @@ dependencies:
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.3.0
40
+ version: 4.1.0
41
41
  type: :development
42
42
  prerelease: false
43
43
  version_requirements: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 3.3.0
47
+ version: 4.1.0
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -73,10 +73,24 @@ dependencies:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '1.0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: timecop
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.1
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.1
76
90
  description: Instantiate one with `redis = MockRedis.new` and treat it like you would
77
91
  a normal Redis object. It supports all the usual Redis operations.
78
92
  email:
79
- - eng@brigade.com
93
+ - shane@dasilva.io
80
94
  executables: []
81
95
  extensions: []
82
96
  extra_rdoc_files: []
@@ -109,6 +123,9 @@ files:
109
123
  - lib/mock_redis/pipelined_wrapper.rb
110
124
  - lib/mock_redis/set_methods.rb
111
125
  - lib/mock_redis/sort_method.rb
126
+ - lib/mock_redis/stream.rb
127
+ - lib/mock_redis/stream/id.rb
128
+ - lib/mock_redis/stream_methods.rb
112
129
  - lib/mock_redis/string_methods.rb
113
130
  - lib/mock_redis/transaction_wrapper.rb
114
131
  - lib/mock_redis/undef_redis_methods.rb
@@ -151,7 +168,6 @@ files:
151
168
  - spec/commands/getbit_spec.rb
152
169
  - spec/commands/getrange_spec.rb
153
170
  - spec/commands/getset_spec.rb
154
- - spec/commands/hash_operator_spec.rb
155
171
  - spec/commands/hdel_spec.rb
156
172
  - spec/commands/hexists_spec.rb
157
173
  - spec/commands/hget_spec.rb
@@ -240,6 +256,11 @@ files:
240
256
  - spec/commands/type_spec.rb
241
257
  - spec/commands/unwatch_spec.rb
242
258
  - spec/commands/watch_spec.rb
259
+ - spec/commands/xadd_spec.rb
260
+ - spec/commands/xlen_spec.rb
261
+ - spec/commands/xrange_spec.rb
262
+ - spec/commands/xrevrange_spec.rb
263
+ - spec/commands/xtrim_spec.rb
243
264
  - spec/commands/zadd_spec.rb
244
265
  - spec/commands/zcard_spec.rb
245
266
  - spec/commands/zcount_spec.rb
@@ -261,6 +282,7 @@ files:
261
282
  - spec/mock_redis_spec.rb
262
283
  - spec/spec_helper.rb
263
284
  - spec/support/redis_multiplexer.rb
285
+ - spec/support/shared_examples/does_not_cleanup_empty_strings.rb
264
286
  - spec/support/shared_examples/only_operates_on_hashes.rb
265
287
  - spec/support/shared_examples/only_operates_on_lists.rb
266
288
  - spec/support/shared_examples/only_operates_on_sets.rb
@@ -268,7 +290,7 @@ files:
268
290
  - spec/support/shared_examples/only_operates_on_zsets.rb
269
291
  - spec/support/shared_examples/sorts_enumerables.rb
270
292
  - spec/transactions_spec.rb
271
- homepage: https://github.com/brigade/mock_redis
293
+ homepage: https://github.com/sds/mock_redis
272
294
  licenses:
273
295
  - MIT
274
296
  metadata: {}
@@ -280,15 +302,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
280
302
  requirements:
281
303
  - - ">="
282
304
  - !ruby/object:Gem::Version
283
- version: '2.2'
305
+ version: '2.4'
284
306
  required_rubygems_version: !ruby/object:Gem::Requirement
285
307
  requirements:
286
308
  - - ">="
287
309
  - !ruby/object:Gem::Version
288
310
  version: '0'
289
311
  requirements: []
290
- rubyforge_project:
291
- rubygems_version: 2.7.3
312
+ rubygems_version: 3.0.3
292
313
  signing_key:
293
314
  specification_version: 4
294
315
  summary: Redis mock that just lives in memory; useful for testing.
@@ -327,7 +348,6 @@ test_files:
327
348
  - spec/commands/getbit_spec.rb
328
349
  - spec/commands/getrange_spec.rb
329
350
  - spec/commands/getset_spec.rb
330
- - spec/commands/hash_operator_spec.rb
331
351
  - spec/commands/hdel_spec.rb
332
352
  - spec/commands/hexists_spec.rb
333
353
  - spec/commands/hget_spec.rb
@@ -416,6 +436,11 @@ test_files:
416
436
  - spec/commands/type_spec.rb
417
437
  - spec/commands/unwatch_spec.rb
418
438
  - spec/commands/watch_spec.rb
439
+ - spec/commands/xadd_spec.rb
440
+ - spec/commands/xlen_spec.rb
441
+ - spec/commands/xrange_spec.rb
442
+ - spec/commands/xrevrange_spec.rb
443
+ - spec/commands/xtrim_spec.rb
419
444
  - spec/commands/zadd_spec.rb
420
445
  - spec/commands/zcard_spec.rb
421
446
  - spec/commands/zcount_spec.rb
@@ -437,6 +462,7 @@ test_files:
437
462
  - spec/mock_redis_spec.rb
438
463
  - spec/spec_helper.rb
439
464
  - spec/support/redis_multiplexer.rb
465
+ - spec/support/shared_examples/does_not_cleanup_empty_strings.rb
440
466
  - spec/support/shared_examples/only_operates_on_hashes.rb
441
467
  - spec/support/shared_examples/only_operates_on_lists.rb
442
468
  - spec/support/shared_examples/only_operates_on_sets.rb
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe '#[](key)' do
4
- before do
5
- @key = 'mock-redis-test:hash_operator'
6
- end
7
-
8
- it 'returns nil for a nonexistent value' do
9
- @redises['mock-redis-test:does-not-exist'].should be_nil
10
- end
11
-
12
- it 'returns a stored string value' do
13
- @redises[@key] = 'forsooth'
14
- @redises[@key].should == 'forsooth'
15
- end
16
-
17
- it 'treats integers as strings' do
18
- @redises[@key] = 100
19
- @redises[@key].should == '100'
20
- end
21
- end