From 1f71b82b21207f896b485dff3fb75af9b4955ce8 Mon Sep 17 00:00:00 2001 From: Jonas Waelter Date: Wed, 10 Feb 2021 08:45:31 +0100 Subject: [PATCH 1/5] Set project visibility level to group visibility level if not allowed --- app/services/projects/create_service.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 08f569662a8442..e3b1fd5f4c0180 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -19,6 +19,8 @@ def execute @project = Project.new(params) + @project.visibility_level = @project.group.visibility_level unless @project.visibility_level_allowed_by_group? + # If a project is newly created it should have shared runners settings # based on its group having it enabled. This is like the "default value" @project.shared_runners_enabled = false if !params.key?(:shared_runners_enabled) && @project.group && @project.group.shared_runners_setting != 'enabled' -- GitLab From 81ff9d25a7bf24730b346f7624730205d685842f Mon Sep 17 00:00:00 2001 From: Jonas Waelter Date: Wed, 10 Feb 2021 09:37:18 +0100 Subject: [PATCH 2/5] Add changelog entry --- .../unreleased/fix-project-import-visibility-error.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelogs/unreleased/fix-project-import-visibility-error.yml diff --git a/changelogs/unreleased/fix-project-import-visibility-error.yml b/changelogs/unreleased/fix-project-import-visibility-error.yml new file mode 100644 index 00000000000000..266ddce039dab7 --- /dev/null +++ b/changelogs/unreleased/fix-project-import-visibility-error.yml @@ -0,0 +1,5 @@ +--- +title: Fix project import error occurring due to default visibility +merge_request: 53827 +author: Jonas Wälter @wwwjon +type: fixed -- GitLab From 7e251a24e8666339c1d5b07a9cbbfd3a7c2cb28a Mon Sep 17 00:00:00 2001 From: Jonas Waelter Date: Mon, 15 Feb 2021 13:41:35 +0100 Subject: [PATCH 3/5] Test behavior of default project visibility level depending on the group visibility level --- spec/services/projects/create_service_spec.rb | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index f7da6f75141f5c..df0974a9a24363 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -354,22 +354,58 @@ def wiki_repo(project) group.add_developer(user) opts.merge!( - visibility: 'private', name: 'test', namespace: group, path: 'foo' ) end - it 'creates a private project' do - project = create_project(user, opts) + context 'in public group' do + before do + group.update(visibility_level: Gitlab::VisibilityLevel::PUBLIC) + end + + it 'creates an internal project' do + project = create_project(user, opts) + + expect(project).to respond_to(:errors) + expect(project.errors.any?).to be(false) + expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL) + expect(project.saved?).to be(true) + expect(project.valid?).to be(true) + end + end + + context 'in internal group' do + before do + group.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + end + + it 'creates an internal project' do + project = create_project(user, opts) - expect(project).to respond_to(:errors) + expect(project).to respond_to(:errors) + expect(project.errors.any?).to be(false) + expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL) + expect(project.saved?).to be(true) + expect(project.valid?).to be(true) + end + end - expect(project.errors.any?).to be(false) - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) - expect(project.saved?).to be(true) - expect(project.valid?).to be(true) + context 'in private group' do + before do + group.update(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + end + + it 'creates a private project' do + project = create_project(user, opts) + + expect(project).to respond_to(:errors) + expect(project.errors.any?).to be(false) + expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) + expect(project.saved?).to be(true) + expect(project.valid?).to be(true) + end end end -- GitLab From 9b2a621f6060de9c98c7a5359492d4302da063de Mon Sep 17 00:00:00 2001 From: Jonas Waelter Date: Mon, 15 Feb 2021 16:27:21 +0100 Subject: [PATCH 4/5] Run static analysis --- spec/services/projects/create_service_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index df0974a9a24363..9a63c95c9b20b7 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -362,7 +362,7 @@ def wiki_repo(project) context 'in public group' do before do - group.update(visibility_level: Gitlab::VisibilityLevel::PUBLIC) + group.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) end it 'creates an internal project' do @@ -378,7 +378,7 @@ def wiki_repo(project) context 'in internal group' do before do - group.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + group.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) end it 'creates an internal project' do @@ -394,7 +394,7 @@ def wiki_repo(project) context 'in private group' do before do - group.update(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + group.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) end it 'creates a private project' do -- GitLab From 958dedd32a904143fdb0cd2c34b55700e114ae65 Mon Sep 17 00:00:00 2001 From: Jonas Waelter Date: Tue, 16 Feb 2021 12:50:40 +0100 Subject: [PATCH 5/5] Refactor tests using RSpec::Parameterized --- spec/services/projects/create_service_spec.rb | 67 ++++++------------- 1 file changed, 21 insertions(+), 46 deletions(-) diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 9a63c95c9b20b7..306d87eefb8778 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -349,62 +349,37 @@ def wiki_repo(project) context 'default visibility level' do let(:group) { create(:group, :private) } - before do - stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL) - group.add_developer(user) + using RSpec::Parameterized::TableSyntax - opts.merge!( - name: 'test', - namespace: group, - path: 'foo' - ) + where(:case_name, :group_level, :project_level) do + [ + ['in public group', Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::INTERNAL], + ['in internal group', Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::INTERNAL], + ['in private group', Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::PRIVATE] + ] end - context 'in public group' do + with_them do before do - group.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - end - - it 'creates an internal project' do - project = create_project(user, opts) - - expect(project).to respond_to(:errors) - expect(project.errors.any?).to be(false) - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL) - expect(project.saved?).to be(true) - expect(project.valid?).to be(true) - end - end + stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL) + group.add_developer(user) + group.update!(visibility_level: group_level) - context 'in internal group' do - before do - group.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - end - - it 'creates an internal project' do - project = create_project(user, opts) - - expect(project).to respond_to(:errors) - expect(project.errors.any?).to be(false) - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL) - expect(project.saved?).to be(true) - expect(project.valid?).to be(true) - end - end - - context 'in private group' do - before do - group.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + opts.merge!( + name: 'test', + namespace: group, + path: 'foo' + ) end - it 'creates a private project' do + it 'creates project with correct visibility level', :aggregate_failures do project = create_project(user, opts) expect(project).to respond_to(:errors) - expect(project.errors.any?).to be(false) - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) - expect(project.saved?).to be(true) - expect(project.valid?).to be(true) + expect(project.errors).to be_blank + expect(project.visibility_level).to eq(project_level) + expect(project).to be_saved + expect(project).to be_valid end end end -- GitLab