From 959602c6ccae03d4f0f15cef5ab1ded6c6d2300f Mon Sep 17 00:00:00 2001 From: "Thomas, Jason" Date: Wed, 24 Jun 2020 09:32:27 -0600 Subject: [PATCH 1/3] XADD maxlen 0 creates empty stream --- lib/mock_redis/stream.rb | 6 +++++- spec/commands/xadd_spec.rb | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/mock_redis/stream.rb b/lib/mock_redis/stream.rb index 05b3f269..2848813c 100644 --- a/lib/mock_redis/stream.rb +++ b/lib/mock_redis/stream.rb @@ -37,7 +37,11 @@ def add(id, values) def trim(count) deleted = @members.size - count if deleted > 0 - @members = @members.to_a[-count..-1].to_set + if count == 0 + @members = Set.new + else + @members = @members.to_a[-count..-1].to_set + end deleted else 0 diff --git a/spec/commands/xadd_spec.rb b/spec/commands/xadd_spec.rb index 14f2336e..7d993c51 100644 --- a/spec/commands/xadd_spec.rb +++ b/spec/commands/xadd_spec.rb @@ -112,4 +112,10 @@ ] ) end + + it 'creates an empty stream with maxlen of 0' do + @redises.xadd(@key, { key: 'value' }, maxlen: 0) + expect(@redises.xlen(@key)).to eq 0 + expect(@redises.xrange(@key, '-', '+')).to eq([]) + end end From 0997dad3725713a50dd07efb19b90d383d0cacf0 Mon Sep 17 00:00:00 2001 From: "Thomas, Jason" Date: Wed, 24 Jun 2020 09:36:26 -0600 Subject: [PATCH 2/3] Rubocop --- lib/mock_redis/stream.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/mock_redis/stream.rb b/lib/mock_redis/stream.rb index 2848813c..5cce8298 100644 --- a/lib/mock_redis/stream.rb +++ b/lib/mock_redis/stream.rb @@ -37,11 +37,11 @@ def add(id, values) def trim(count) deleted = @members.size - count if deleted > 0 - if count == 0 - @members = Set.new - else - @members = @members.to_a[-count..-1].to_set - end + @members = if count == 0 + Set.new + else + @members.to_a[-count..-1].to_set + end deleted else 0 From df27aac15137028e481ac78b87053715215d0b26 Mon Sep 17 00:00:00 2001 From: "Thomas, Jason" Date: Wed, 24 Jun 2020 15:13:55 -0600 Subject: [PATCH 3/3] Ignore emptry streams on cleanup --- lib/mock_redis/utility_methods.rb | 2 +- spec/commands/del_spec.rb | 15 +++++++++++++++ spec/commands/xadd_spec.rb | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/mock_redis/utility_methods.rb b/lib/mock_redis/utility_methods.rb index 4e7238b4..47f18493 100644 --- a/lib/mock_redis/utility_methods.rb +++ b/lib/mock_redis/utility_methods.rb @@ -18,7 +18,7 @@ def primitive?(value) end def clean_up_empties_at(key) - if data[key]&.empty? && data[key] != '' + if data[key]&.empty? && data[key] != '' && !data[key].is_a?(Stream) del(key) end end diff --git a/spec/commands/del_spec.rb b/spec/commands/del_spec.rb index 27b15daa..36816314 100644 --- a/spec/commands/del_spec.rb +++ b/spec/commands/del_spec.rb @@ -1,6 +1,14 @@ require 'spec_helper' describe '#del(key [, key, ...])' do + before :all do + sleep 1 - (Time.now.to_f % 1) + end + + before :each do + @redises._gsub(/\d{3}-\d/, '...-.') + end + it 'returns the number of keys deleted' do @redises.set('mock-redis-test:1', 1) @redises.set('mock-redis-test:2', 1) @@ -32,4 +40,11 @@ it 'raises an error if an empty array is given' do expect { @redises.del [] }.to raise_error Redis::CommandError end + + it 'removes a stream key' do + @redises.xadd('mock-redis-stream', { key: 'value' }, maxlen: 0) + expect(@redises.exists?('mock-redis-stream')).to eq true + @redises.del('mock-redis-stream') + expect(@redises.exists?('mock-redis-stream')).to eq false + end end diff --git a/spec/commands/xadd_spec.rb b/spec/commands/xadd_spec.rb index 7d993c51..5e204779 100644 --- a/spec/commands/xadd_spec.rb +++ b/spec/commands/xadd_spec.rb @@ -117,5 +117,6 @@ @redises.xadd(@key, { key: 'value' }, maxlen: 0) expect(@redises.xlen(@key)).to eq 0 expect(@redises.xrange(@key, '-', '+')).to eq([]) + expect(@redises.exists?(@key)).to eq true end end