Add RedisCacheable specs for memoization correctness

This commit is contained in:
Matija Čupić 2018-05-12 15:32:13 +02:00
parent b1fcac85bd
commit f4810647a0
No known key found for this signature in database
GPG key ID: 4BAF84FFACD2E5DE

View file

@ -9,7 +9,7 @@ describe RedisCacheable do
end end
end end
let(:payload) { { name: 'value' } } let(:payload) { { name: 'value', time: Time.zone.now } }
let(:instance) { model.new(1, payload) } let(:instance) { model.new(1, payload) }
let(:cache_key) { instance.__send__(:cache_attribute_key) } let(:cache_key) { instance.__send__(:cache_attribute_key) }
@ -50,9 +50,7 @@ describe RedisCacheable do
end end
context 'when there is no cached value' do context 'when there is no cached value' do
it 'checks the cached value first then reads the attribute' do it 'reads the attribute' do
expect(instance).to receive(:read_attribute).and_return(payload[:name])
expect(subject).to eq(payload[:name]) expect(subject).to eq(payload[:name])
end end
end end
@ -64,6 +62,14 @@ describe RedisCacheable do
expect(subject).to eq(payload[:name]) expect(subject).to eq(payload[:name])
end end
end end
it 'always returns the latest values' do
expect(instance.name).to eq(payload[:name])
instance.cache_attributes(name: 'new_value')
expect(instance.name).to eq('new_value')
end
end end
describe '#cached_attr_time_reader', :clean_gitlab_redis_shared_state do describe '#cached_attr_time_reader', :clean_gitlab_redis_shared_state do
@ -74,9 +80,7 @@ describe RedisCacheable do
end end
context 'when there is no cached value' do context 'when there is no cached value' do
it 'checks the cached value first then reads the attribute' do it 'reads the attribute' do
expect(instance).to receive(:read_attribute).and_return(Time.zone.now)
expect(subject).to be_instance_of(ActiveSupport::TimeWithZone) expect(subject).to be_instance_of(ActiveSupport::TimeWithZone)
expect(subject).to be_within(1.minute).of(Time.zone.now) expect(subject).to be_within(1.minute).of(Time.zone.now)
end end
@ -90,5 +94,13 @@ describe RedisCacheable do
expect(subject).to be_within(1.minute).of(Time.zone.now) expect(subject).to be_within(1.minute).of(Time.zone.now)
end end
end end
it 'always returns the latest values' do
expect(instance.time).to be_within(1.minute).of(Time.zone.now)
instance.cache_attributes(time: 1.hour.ago)
expect(instance.time).to be_within(1.minute).of(1.hour.ago)
end
end end
end end