575dced5d7
master was failing because `ApplicationSetting.create_from_defaults` attempted to write to a column that did not exist in the database. This occurred in a `rake db:migrate` task, which was unable to perform the migration that would have added the missing column in the first place. In 9.3 RC2, we also had a bug where password sign-ins were disabled because there were many pending migrations. The problem occurred because `fake_application_settings` was being returned with an OpenStruct that did not include the predicate method `signup_enabled?`. As a result, the value would erroneously return `nil` instead of `true`. This commit uses the values of the defaults to mimic this behavior. This commit also refactors some of the logic to be clearer.
96 lines
3.4 KiB
Ruby
96 lines
3.4 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Gitlab::CurrentSettings do
|
|
include StubENV
|
|
|
|
before do
|
|
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
|
|
end
|
|
|
|
describe '#current_application_settings' do
|
|
context 'with DB available' do
|
|
before do
|
|
allow_any_instance_of(described_class).to receive(:connect_to_db?).and_return(true)
|
|
end
|
|
|
|
it 'attempts to use cached values first' do
|
|
expect(ApplicationSetting).to receive(:cached)
|
|
|
|
expect(current_application_settings).to be_a(ApplicationSetting)
|
|
end
|
|
|
|
it 'falls back to DB if Redis returns an empty value' do
|
|
expect(ApplicationSetting).to receive(:cached).and_return(nil)
|
|
expect(ApplicationSetting).to receive(:last).and_call_original
|
|
|
|
expect(current_application_settings).to be_a(ApplicationSetting)
|
|
end
|
|
|
|
it 'falls back to DB if Redis fails' do
|
|
expect(ApplicationSetting).to receive(:cached).and_raise(::Redis::BaseError)
|
|
expect(ApplicationSetting).to receive(:last).and_call_original
|
|
|
|
expect(current_application_settings).to be_a(ApplicationSetting)
|
|
end
|
|
|
|
context 'with migrations pending' do
|
|
before do
|
|
expect(ActiveRecord::Migrator).to receive(:needs_migration?).and_return(true)
|
|
end
|
|
|
|
it 'returns an in-memory ApplicationSetting object' do
|
|
settings = current_application_settings
|
|
|
|
expect(settings).to be_a(OpenStruct)
|
|
expect(settings.sign_in_enabled?).to eq(settings.sign_in_enabled)
|
|
expect(settings.sign_up_enabled?).to eq(settings.sign_up_enabled)
|
|
end
|
|
|
|
it 'uses the existing database settings and falls back to defaults' do
|
|
db_settings = create(:application_setting,
|
|
home_page_url: 'http://mydomain.com',
|
|
signup_enabled: false)
|
|
settings = current_application_settings
|
|
app_defaults = ApplicationSetting.last
|
|
|
|
expect(settings).to be_a(OpenStruct)
|
|
expect(settings.home_page_url).to eq(db_settings.home_page_url)
|
|
expect(settings.signup_enabled?).to be_falsey
|
|
expect(settings.signup_enabled).to be_falsey
|
|
|
|
# Check that unspecified values use the defaults
|
|
settings.reject! { |key, _| [:home_page_url, :signup_enabled].include? key }
|
|
settings.each { |key, _| expect(settings[key]).to eq(app_defaults[key]) }
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with DB unavailable' do
|
|
before do
|
|
allow_any_instance_of(described_class).to receive(:connect_to_db?).and_return(false)
|
|
allow_any_instance_of(described_class).to receive(:retrieve_settings_from_database_cache?).and_return(nil)
|
|
end
|
|
|
|
it 'returns an in-memory ApplicationSetting object' do
|
|
expect(ApplicationSetting).not_to receive(:current)
|
|
expect(ApplicationSetting).not_to receive(:last)
|
|
|
|
expect(current_application_settings).to be_a(OpenStruct)
|
|
end
|
|
end
|
|
|
|
context 'when ENV["IN_MEMORY_APPLICATION_SETTINGS"] is true' do
|
|
before do
|
|
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'true')
|
|
end
|
|
|
|
it 'returns an in-memory ApplicationSetting object' do
|
|
expect(ApplicationSetting).not_to receive(:current)
|
|
expect(ApplicationSetting).not_to receive(:last)
|
|
|
|
expect(current_application_settings).to be_a(ApplicationSetting)
|
|
expect(current_application_settings).not_to be_persisted
|
|
end
|
|
end
|
|
end
|
|
end
|