2015-01-08 17:53:35 +00:00
|
|
|
require 'spec_helper'
|
|
|
|
|
2017-07-10 14:24:02 +00:00
|
|
|
describe ApplicationSetting do
|
2017-07-25 17:09:00 +00:00
|
|
|
let(:setting) { described_class.create_from_defaults }
|
2015-05-02 13:53:32 +00:00
|
|
|
|
2015-11-05 15:22:37 +00:00
|
|
|
it { expect(setting).to be_valid }
|
2017-04-24 19:12:05 +00:00
|
|
|
it { expect(setting.uuid).to be_present }
|
2017-08-24 11:01:33 +00:00
|
|
|
it { expect(setting).to have_db_column(:auto_devops_enabled) }
|
2015-05-02 13:53:32 +00:00
|
|
|
|
2015-12-01 23:45:36 +00:00
|
|
|
describe 'validations' do
|
|
|
|
let(:http) { 'http://example.com' }
|
|
|
|
let(:https) { 'https://example.com' }
|
|
|
|
let(:ftp) { 'ftp://example.com' }
|
|
|
|
|
|
|
|
it { is_expected.to allow_value(nil).for(:home_page_url) }
|
|
|
|
it { is_expected.to allow_value(http).for(:home_page_url) }
|
|
|
|
it { is_expected.to allow_value(https).for(:home_page_url) }
|
|
|
|
it { is_expected.not_to allow_value(ftp).for(:home_page_url) }
|
|
|
|
|
|
|
|
it { is_expected.to allow_value(nil).for(:after_sign_out_path) }
|
|
|
|
it { is_expected.to allow_value(http).for(:after_sign_out_path) }
|
|
|
|
it { is_expected.to allow_value(https).for(:after_sign_out_path) }
|
|
|
|
it { is_expected.not_to allow_value(ftp).for(:after_sign_out_path) }
|
2016-02-05 09:12:36 +00:00
|
|
|
|
2016-05-05 07:34:51 +00:00
|
|
|
describe 'disabled_oauth_sign_in_sources validations' do
|
|
|
|
before do
|
|
|
|
allow(Devise).to receive(:omniauth_providers).and_return([:github])
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to allow_value(['github']).for(:disabled_oauth_sign_in_sources) }
|
|
|
|
it { is_expected.not_to allow_value(['test']).for(:disabled_oauth_sign_in_sources) }
|
|
|
|
end
|
2016-05-04 12:57:00 +00:00
|
|
|
|
2017-02-14 16:19:36 +00:00
|
|
|
describe 'default_artifacts_expire_in' do
|
2017-02-16 15:40:13 +00:00
|
|
|
it 'sets an error if it cannot parse' do
|
2017-02-14 16:19:36 +00:00
|
|
|
setting.update(default_artifacts_expire_in: 'a')
|
|
|
|
|
2017-02-16 15:40:13 +00:00
|
|
|
expect_invalid
|
2017-02-14 16:19:36 +00:00
|
|
|
end
|
|
|
|
|
2017-02-16 15:40:13 +00:00
|
|
|
it 'sets an error if it is blank' do
|
|
|
|
setting.update(default_artifacts_expire_in: ' ')
|
2017-02-15 07:31:25 +00:00
|
|
|
|
2017-02-16 15:40:13 +00:00
|
|
|
expect_invalid
|
2017-02-15 07:31:25 +00:00
|
|
|
end
|
|
|
|
|
2017-02-14 16:19:36 +00:00
|
|
|
it 'sets the value if it is valid' do
|
|
|
|
setting.update(default_artifacts_expire_in: '30 days')
|
|
|
|
|
|
|
|
expect(setting).to be_valid
|
|
|
|
expect(setting.default_artifacts_expire_in).to eq('30 days')
|
|
|
|
end
|
|
|
|
|
2017-02-16 15:40:13 +00:00
|
|
|
it 'sets the value if it is 0' do
|
|
|
|
setting.update(default_artifacts_expire_in: '0')
|
2017-02-14 16:19:36 +00:00
|
|
|
|
|
|
|
expect(setting).to be_valid
|
2017-02-16 15:40:13 +00:00
|
|
|
expect(setting.default_artifacts_expire_in).to eq('0')
|
|
|
|
end
|
|
|
|
|
|
|
|
def expect_invalid
|
|
|
|
expect(setting).to be_invalid
|
|
|
|
expect(setting.errors.messages)
|
2017-02-21 10:46:52 +00:00
|
|
|
.to have_key(:default_artifacts_expire_in)
|
2017-02-14 16:19:36 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-02-05 09:12:36 +00:00
|
|
|
it { is_expected.to validate_presence_of(:max_attachment_size) }
|
|
|
|
|
|
|
|
it do
|
|
|
|
is_expected.to validate_numericality_of(:max_attachment_size)
|
|
|
|
.only_integer
|
|
|
|
.is_greater_than(0)
|
|
|
|
end
|
2016-02-09 14:51:06 +00:00
|
|
|
|
2017-08-25 13:08:48 +00:00
|
|
|
context 'key restrictions' do
|
|
|
|
it 'supports all key types' do
|
|
|
|
expect(described_class::SUPPORTED_KEY_TYPES).to contain_exactly(:rsa, :dsa, :ecdsa, :ed25519)
|
|
|
|
end
|
2017-08-21 10:30:03 +00:00
|
|
|
|
2017-08-30 20:20:00 +00:00
|
|
|
it 'does not allow all key types to be disabled' do
|
|
|
|
described_class::SUPPORTED_KEY_TYPES.each do |type|
|
|
|
|
setting["#{type}_key_restriction"] = described_class::FORBIDDEN_KEY_VALUE
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(setting).not_to be_valid
|
|
|
|
expect(setting.errors.messages).to have_key(:allowed_key_types)
|
|
|
|
end
|
|
|
|
|
2017-08-25 13:08:48 +00:00
|
|
|
where(:type) do
|
|
|
|
described_class::SUPPORTED_KEY_TYPES
|
|
|
|
end
|
2017-08-21 10:30:03 +00:00
|
|
|
|
2017-08-25 13:08:48 +00:00
|
|
|
with_them do
|
|
|
|
let(:field) { :"#{type}_key_restriction" }
|
2017-08-21 10:30:03 +00:00
|
|
|
|
2017-08-25 13:08:48 +00:00
|
|
|
it { is_expected.to validate_presence_of(field) }
|
2017-08-28 20:58:36 +00:00
|
|
|
it { is_expected.to allow_value(*KeyRestrictionValidator.supported_key_restrictions(type)).for(field) }
|
2017-08-25 13:08:48 +00:00
|
|
|
it { is_expected.not_to allow_value(128).for(field) }
|
|
|
|
end
|
2017-08-21 10:30:03 +00:00
|
|
|
end
|
|
|
|
|
2016-02-09 14:51:06 +00:00
|
|
|
it_behaves_like 'an object with email-formated attributes', :admin_notification_email do
|
|
|
|
subject { setting }
|
|
|
|
end
|
2016-06-30 03:35:00 +00:00
|
|
|
|
2016-11-03 14:12:20 +00:00
|
|
|
# Upgraded databases will have this sort of content
|
|
|
|
context 'repository_storages is a String, not an Array' do
|
2017-06-14 18:18:56 +00:00
|
|
|
before do
|
|
|
|
setting.__send__(:raw_write_attribute, :repository_storages, 'default')
|
|
|
|
end
|
2016-11-03 14:12:20 +00:00
|
|
|
|
|
|
|
it { expect(setting.repository_storages_before_type_cast).to eq('default') }
|
|
|
|
it { expect(setting.repository_storages).to eq(['default']) }
|
|
|
|
end
|
|
|
|
|
2017-10-12 14:35:59 +00:00
|
|
|
context 'circuitbreaker settings' do
|
2017-10-18 12:57:35 +00:00
|
|
|
[:circuitbreaker_backoff_threshold,
|
|
|
|
:circuitbreaker_failure_count_threshold,
|
2017-10-12 14:35:59 +00:00
|
|
|
:circuitbreaker_failure_wait_time,
|
|
|
|
:circuitbreaker_failure_reset_time,
|
|
|
|
:circuitbreaker_storage_timeout].each do |field|
|
|
|
|
it "Validates #{field} as number" do
|
|
|
|
is_expected.to validate_numericality_of(field)
|
|
|
|
.only_integer
|
|
|
|
.is_greater_than_or_equal_to(0)
|
|
|
|
end
|
|
|
|
end
|
2017-10-18 12:57:35 +00:00
|
|
|
|
|
|
|
it 'requires the `backoff_threshold` to be lower than the `failure_count_threshold`' do
|
|
|
|
setting.circuitbreaker_failure_count_threshold = 10
|
|
|
|
setting.circuitbreaker_backoff_threshold = 15
|
|
|
|
failure_message = "The circuitbreaker backoff threshold should be lower "\
|
|
|
|
"than the failure count threshold"
|
|
|
|
|
|
|
|
expect(setting).not_to be_valid
|
|
|
|
expect(setting.errors[:circuitbreaker_backoff_threshold]).to include(failure_message)
|
|
|
|
end
|
2017-10-12 14:35:59 +00:00
|
|
|
end
|
|
|
|
|
2016-11-03 14:12:20 +00:00
|
|
|
context 'repository storages' do
|
2016-06-30 03:35:00 +00:00
|
|
|
before do
|
2016-11-03 14:12:20 +00:00
|
|
|
storages = {
|
|
|
|
'custom1' => 'tmp/tests/custom_repositories_1',
|
|
|
|
'custom2' => 'tmp/tests/custom_repositories_2',
|
2017-05-03 11:22:03 +00:00
|
|
|
'custom3' => 'tmp/tests/custom_repositories_3'
|
2016-11-03 14:12:20 +00:00
|
|
|
|
|
|
|
}
|
2016-06-30 03:35:00 +00:00
|
|
|
allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
|
|
|
|
end
|
|
|
|
|
2016-11-03 14:12:20 +00:00
|
|
|
describe 'inclusion' do
|
|
|
|
it { is_expected.to allow_value('custom1').for(:repository_storages) }
|
2017-02-22 17:46:57 +00:00
|
|
|
it { is_expected.to allow_value(%w(custom2 custom3)).for(:repository_storages) }
|
2016-11-03 14:12:20 +00:00
|
|
|
it { is_expected.not_to allow_value('alternative').for(:repository_storages) }
|
2017-02-22 17:46:57 +00:00
|
|
|
it { is_expected.not_to allow_value(%w(alternative custom1)).for(:repository_storages) }
|
2016-11-03 14:12:20 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'presence' do
|
|
|
|
it { is_expected.not_to allow_value([]).for(:repository_storages) }
|
|
|
|
it { is_expected.not_to allow_value("").for(:repository_storages) }
|
|
|
|
it { is_expected.not_to allow_value(nil).for(:repository_storages) }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.pick_repository_storage' do
|
|
|
|
it 'uses Array#sample to pick a random storage' do
|
|
|
|
array = double('array', sample: 'random')
|
|
|
|
expect(setting).to receive(:repository_storages).and_return(array)
|
|
|
|
|
|
|
|
expect(setting.pick_repository_storage).to eq('random')
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#repository_storage' do
|
|
|
|
it 'returns the first storage' do
|
2017-02-22 17:46:57 +00:00
|
|
|
setting.repository_storages = %w(good bad)
|
2016-11-03 14:12:20 +00:00
|
|
|
|
|
|
|
expect(setting.repository_storage).to eq('good')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#repository_storage=' do
|
|
|
|
it 'overwrites repository_storages' do
|
|
|
|
setting.repository_storage = 'overwritten'
|
|
|
|
|
|
|
|
expect(setting.repository_storages).to eq(['overwritten'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-06-30 03:35:00 +00:00
|
|
|
end
|
2016-10-27 12:59:52 +00:00
|
|
|
|
|
|
|
context 'housekeeping settings' do
|
|
|
|
it { is_expected.not_to allow_value(0).for(:housekeeping_incremental_repack_period) }
|
|
|
|
|
2017-08-21 09:51:45 +00:00
|
|
|
it 'wants the full repack period to be at least the incremental repack period' do
|
2016-10-27 12:59:52 +00:00
|
|
|
subject.housekeeping_incremental_repack_period = 2
|
|
|
|
subject.housekeeping_full_repack_period = 1
|
|
|
|
|
|
|
|
expect(subject).not_to be_valid
|
|
|
|
end
|
|
|
|
|
2017-08-21 09:51:45 +00:00
|
|
|
it 'wants the gc period to be at least the full repack period' do
|
|
|
|
subject.housekeeping_full_repack_period = 100
|
|
|
|
subject.housekeeping_gc_period = 90
|
2016-10-27 12:59:52 +00:00
|
|
|
|
|
|
|
expect(subject).not_to be_valid
|
|
|
|
end
|
2017-08-21 09:51:45 +00:00
|
|
|
|
|
|
|
it 'allows the same period for incremental repack and full repack, effectively skipping incremental repack' do
|
|
|
|
subject.housekeeping_incremental_repack_period = 2
|
|
|
|
subject.housekeeping_full_repack_period = 2
|
|
|
|
|
|
|
|
expect(subject).to be_valid
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'allows the same period for full repack and gc, effectively skipping full repack' do
|
|
|
|
subject.housekeeping_full_repack_period = 100
|
|
|
|
subject.housekeeping_gc_period = 100
|
|
|
|
|
|
|
|
expect(subject).to be_valid
|
|
|
|
end
|
2017-07-10 12:29:16 +00:00
|
|
|
end
|
2017-11-29 09:12:12 +00:00
|
|
|
|
|
|
|
context 'gitaly timeouts' do
|
|
|
|
[:gitaly_timeout_default, :gitaly_timeout_medium, :gitaly_timeout_fast].each do |timeout_name|
|
|
|
|
it do
|
|
|
|
is_expected.to validate_presence_of(timeout_name)
|
|
|
|
is_expected.to validate_numericality_of(timeout_name).only_integer
|
|
|
|
.is_greater_than_or_equal_to(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
[:gitaly_timeout_medium, :gitaly_timeout_fast].each do |timeout_name|
|
|
|
|
it "validates that #{timeout_name} is lower than timeout_default" do
|
|
|
|
subject[:gitaly_timeout_default] = 50
|
|
|
|
subject[timeout_name] = 100
|
|
|
|
|
|
|
|
expect(subject).to be_invalid
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'accepts all timeouts equal' do
|
|
|
|
subject.gitaly_timeout_default = 0
|
|
|
|
subject.gitaly_timeout_medium = 0
|
|
|
|
subject.gitaly_timeout_fast = 0
|
|
|
|
|
|
|
|
expect(subject).to be_valid
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'accepts timeouts in descending order' do
|
|
|
|
subject.gitaly_timeout_default = 50
|
|
|
|
subject.gitaly_timeout_medium = 30
|
|
|
|
subject.gitaly_timeout_fast = 20
|
|
|
|
|
|
|
|
expect(subject).to be_valid
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'rejects timeouts in ascending order' do
|
|
|
|
subject.gitaly_timeout_default = 20
|
|
|
|
subject.gitaly_timeout_medium = 30
|
|
|
|
subject.gitaly_timeout_fast = 50
|
|
|
|
|
|
|
|
expect(subject).to be_invalid
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'rejects medium timeout larger than default' do
|
|
|
|
subject.gitaly_timeout_default = 30
|
|
|
|
subject.gitaly_timeout_medium = 50
|
|
|
|
subject.gitaly_timeout_fast = 20
|
|
|
|
|
|
|
|
expect(subject).to be_invalid
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'rejects medium timeout smaller than fast' do
|
|
|
|
subject.gitaly_timeout_default = 30
|
|
|
|
subject.gitaly_timeout_medium = 15
|
|
|
|
subject.gitaly_timeout_fast = 20
|
|
|
|
|
|
|
|
expect(subject).to be_invalid
|
|
|
|
end
|
|
|
|
end
|
2017-07-10 12:29:16 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe '.current' do
|
|
|
|
context 'redis unavailable' do
|
|
|
|
it 'returns an ApplicationSetting' do
|
|
|
|
allow(Rails.cache).to receive(:fetch).and_call_original
|
2017-07-25 17:09:00 +00:00
|
|
|
allow(described_class).to receive(:last).and_return(:last)
|
2017-07-10 12:29:16 +00:00
|
|
|
expect(Rails.cache).to receive(:fetch).with(ApplicationSetting::CACHE_KEY).and_raise(ArgumentError)
|
|
|
|
|
2017-07-25 17:09:00 +00:00
|
|
|
expect(described_class.current).to eq(:last)
|
2017-07-10 12:29:16 +00:00
|
|
|
end
|
2016-10-27 12:59:52 +00:00
|
|
|
end
|
2017-10-19 12:07:18 +00:00
|
|
|
|
|
|
|
context 'when an ApplicationSetting is not yet present' do
|
|
|
|
it 'does not cache nil object' do
|
|
|
|
# when missing settings a nil object is returned, but not cached
|
|
|
|
allow(described_class).to receive(:last).and_return(nil).twice
|
|
|
|
expect(described_class.current).to be_nil
|
|
|
|
|
|
|
|
# when the settings are set the method returns a valid object
|
|
|
|
allow(described_class).to receive(:last).and_return(:last)
|
|
|
|
expect(described_class.current).to eq(:last)
|
|
|
|
|
|
|
|
# subsequent calls get everything from cache
|
|
|
|
expect(described_class.current).to eq(:last)
|
|
|
|
end
|
|
|
|
end
|
2015-12-01 23:45:36 +00:00
|
|
|
end
|
|
|
|
|
2017-10-05 19:56:23 +00:00
|
|
|
context 'restrict creating duplicates' do
|
|
|
|
before do
|
|
|
|
described_class.create_from_defaults
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'raises an record creation violation if already created' do
|
|
|
|
expect { described_class.create_from_defaults }.to raise_error(ActiveRecord::RecordNotUnique)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-11-05 15:22:37 +00:00
|
|
|
context 'restricted signup domains' do
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets single domain' do
|
2016-07-15 23:30:38 +00:00
|
|
|
setting.domain_whitelist_raw = 'example.com'
|
|
|
|
expect(setting.domain_whitelist).to eq(['example.com'])
|
2015-05-02 13:53:32 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with spaces' do
|
2016-07-15 23:30:38 +00:00
|
|
|
setting.domain_whitelist_raw = 'example.com *.example.com'
|
|
|
|
expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
|
2015-05-02 13:53:32 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with newlines and a space' do
|
2016-07-15 23:30:38 +00:00
|
|
|
setting.domain_whitelist_raw = "example.com\n *.example.com"
|
|
|
|
expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
|
2015-05-02 13:53:32 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with commas' do
|
2016-07-15 23:30:38 +00:00
|
|
|
setting.domain_whitelist_raw = "example.com, *.example.com"
|
|
|
|
expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
|
2015-05-02 13:53:32 +00:00
|
|
|
end
|
|
|
|
end
|
2016-07-14 18:19:40 +00:00
|
|
|
|
|
|
|
context 'blacklisted signup domains' do
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets single domain' do
|
2016-07-14 18:19:40 +00:00
|
|
|
setting.domain_blacklist_raw = 'example.com'
|
2016-07-15 18:20:45 +00:00
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com')
|
2016-07-14 18:19:40 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with spaces' do
|
2016-07-14 18:19:40 +00:00
|
|
|
setting.domain_blacklist_raw = 'example.com *.example.com'
|
2016-07-15 18:20:45 +00:00
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
|
2016-07-14 18:19:40 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with newlines and a space' do
|
2016-07-14 18:19:40 +00:00
|
|
|
setting.domain_blacklist_raw = "example.com\n *.example.com"
|
2016-07-15 18:20:45 +00:00
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
|
2016-07-14 18:19:40 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with commas' do
|
2016-07-14 18:19:40 +00:00
|
|
|
setting.domain_blacklist_raw = "example.com, *.example.com"
|
2016-07-15 18:20:45 +00:00
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
|
2016-07-14 18:19:40 +00:00
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with semicolon' do
|
2016-07-18 22:49:33 +00:00
|
|
|
setting.domain_blacklist_raw = "example.com; *.example.com"
|
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
|
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domains with mixture of everything' do
|
2016-07-18 22:49:33 +00:00
|
|
|
setting.domain_blacklist_raw = "example.com; *.example.com\n test.com\sblock.com yes.com"
|
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com', 'test.com', 'block.com', 'yes.com')
|
|
|
|
end
|
|
|
|
|
2016-08-01 15:00:44 +00:00
|
|
|
it 'sets multiple domain with file' do
|
2016-07-18 22:49:33 +00:00
|
|
|
setting.domain_blacklist_file = File.open(Rails.root.join('spec/fixtures/', 'domain_blacklist.txt'))
|
2016-07-15 18:20:45 +00:00
|
|
|
expect(setting.domain_blacklist).to contain_exactly('example.com', 'test.com', 'foo.bar')
|
2016-07-14 18:19:40 +00:00
|
|
|
end
|
|
|
|
end
|
2017-05-09 19:40:19 +00:00
|
|
|
|
2017-07-06 16:57:02 +00:00
|
|
|
describe 'performance bar settings' do
|
2017-07-07 00:34:51 +00:00
|
|
|
describe 'performance_bar_allowed_group_id=' do
|
|
|
|
context 'with a blank path' do
|
|
|
|
before do
|
|
|
|
setting.performance_bar_allowed_group_id = create(:group).full_path
|
|
|
|
end
|
2017-07-06 16:57:02 +00:00
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
it 'persists nil for a "" path and clears allowed user IDs cache' do
|
|
|
|
expect(Gitlab::PerformanceBar).to receive(:expire_allowed_user_ids_cache)
|
2017-07-06 16:57:02 +00:00
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
setting.performance_bar_allowed_group_id = ''
|
|
|
|
|
|
|
|
expect(setting.performance_bar_allowed_group_id).to be_nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with an invalid path' do
|
|
|
|
it 'does not persist an invalid group path' do
|
|
|
|
setting.performance_bar_allowed_group_id = 'foo'
|
2017-07-06 16:57:02 +00:00
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
expect(setting.performance_bar_allowed_group_id).to be_nil
|
|
|
|
end
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a path to an existing group' do
|
|
|
|
let(:group) { create(:group) }
|
|
|
|
|
|
|
|
it 'persists a valid group path and clears allowed user IDs cache' do
|
|
|
|
expect(Gitlab::PerformanceBar).to receive(:expire_allowed_user_ids_cache)
|
|
|
|
|
|
|
|
setting.performance_bar_allowed_group_id = group.full_path
|
|
|
|
|
|
|
|
expect(setting.performance_bar_allowed_group_id).to eq(group.id)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the given path is the same' do
|
2017-07-07 00:34:51 +00:00
|
|
|
context 'with a blank path' do
|
|
|
|
before do
|
|
|
|
setting.performance_bar_allowed_group_id = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'clears the cached allowed user IDs' do
|
|
|
|
expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
|
|
|
|
|
|
|
|
setting.performance_bar_allowed_group_id = ''
|
|
|
|
end
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
context 'with a valid path' do
|
|
|
|
before do
|
|
|
|
setting.performance_bar_allowed_group_id = group.full_path
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'clears the cached allowed user IDs' do
|
|
|
|
expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
|
2017-07-06 16:57:02 +00:00
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
setting.performance_bar_allowed_group_id = group.full_path
|
|
|
|
end
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'performance_bar_allowed_group' do
|
|
|
|
context 'with no performance_bar_allowed_group_id saved' do
|
|
|
|
it 'returns nil' do
|
|
|
|
expect(setting.performance_bar_allowed_group).to be_nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a performance_bar_allowed_group_id saved' do
|
|
|
|
let(:group) { create(:group) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
setting.performance_bar_allowed_group_id = group.full_path
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns the group' do
|
|
|
|
expect(setting.performance_bar_allowed_group).to eq(group)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
describe 'performance_bar_enabled' do
|
|
|
|
context 'with the Performance Bar is enabled' do
|
|
|
|
let(:group) { create(:group) }
|
2017-07-06 16:57:02 +00:00
|
|
|
|
|
|
|
before do
|
2017-07-07 00:34:51 +00:00
|
|
|
setting.performance_bar_allowed_group_id = group.full_path
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true' do
|
2017-07-07 00:34:51 +00:00
|
|
|
expect(setting.performance_bar_enabled).to be_truthy
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'performance_bar_enabled=' do
|
|
|
|
context 'when the performance bar is enabled' do
|
2017-07-07 00:34:51 +00:00
|
|
|
let(:group) { create(:group) }
|
|
|
|
|
2017-07-06 16:57:02 +00:00
|
|
|
before do
|
2017-07-07 00:34:51 +00:00
|
|
|
setting.performance_bar_allowed_group_id = group.full_path
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when passing true' do
|
|
|
|
it 'does not clear allowed user IDs cache' do
|
|
|
|
expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
|
2017-07-07 00:34:51 +00:00
|
|
|
|
2017-07-06 16:57:02 +00:00
|
|
|
setting.performance_bar_enabled = true
|
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
expect(setting.performance_bar_allowed_group_id).to eq(group.id)
|
|
|
|
expect(setting.performance_bar_enabled).to be_truthy
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when passing false' do
|
|
|
|
it 'disables the performance bar and clears allowed user IDs cache' do
|
|
|
|
expect(Gitlab::PerformanceBar).to receive(:expire_allowed_user_ids_cache)
|
2017-07-07 00:34:51 +00:00
|
|
|
|
2017-07-06 16:57:02 +00:00
|
|
|
setting.performance_bar_enabled = false
|
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
expect(setting.performance_bar_allowed_group_id).to be_nil
|
|
|
|
expect(setting.performance_bar_enabled).to be_falsey
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the performance bar is disabled' do
|
|
|
|
context 'when passing true' do
|
2017-07-07 00:34:51 +00:00
|
|
|
it 'does nothing and does not clear allowed user IDs cache' do
|
|
|
|
expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
|
|
|
|
|
2017-07-06 16:57:02 +00:00
|
|
|
setting.performance_bar_enabled = true
|
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
expect(setting.performance_bar_allowed_group_id).to be_nil
|
|
|
|
expect(setting.performance_bar_enabled).to be_falsey
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when passing false' do
|
2017-07-07 00:34:51 +00:00
|
|
|
it 'does nothing and does not clear allowed user IDs cache' do
|
2017-07-06 16:57:02 +00:00
|
|
|
expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
|
2017-07-07 00:34:51 +00:00
|
|
|
|
2017-07-06 16:57:02 +00:00
|
|
|
setting.performance_bar_enabled = false
|
|
|
|
|
2017-07-07 00:34:51 +00:00
|
|
|
expect(setting.performance_bar_allowed_group_id).to be_nil
|
|
|
|
expect(setting.performance_bar_enabled).to be_falsey
|
2017-07-06 16:57:02 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-05-09 19:40:19 +00:00
|
|
|
describe 'usage ping settings' do
|
|
|
|
context 'when the usage ping is disabled in gitlab.yml' do
|
|
|
|
before do
|
|
|
|
allow(Settings.gitlab).to receive(:usage_ping_enabled).and_return(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not allow the usage ping to be configured' do
|
|
|
|
expect(setting.usage_ping_can_be_configured?).to be_falsey
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the usage ping is disabled in the DB' do
|
|
|
|
before do
|
|
|
|
setting.usage_ping_enabled = false
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false for usage_ping_enabled' do
|
|
|
|
expect(setting.usage_ping_enabled).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the usage ping is enabled in the DB' do
|
|
|
|
before do
|
|
|
|
setting.usage_ping_enabled = true
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false for usage_ping_enabled' do
|
|
|
|
expect(setting.usage_ping_enabled).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the usage ping is enabled in gitlab.yml' do
|
|
|
|
before do
|
|
|
|
allow(Settings.gitlab).to receive(:usage_ping_enabled).and_return(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'allows the usage ping to be configured' do
|
|
|
|
expect(setting.usage_ping_can_be_configured?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the usage ping is disabled in the DB' do
|
|
|
|
before do
|
|
|
|
setting.usage_ping_enabled = false
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false for usage_ping_enabled' do
|
|
|
|
expect(setting.usage_ping_enabled).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the usage ping is enabled in the DB' do
|
|
|
|
before do
|
|
|
|
setting.usage_ping_enabled = true
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true for usage_ping_enabled' do
|
|
|
|
expect(setting.usage_ping_enabled).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2017-08-21 10:30:03 +00:00
|
|
|
|
2017-08-25 13:08:48 +00:00
|
|
|
describe '#allowed_key_types' do
|
|
|
|
it 'includes all key types by default' do
|
|
|
|
expect(setting.allowed_key_types).to contain_exactly(*described_class::SUPPORTED_KEY_TYPES)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'excludes disabled key types' do
|
|
|
|
expect(setting.allowed_key_types).to include(:ed25519)
|
|
|
|
|
|
|
|
setting.ed25519_key_restriction = described_class::FORBIDDEN_KEY_VALUE
|
|
|
|
|
|
|
|
expect(setting.allowed_key_types).not_to include(:ed25519)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#key_restriction_for' do
|
|
|
|
it 'returns the restriction value for recognised types' do
|
|
|
|
setting.rsa_key_restriction = 1024
|
|
|
|
|
|
|
|
expect(setting.key_restriction_for(:rsa)).to eq(1024)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'allows types to be passed as a string' do
|
|
|
|
setting.rsa_key_restriction = 1024
|
|
|
|
|
|
|
|
expect(setting.key_restriction_for('rsa')).to eq(1024)
|
2017-08-21 10:30:03 +00:00
|
|
|
end
|
|
|
|
|
2017-08-25 13:08:48 +00:00
|
|
|
it 'returns forbidden for unrecognised type' do
|
|
|
|
expect(setting.key_restriction_for(:foo)).to eq(described_class::FORBIDDEN_KEY_VALUE)
|
2017-08-21 10:30:03 +00:00
|
|
|
end
|
|
|
|
end
|
2017-11-23 13:16:14 +00:00
|
|
|
|
|
|
|
describe '#allow_signup?' do
|
|
|
|
it 'returns true' do
|
|
|
|
expect(setting.allow_signup?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if signup is disabled' do
|
|
|
|
allow(setting).to receive(:signup_enabled?).and_return(false)
|
|
|
|
|
|
|
|
expect(setting.allow_signup?).to be_falsey
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if password authentication is disabled for the web interface' do
|
|
|
|
allow(setting).to receive(:password_authentication_enabled_for_web?).and_return(false)
|
|
|
|
|
|
|
|
expect(setting.allow_signup?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
2015-01-08 17:53:35 +00:00
|
|
|
end
|