gitlab-org--gitlab-foss/spec/lib/gitlab/safe_request_store_spec.rb
Michael Kozono b720ea0613 Fix RequestStore-related test failure
The test was failing
https://gitlab.com/gitlab-org/gitlab-ee/-/jobs/101444126 because
a04056efad/ee/spec/support/request_store.rb
which is in EE only, clears the RequestStore before every test,
regardless of whether RequestStore is active. This test is unusual
because it sets up RequestStore without it being active, to make sure
that the tested code doesn’t attempt to use RequestStore. These two
unusual facts combined to cause the failure in EE only. The fix works
because of the particular order of RSpec hooks in the test lifecycle.
2018-09-25 13:24:37 -07:00

245 lines
6.4 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
describe Gitlab::SafeRequestStore do
describe '.store' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect(described_class.store).to eq(RequestStore)
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
expect(described_class.store).to be_a(Gitlab::NullRequestStore)
end
end
end
describe '.begin!' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect(RequestStore).to receive(:begin!)
described_class.begin!
end
end
context 'when RequestStore is NOT active' do
it 'uses RequestStore' do
expect(RequestStore).to receive(:begin!)
described_class.begin!
end
end
end
describe '.clear!' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect(RequestStore).to receive(:clear!).twice.and_call_original
described_class.clear!
end
end
context 'when RequestStore is NOT active' do
it 'uses RequestStore' do
expect(RequestStore).to receive(:clear!).and_call_original
described_class.clear!
end
end
end
describe '.end!' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect(RequestStore).to receive(:end!).twice.and_call_original
described_class.end!
end
end
context 'when RequestStore is NOT active' do
it 'uses RequestStore' do
expect(RequestStore).to receive(:end!).and_call_original
described_class.end!
end
end
end
describe '.write' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect do
described_class.write('foo', true)
end.to change { described_class.read('foo') }.from(nil).to(true)
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
expect do
described_class.write('foo', true)
end.not_to change { described_class.read('foo') }.from(nil)
end
end
end
describe '.[]=' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect do
described_class['foo'] = true
end.to change { described_class.read('foo') }.from(nil).to(true)
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
expect do
described_class['foo'] = true
end.not_to change { described_class.read('foo') }.from(nil)
end
end
end
describe '.read' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect do
RequestStore.write('foo', true)
end.to change { described_class.read('foo') }.from(nil).to(true)
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
expect do
RequestStore.write('foo', true)
end.not_to change { described_class.read('foo') }.from(nil)
RequestStore.clear! # Clean up
end
end
end
describe '.[]' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect do
RequestStore.write('foo', true)
end.to change { described_class['foo'] }.from(nil).to(true)
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
expect do
RequestStore.write('foo', true)
end.not_to change { described_class['foo'] }.from(nil)
RequestStore.clear! # Clean up
end
end
end
describe '.exist?' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect do
RequestStore.write('foo', 'not nil')
end.to change { described_class.exist?('foo') }.from(false).to(true)
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
expect do
RequestStore.write('foo', 'not nil')
end.not_to change { described_class.exist?('foo') }.from(false)
RequestStore.clear! # Clean up
end
end
end
describe '.fetch' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
expect do
described_class.fetch('foo') { 'block result' }
end.to change { described_class.read('foo') }.from(nil).to('block result')
end
end
context 'when RequestStore is NOT active' do
it 'does not use RequestStore' do
RequestStore.clear! # Ensure clean
expect do
described_class.fetch('foo') { 'block result' }
end.not_to change { described_class.read('foo') }.from(nil)
RequestStore.clear! # Clean up
end
end
end
describe '.delete' do
context 'when RequestStore is active', :request_store do
it 'uses RequestStore' do
described_class.write('foo', true)
expect do
described_class.delete('foo')
end.to change { described_class.read('foo') }.from(true).to(nil)
end
context 'when given a block and the key exists' do
it 'does not execute the block' do
described_class.write('foo', true)
expect do |b|
described_class.delete('foo', &b)
end.not_to yield_control
end
end
context 'when given a block and the key does not exist' do
it 'yields the key and returns the block result' do
result = described_class.delete('foo') { |key| "#{key} block result" }
expect(result).to eq('foo block result')
end
end
end
context 'when RequestStore is NOT active' do
before do
RequestStore.write('foo', true)
end
after do
RequestStore.clear! # Clean up
end
it 'does not use RequestStore' do
expect do
described_class.delete('foo')
end.not_to change { RequestStore.read('foo') }.from(true)
end
context 'when given a block' do
it 'yields the key and returns the block result' do
result = described_class.delete('foo') { |key| "#{key} block result" }
expect(result).to eq('foo block result')
end
end
end
end
end