diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/namespace_spec.rb | 48 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 47 |
2 files changed, 95 insertions, 0 deletions
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index 60f0dd49ff3..93ad6008aec 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -954,4 +954,52 @@ describe Namespace do expect(group.has_parent?).to be_falsy end end + + describe '#closest_setting' do + using RSpec::Parameterized::TableSyntax + + shared_examples_for 'fetching closest setting' do + let!(:root_namespace) { create(:namespace) } + let!(:namespace) { create(:namespace, parent: root_namespace) } + + let(:setting) { namespace.closest_setting(setting_name) } + + before do + root_namespace.update_attribute(setting_name, root_setting) + namespace.update_attribute(setting_name, child_setting) + end + + it 'returns closest non-nil value' do + expect(setting).to eq(result) + end + end + + context 'when setting is of non-boolean type' do + where(:root_setting, :child_setting, :result) do + 100 | 200 | 200 + 100 | nil | 100 + nil | nil | nil + end + + with_them do + let(:setting_name) { :max_artifacts_size } + + it_behaves_like 'fetching closest setting' + end + end + + context 'when setting is of boolean type' do + where(:root_setting, :child_setting, :result) do + true | false | false + true | nil | true + nil | nil | nil + end + + with_them do + let(:setting_name) { :lfs_enabled } + + it_behaves_like 'fetching closest setting' + end + end + end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index c6d1a17c6cb..d9936a62191 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -5121,6 +5121,53 @@ describe Project do end end + describe '#closest_setting' do + using RSpec::Parameterized::TableSyntax + + shared_examples_for 'fetching closest setting' do + let!(:namespace) { create(:namespace) } + let!(:project) { create(:project, namespace: namespace) } + + let(:setting_name) { :some_setting } + let(:setting) { project.closest_setting(setting_name) } + + before do + allow(project).to receive(:read_attribute).with(setting_name).and_return(project_setting) + allow(namespace).to receive(:closest_setting).with(setting_name).and_return(group_setting) + allow(Gitlab::CurrentSettings).to receive(setting_name).and_return(global_setting) + end + + it 'returns closest non-nil value' do + expect(setting).to eq(result) + end + end + + context 'when setting is of non-boolean type' do + where(:global_setting, :group_setting, :project_setting, :result) do + 100 | 200 | 300 | 300 + 100 | 200 | nil | 200 + 100 | nil | nil | 100 + nil | nil | nil | nil + end + + with_them do + it_behaves_like 'fetching closest setting' + end + end + + context 'when setting is of boolean type' do + where(:global_setting, :group_setting, :project_setting, :result) do + true | true | false | false + true | false | nil | false + true | nil | nil | true + end + + with_them do + it_behaves_like 'fetching closest setting' + end + end + end + def rugged_config rugged_repo(project.repository).config end |