diff --git a/lib/mock_redis/string_methods.rb b/lib/mock_redis/string_methods.rb index 4e69a3ce..56ba032f 100644 --- a/lib/mock_redis/string_methods.rb +++ b/lib/mock_redis/string_methods.rb @@ -313,9 +313,13 @@ def bitcount(key, start = 0, stop = -1) end def setex(key, seconds, value) - set(key, value) - expire(key, seconds) - 'OK' + if seconds <= 0 + raise Redis::CommandError, 'ERR invalid expire time in setex' + else + set(key, value) + expire(key, seconds) + 'OK' + end end def setnx(key, value) diff --git a/spec/commands/setex_spec.rb b/spec/commands/setex_spec.rb index 24cce354..4c4d2b1b 100644 --- a/spec/commands/setex_spec.rb +++ b/spec/commands/setex_spec.rb @@ -19,4 +19,20 @@ @redises.real.ttl(@key).should > 0 @redises.mock.ttl(@key).should > 0 end + + context 'when expiration time is zero' do + it 'raises Redis::CommandError' do + expect do + @redises.setex(@key, 0, 'value') + end.to raise_error(Redis::CommandError, 'ERR invalid expire time in setex') + end + end + + context 'when expiration time is negative' do + it 'raises Redis::CommandError' do + expect do + @redises.setex(@key, -2, 'value') + end.to raise_error(Redis::CommandError, 'ERR invalid expire time in setex') + end + end end