Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(set_exat_pxat): Add EXAT and PXAT arguments to the SET redis command #280

Merged
merged 1 commit into from
Oct 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# MockRedis Changelog

### 0.38.0

* Add support for `EXAT` AND `PXAT` arguments to `SET` command

### 0.37.0

* Require Ruby 2.7 or newer, since Ruby 2.6 and older are EOL
Expand Down
19 changes: 17 additions & 2 deletions lib/mock_redis/string_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -210,9 +210,10 @@ def mapped_msetnx(hash)
msetnx(*hash.to_a.flatten)
end

# Parameer list required to ensure the ArgumentError is returned correctly
# Parameter list required to ensure the ArgumentError is returned correctly
# rubocop:disable Metrics/ParameterLists
def set(key, value, ex: nil, px: nil, nx: nil, xx: nil, keepttl: nil, get: nil)
def set(key, value, ex: nil, px: nil, exat: nil, pxat: nil, nx: nil, xx: nil, keepttl: nil,
get: nil)
key = key.to_s
retval = self.get(key) if get

Expand Down Expand Up @@ -248,6 +249,20 @@ def set(key, value, ex: nil, px: nil, nx: nil, xx: nil, keepttl: nil, get: nil)
pexpire(key, px)
end

if exat
if exat == 0
raise Redis::CommandError, 'ERR invalid expire time in set'
end
expireat(key, exat)
end

if pxat
if pxat == 0
raise Redis::CommandError, 'ERR invalid expire time in set'
end
pexpireat(key, pxat)
end

if get
retval
else
Expand Down
2 changes: 1 addition & 1 deletion lib/mock_redis/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

# Defines the gem version.
class MockRedis
VERSION = '0.37.0'
VERSION = '0.38.0'
end
38 changes: 38 additions & 0 deletions spec/commands/set_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@
end.to raise_error(Redis::CommandError, 'ERR invalid expire time in set')
end

it 'raises an error for EXAT seconds = 0' do
expect do
@redises.set('mock-redis-test', 1, exat: 0)
end.to raise_error(Redis::CommandError, 'ERR invalid expire time in set')
end

it 'raises an error for PXAT seconds = 0' do
expect do
@redises.set('mock-redis-test', 1, pxat: 0)
end.to raise_error(Redis::CommandError, 'ERR invalid expire time in set')
end

it 'accepts NX' do
@redises.del(key)
expect(@redises.set(key, 1, nx: true)).to eq(true)
Expand All @@ -33,6 +45,16 @@
expect(@redises.set(key, 1, xx: true)).to eq(true)
end

it 'accepts EXAT' do
@redises.del(key)
expect(@redises.set(key, 1, exat: 1_697_197_606)).to eq('OK')
end

it 'accepts PXAT' do
@redises.del(key)
expect(@redises.set(key, 1, exat: 1_697_197_589_362)).to eq('OK')
end

it 'accepts GET on a string' do
expect(@redises.set(key, '1')).to eq('OK')
expect(@redises.set(key, '2', get: true)).to eq('1')
Expand Down Expand Up @@ -129,6 +151,22 @@
allow(Time).to receive(:now).and_return(@now + 600 / 1000.to_f)
expect(@mock.get(key)).to be_nil
end

it 'accepts EXAT seconds' do
expect(@mock.set(key, 1, exat: (@now + 1).to_i)).to eq('OK')
expect(@mock.get(key)).not_to be_nil
allow(Time).to receive(:now).and_return(@now + 2)
expect(@mock.get(key)).to be_nil
end

it 'accepts PXAT milliseconds' do
expect(@mock.set(key, 1, pxat: ((@now + 500).to_f * 1000).to_i)).to eq('OK')
expect(@mock.get(key)).not_to be_nil
allow(Time).to receive(:now).and_return(@now + 300)
expect(@mock.get(key)).not_to be_nil
allow(Time).to receive(:now).and_return(@now + 600)
expect(@mock.get(key)).to be_nil
end
end
end
end
Loading