From 8ee7af4f580bb62854a326009ed312759ae50b83 Mon Sep 17 00:00:00 2001 From: Jason Thomas Date: Wed, 24 Jun 2020 23:30:30 -0600 Subject: [PATCH] Fix XADD maxlen 0 (#192) * XADD maxlen 0 creates empty stream * Rubocop * Ignore emptry streams on cleanup --- lib/mock_redis/stream.rb | 6 +++++- lib/mock_redis/utility_methods.rb | 2 +- spec/commands/del_spec.rb | 15 +++++++++++++++ spec/commands/xadd_spec.rb | 7 +++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/mock_redis/stream.rb b/lib/mock_redis/stream.rb index 05b3f269..5cce8298 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 + @members = if count == 0 + Set.new + else + @members.to_a[-count..-1].to_set + end deleted else 0 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 14f2336e..5e204779 100644 --- a/spec/commands/xadd_spec.rb +++ b/spec/commands/xadd_spec.rb @@ -112,4 +112,11 @@ ] ) 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([]) + expect(@redises.exists?(@key)).to eq true + end end