diff options
Diffstat (limited to 'spec/services/projects')
18 files changed, 422 insertions, 189 deletions
diff --git a/spec/services/projects/after_rename_service_spec.rb b/spec/services/projects/after_rename_service_spec.rb index f03e1ed0e22..a8db87e48d0 100644 --- a/spec/services/projects/after_rename_service_spec.rb +++ b/spec/services/projects/after_rename_service_spec.rb @@ -243,7 +243,7 @@ RSpec.describe Projects::AfterRenameService do def service_execute # AfterRenameService is called by UpdateService after a successful model.update # the initialization will include before and after paths values - project.update(path: path_after_rename) + project.update!(path: path_after_rename) described_class.new(project, path_before: path_before_rename, full_path_before: full_path_before_rename).execute end diff --git a/spec/services/projects/alerting/notify_service_spec.rb b/spec/services/projects/alerting/notify_service_spec.rb index 77a0e330109..809b12910a1 100644 --- a/spec/services/projects/alerting/notify_service_spec.rb +++ b/spec/services/projects/alerting/notify_service_spec.rb @@ -62,7 +62,7 @@ RSpec.describe Projects::Alerting::NotifyService do title: payload_raw.fetch(:title), started_at: Time.zone.parse(payload_raw.fetch(:start_time)), severity: payload_raw.fetch(:severity), - status: AlertManagement::Alert::STATUSES[:triggered], + status: AlertManagement::Alert.status_value(:triggered), events: 1, hosts: payload_raw.fetch(:hosts), payload: payload_raw.with_indifferent_access, @@ -89,6 +89,7 @@ RSpec.describe Projects::Alerting::NotifyService do it 'creates a system note corresponding to alert creation' do expect { subject }.to change(Note, :count).by(1) + expect(Note.last.note).to include(payload_raw.fetch(:monitoring_tool)) end context 'existing alert with same fingerprint' do @@ -127,23 +128,8 @@ RSpec.describe Projects::Alerting::NotifyService do let(:alert) { create(:alert_management_alert, :with_issue, project: project, fingerprint: fingerprint_sha) } let(:issue) { alert.issue } - context 'state_tracking is enabled' do - before do - stub_feature_flags(track_resource_state_change_events: true) - end - - it { expect { subject }.to change { issue.reload.state }.from('opened').to('closed') } - it { expect { subject }.to change(ResourceStateEvent, :count).by(1) } - end - - context 'state_tracking is disabled' do - before do - stub_feature_flags(track_resource_state_change_events: false) - end - - it { expect { subject }.to change { issue.reload.state }.from('opened').to('closed') } - it { expect { subject }.to change(Note, :count).by(1) } - end + it { expect { subject }.to change { issue.reload.state }.from('opened').to('closed') } + it { expect { subject }.to change(ResourceStateEvent, :count).by(1) } end end end @@ -194,7 +180,7 @@ RSpec.describe Projects::Alerting::NotifyService do title: payload_raw.fetch(:title), started_at: Time.zone.parse(payload_raw.fetch(:start_time)), severity: 'critical', - status: AlertManagement::Alert::STATUSES[:triggered], + status: AlertManagement::Alert.status_value(:triggered), events: 1, hosts: [], payload: payload_raw.with_indifferent_access, @@ -208,15 +194,19 @@ RSpec.describe Projects::Alerting::NotifyService do environment_id: nil ) end + + it 'creates a system note corresponding to alert creation' do + expect { subject }.to change(Note, :count).by(1) + expect(Note.last.note).to include('Generic Alert Endpoint') + end end end context 'with overlong payload' do - let(:payload_raw) do - { - title: 'a' * Gitlab::Utils::DeepSize::DEFAULT_MAX_SIZE, - start_time: starts_at.rfc3339 - } + let(:deep_size_object) { instance_double(Gitlab::Utils::DeepSize, valid?: false) } + + before do + allow(Gitlab::Utils::DeepSize).to receive(:new).and_return(deep_size_object) end it_behaves_like 'does not process incident issues due to error', http_status: :bad_request @@ -230,17 +220,6 @@ RSpec.describe Projects::Alerting::NotifyService do it_behaves_like 'processes incident issues' - context 'with an invalid payload' do - before do - allow(Gitlab::Alerting::NotificationPayloadParser) - .to receive(:call) - .and_raise(Gitlab::Alerting::NotificationPayloadParser::BadPayloadError) - end - - it_behaves_like 'does not process incident issues due to error', http_status: :bad_request - it_behaves_like 'does not an create alert management alert' - end - context 'when alert already exists' do let(:fingerprint_sha) { Digest::SHA1.hexdigest(fingerprint) } let!(:alert) { create(:alert_management_alert, project: project, fingerprint: fingerprint_sha) } diff --git a/spec/services/projects/autocomplete_service_spec.rb b/spec/services/projects/autocomplete_service_spec.rb index 336aa37096a..aff1aa41091 100644 --- a/spec/services/projects/autocomplete_service_spec.rb +++ b/spec/services/projects/autocomplete_service_spec.rb @@ -123,7 +123,7 @@ RSpec.describe Projects::AutocompleteService do let!(:subgroup_milestone) { create(:milestone, group: subgroup) } before do - project.update(namespace: subgroup) + project.update!(namespace: subgroup) end it 'includes project milestones and all acestors milestones' do @@ -138,7 +138,7 @@ RSpec.describe Projects::AutocompleteService do def expect_labels_to_equal(labels, expected_labels) expect(labels.size).to eq(expected_labels.size) extract_title = lambda { |label| label['title'] } - expect(labels.map(&extract_title)).to eq(expected_labels.map(&extract_title)) + expect(labels.map(&extract_title)).to match_array(expected_labels.map(&extract_title)) end let(:user) { create(:user) } diff --git a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb index 2f2474f2681..8ddcb8ce660 100644 --- a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb +++ b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb @@ -12,8 +12,6 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService do before do project.add_maintainer(user) - stub_feature_flags(container_registry_cleanup: true) - stub_container_registry_config(enabled: true) stub_container_registry_tags( diff --git a/spec/services/projects/container_repository/delete_tags_service_spec.rb b/spec/services/projects/container_repository/delete_tags_service_spec.rb index 54375193067..c3ae26b1f05 100644 --- a/spec/services/projects/container_repository/delete_tags_service_spec.rb +++ b/spec/services/projects/container_repository/delete_tags_service_spec.rb @@ -87,59 +87,35 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do RSpec.shared_examples 'supporting fast delete' do context 'when the registry supports fast delete' do - context 'and the feature is enabled' do - before do - allow(repository.client).to receive(:supports_tag_delete?).and_return(true) - end - - it_behaves_like 'calling the correct delete tags service', ::Projects::ContainerRepository::Gitlab::DeleteTagsService - - it_behaves_like 'handling invalid params' + before do + allow(repository.client).to receive(:supports_tag_delete?).and_return(true) + end - context 'with the real service' do - before do - stub_delete_reference_requests(tags) - expect_delete_tag_by_names(tags) - end + it_behaves_like 'calling the correct delete tags service', ::Projects::ContainerRepository::Gitlab::DeleteTagsService - it { is_expected.to include(status: :success) } + it_behaves_like 'handling invalid params' - it_behaves_like 'logging a success response' + context 'with the real service' do + before do + stub_delete_reference_requests(tags) + expect_delete_tag_by_names(tags) end - context 'with a timeout error' do - before do - expect_next_instance_of(::Projects::ContainerRepository::Gitlab::DeleteTagsService) do |delete_service| - expect(delete_service).to receive(:delete_tags).and_raise(::Projects::ContainerRepository::Gitlab::DeleteTagsService::TimeoutError) - end - end - - it { is_expected.to include(status: :error, message: 'timeout while deleting tags') } + it { is_expected.to include(status: :success) } - it_behaves_like 'logging an error response', message: 'timeout while deleting tags' - end + it_behaves_like 'logging a success response' end - context 'and the feature is disabled' do + context 'with a timeout error' do before do - stub_feature_flags(container_registry_fast_tag_delete: false) - end - - it_behaves_like 'calling the correct delete tags service', ::Projects::ContainerRepository::ThirdParty::DeleteTagsService - - it_behaves_like 'handling invalid params' - - context 'with the real service' do - before do - stub_upload('sha256:4435000728ee66e6a80e55637fc22725c256b61de344a2ecdeaac6bdb36e8bc3') - tags.each { |tag| stub_put_manifest_request(tag) } - expect_delete_tag_by_digest('sha256:dummy') + expect_next_instance_of(::Projects::ContainerRepository::Gitlab::DeleteTagsService) do |delete_service| + expect(delete_service).to receive(:delete_tags).and_raise(::Projects::ContainerRepository::Gitlab::DeleteTagsService::TimeoutError) end + end - it { is_expected.to include(status: :success) } + it { is_expected.to include(status: :error, message: 'timeout while deleting tags') } - it_behaves_like 'logging a success response' - end + it_behaves_like 'logging an error response', message: 'timeout while deleting tags' end end end diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index e1df8700795..d959cc87901 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -14,15 +14,30 @@ RSpec.describe Projects::CreateService, '#execute' do } end - it 'creates labels on Project creation if there are templates' do - Label.create(title: "bug", template: true) - project = create_project(user, opts) + context 'with labels' do + subject(:project) { create_project(user, opts) } + + before_all do + Label.create!(title: 'bug', template: true) + end + + it 'creates labels on project creation' do + created_label = project.labels.last - created_label = project.reload.labels.last + expect(created_label.type).to eq('ProjectLabel') + expect(created_label.project_id).to eq(project.id) + expect(created_label.title).to eq('bug') + end + + context 'using gitlab project import' do + before do + opts[:import_type] = 'gitlab_project' + end - expect(created_label.type).to eq('ProjectLabel') - expect(created_label.project_id).to eq(project.id) - expect(created_label.title).to eq('bug') + it 'does not creates labels on project creation' do + expect(project.labels.size).to eq(0) + end + end end context 'user namespace' do @@ -59,10 +74,6 @@ RSpec.describe Projects::CreateService, '#execute' do context "admin creates project with other user's namespace_id" do it 'sets the correct permissions' do admin = create(:admin) - opts = { - name: 'GitLab', - namespace_id: user.namespace.id - } project = create_project(admin, opts) expect(project).to be_persisted @@ -487,18 +498,7 @@ RSpec.describe Projects::CreateService, '#execute' do describe 'create service for the project' do subject(:project) { create_project(user, opts) } - context 'when there is an active instance-level and an active template integration' do - let!(:template_integration) { create(:prometheus_service, :template, api_url: 'https://prometheus.template.com/') } - let!(:instance_integration) { create(:prometheus_service, :instance, api_url: 'https://prometheus.instance.com/') } - - it 'creates a service from the instance-level integration' do - expect(project.services.count).to eq(1) - expect(project.services.first.api_url).to eq(instance_integration.api_url) - expect(project.services.first.inherit_from_id).to eq(instance_integration.id) - end - end - - context 'when there is an active service template' do + context 'with an active service template' do let!(:template_integration) { create(:prometheus_service, :template, api_url: 'https://prometheus.template.com/') } it 'creates a service from the template' do @@ -506,6 +506,60 @@ RSpec.describe Projects::CreateService, '#execute' do expect(project.services.first.api_url).to eq(template_integration.api_url) expect(project.services.first.inherit_from_id).to be_nil end + + context 'with an active instance-level integration' do + let!(:instance_integration) { create(:prometheus_service, :instance, api_url: 'https://prometheus.instance.com/') } + + it 'creates a service from the instance-level integration' do + expect(project.services.count).to eq(1) + expect(project.services.first.api_url).to eq(instance_integration.api_url) + expect(project.services.first.inherit_from_id).to eq(instance_integration.id) + end + + context 'with an active group-level integration' do + let!(:group_integration) { create(:prometheus_service, group: group, project: nil, api_url: 'https://prometheus.group.com/') } + let!(:group) do + create(:group).tap do |group| + group.add_owner(user) + end + end + + let(:opts) do + { + name: 'GitLab', + namespace_id: group.id + } + end + + it 'creates a service from the group-level integration' do + expect(project.services.count).to eq(1) + expect(project.services.first.api_url).to eq(group_integration.api_url) + expect(project.services.first.inherit_from_id).to eq(group_integration.id) + end + + context 'with an active subgroup' do + let!(:subgroup_integration) { create(:prometheus_service, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') } + let!(:subgroup) do + create(:group, parent: group).tap do |subgroup| + subgroup.add_owner(user) + end + end + + let(:opts) do + { + name: 'GitLab', + namespace_id: subgroup.id + } + end + + it 'creates a service from the subgroup-level integration' do + expect(project.services.count).to eq(1) + expect(project.services.first.api_url).to eq(subgroup_integration.api_url) + expect(project.services.first.inherit_from_id).to eq(subgroup_integration.id) + end + end + end + end end context 'when there is an invalid integration' do @@ -739,4 +793,100 @@ RSpec.describe Projects::CreateService, '#execute' do def create_project(user, opts) Projects::CreateService.new(user, opts).execute end + + context 'shared Runners config' do + using RSpec::Parameterized::TableSyntax + + let_it_be(:user) { create :user } + + context 'when parent group is present' do + let_it_be(:group) do + create(:group) do |group| + group.add_owner(user) + end + end + + before do + allow_next_found_instance_of(Group) do |group| + allow(group).to receive(:shared_runners_setting).and_return(shared_runners_setting) + end + + user.refresh_authorized_projects # Ensure cache is warm + end + + context 'default value based on parent group setting' do + where(:shared_runners_setting, :desired_config_for_new_project, :expected_result_for_project) do + 'enabled' | nil | true + 'disabled_with_override' | nil | false + 'disabled_and_unoverridable' | nil | false + end + + with_them do + it 'creates project following the parent config' do + params = opts.merge(namespace_id: group.id) + params = params.merge(shared_runners_enabled: desired_config_for_new_project) unless desired_config_for_new_project.nil? + project = create_project(user, params) + + expect(project).to be_valid + expect(project.shared_runners_enabled).to eq(expected_result_for_project) + end + end + end + + context 'parent group is present and allows desired config' do + where(:shared_runners_setting, :desired_config_for_new_project, :expected_result_for_project) do + 'enabled' | true | true + 'enabled' | false | false + 'disabled_with_override' | false | false + 'disabled_with_override' | true | true + 'disabled_and_unoverridable' | false | false + end + + with_them do + it 'creates project following the parent config' do + params = opts.merge(namespace_id: group.id, shared_runners_enabled: desired_config_for_new_project) + project = create_project(user, params) + + expect(project).to be_valid + expect(project.shared_runners_enabled).to eq(expected_result_for_project) + end + end + end + + context 'parent group is present and disallows desired config' do + where(:shared_runners_setting, :desired_config_for_new_project) do + 'disabled_and_unoverridable' | true + end + + with_them do + it 'does not create project' do + params = opts.merge(namespace_id: group.id, shared_runners_enabled: desired_config_for_new_project) + project = create_project(user, params) + + expect(project.persisted?).to eq(false) + expect(project).to be_invalid + expect(project.errors[:shared_runners_enabled]).to include('cannot be enabled because parent group does not allow it') + end + end + end + end + + context 'parent group is not present' do + where(:desired_config, :expected_result) do + true | true + false | false + nil | true + end + + with_them do + it 'follows desired config' do + opts[:shared_runners_enabled] = desired_config unless desired_config.nil? + project = create_project(user, opts) + + expect(project).to be_valid + expect(project.shared_runners_enabled).to eq(expected_result) + end + end + end + end end diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb index a3711c9e17f..f0f09218b06 100644 --- a/spec/services/projects/destroy_service_spec.rb +++ b/spec/services/projects/destroy_service_spec.rb @@ -72,7 +72,7 @@ RSpec.describe Projects::DestroyService, :aggregate_failures do context 'when project has remote mirrors' do let!(:project) do create(:project, :repository, namespace: user.namespace).tap do |project| - project.remote_mirrors.create(url: 'http://test.com') + project.remote_mirrors.create!(url: 'http://test.com') end end diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb index 166a2dae55b..555f2f5a5e5 100644 --- a/spec/services/projects/fork_service_spec.rb +++ b/spec/services/projects/fork_service_spec.rb @@ -179,7 +179,7 @@ RSpec.describe Projects::ForkService do context "when origin has git depth specified" do before do - @from_project.update(ci_default_git_depth: 42) + @from_project.update!(ci_default_git_depth: 42) end it "inherits default_git_depth from the origin project" do @@ -201,7 +201,7 @@ RSpec.describe Projects::ForkService do context "when project has restricted visibility level" do context "and only one visibility level is restricted" do before do - @from_project.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + @from_project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::INTERNAL]) end diff --git a/spec/services/projects/hashed_storage/base_attachment_service_spec.rb b/spec/services/projects/hashed_storage/base_attachment_service_spec.rb index 969381b8748..86e3fb3820c 100644 --- a/spec/services/projects/hashed_storage/base_attachment_service_spec.rb +++ b/spec/services/projects/hashed_storage/base_attachment_service_spec.rb @@ -45,7 +45,7 @@ RSpec.describe Projects::HashedStorage::BaseAttachmentService do describe '#move_folder!' do context 'when old_path is not a directory' do it 'adds information to the logger and returns true' do - Tempfile.create do |old_path| + Tempfile.create do |old_path| # rubocop:disable Rails/SaveBang new_path = "#{old_path}-new" expect(subject.send(:move_folder!, old_path, new_path)).to be_truthy diff --git a/spec/services/projects/move_access_service_spec.rb b/spec/services/projects/move_access_service_spec.rb index de3871414af..02f80988dd1 100644 --- a/spec/services/projects/move_access_service_spec.rb +++ b/spec/services/projects/move_access_service_spec.rb @@ -17,9 +17,9 @@ RSpec.describe Projects::MoveAccessService do project_with_access.add_maintainer(maintainer_user) project_with_access.add_developer(developer_user) project_with_access.add_reporter(reporter_user) - project_with_access.project_group_links.create(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) - project_with_access.project_group_links.create(group: developer_group, group_access: Gitlab::Access::DEVELOPER) - project_with_access.project_group_links.create(group: reporter_group, group_access: Gitlab::Access::REPORTER) + project_with_access.project_group_links.create!(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) + project_with_access.project_group_links.create!(group: developer_group, group_access: Gitlab::Access::DEVELOPER) + project_with_access.project_group_links.create!(group: reporter_group, group_access: Gitlab::Access::REPORTER) end subject { described_class.new(target_project, user) } @@ -97,7 +97,7 @@ RSpec.describe Projects::MoveAccessService do end it 'does not remove remaining group links' do - target_project.project_group_links.create(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) + target_project.project_group_links.create!(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) subject.execute(project_with_access, options) diff --git a/spec/services/projects/move_project_group_links_service_spec.rb b/spec/services/projects/move_project_group_links_service_spec.rb index 196a8f2b339..6304eded8d3 100644 --- a/spec/services/projects/move_project_group_links_service_spec.rb +++ b/spec/services/projects/move_project_group_links_service_spec.rb @@ -14,9 +14,9 @@ RSpec.describe Projects::MoveProjectGroupLinksService do describe '#execute' do before do - project_with_groups.project_group_links.create(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) - project_with_groups.project_group_links.create(group: developer_group, group_access: Gitlab::Access::DEVELOPER) - project_with_groups.project_group_links.create(group: reporter_group, group_access: Gitlab::Access::REPORTER) + project_with_groups.project_group_links.create!(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) + project_with_groups.project_group_links.create!(group: developer_group, group_access: Gitlab::Access::DEVELOPER) + project_with_groups.project_group_links.create!(group: reporter_group, group_access: Gitlab::Access::REPORTER) end it 'moves the group links from one project to another' do @@ -30,8 +30,8 @@ RSpec.describe Projects::MoveProjectGroupLinksService do end it 'does not move existent group links in the current project' do - target_project.project_group_links.create(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) - target_project.project_group_links.create(group: developer_group, group_access: Gitlab::Access::DEVELOPER) + target_project.project_group_links.create!(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) + target_project.project_group_links.create!(group: developer_group, group_access: Gitlab::Access::DEVELOPER) expect(project_with_groups.project_group_links.count).to eq 3 expect(target_project.project_group_links.count).to eq 2 @@ -55,8 +55,8 @@ RSpec.describe Projects::MoveProjectGroupLinksService do let(:options) { { remove_remaining_elements: false } } it 'does not remove remaining project group links' do - target_project.project_group_links.create(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) - target_project.project_group_links.create(group: developer_group, group_access: Gitlab::Access::DEVELOPER) + target_project.project_group_links.create!(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) + target_project.project_group_links.create!(group: developer_group, group_access: Gitlab::Access::DEVELOPER) subject.execute(project_with_groups, options) diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb index 8a538bc67ed..018bfa8ef61 100644 --- a/spec/services/projects/operations/update_service_spec.rb +++ b/spec/services/projects/operations/update_service_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' RSpec.describe Projects::Operations::UpdateService do + let_it_be_with_refind(:project) { create(:project) } let_it_be(:user) { create(:user) } - let_it_be(:project, refind: true) { create(:project) } let(:result) { subject.execute } @@ -12,7 +12,7 @@ RSpec.describe Projects::Operations::UpdateService do describe '#execute' do context 'alerting setting' do - before do + before_all do project.add_maintainer(user) end @@ -430,5 +430,93 @@ RSpec.describe Projects::Operations::UpdateService do end end end + + context 'tracing setting' do + context 'with valid params' do + let(:params) do + { + tracing_setting_attributes: { + external_url: 'http://some-url.com' + } + } + end + + context 'with an existing setting' do + before do + create(:project_tracing_setting, project: project) + end + + shared_examples 'setting deletion' do + let!(:original_params) { params.deep_dup } + + it 'deletes the setting' do + expect(result[:status]).to eq(:success) + expect(project.reload.tracing_setting).to be_nil + end + + it 'does not modify original params' do + subject.execute + + expect(params).to eq(original_params) + end + end + + it 'updates the setting' do + expect(project.tracing_setting).not_to be_nil + + expect(result[:status]).to eq(:success) + expect(project.reload.tracing_setting.external_url) + .to eq('http://some-url.com') + end + + context 'with missing external_url' do + before do + params[:tracing_setting_attributes].delete(:external_url) + end + + it_behaves_like 'setting deletion' + end + + context 'with empty external_url' do + before do + params[:tracing_setting_attributes][:external_url] = '' + end + + it_behaves_like 'setting deletion' + end + + context 'with blank external_url' do + before do + params[:tracing_setting_attributes][:external_url] = ' ' + end + + it_behaves_like 'setting deletion' + end + end + + context 'without an existing setting' do + it 'creates a setting' do + expect(project.tracing_setting).to be_nil + + expect(result[:status]).to eq(:success) + expect(project.reload.tracing_setting.external_url) + .to eq('http://some-url.com') + end + end + end + + context 'with empty params' do + let(:params) { {} } + + let!(:tracing_setting) do + create(:project_tracing_setting, project: project) + end + + it 'does nothing' do + expect(result[:status]).to eq(:success) + expect(project.reload.tracing_setting).to eq(tracing_setting) + end + end + end end end diff --git a/spec/services/projects/overwrite_project_service_spec.rb b/spec/services/projects/overwrite_project_service_spec.rb index a03746d0271..cc6a863a11d 100644 --- a/spec/services/projects/overwrite_project_service_spec.rb +++ b/spec/services/projects/overwrite_project_service_spec.rb @@ -111,9 +111,9 @@ RSpec.describe Projects::OverwriteProjectService do create_list(:deploy_keys_project, 2, project: project_from) create_list(:notification_setting, 2, source: project_from) create_list(:users_star_project, 2, project: project_from) - project_from.project_group_links.create(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) - project_from.project_group_links.create(group: developer_group, group_access: Gitlab::Access::DEVELOPER) - project_from.project_group_links.create(group: reporter_group, group_access: Gitlab::Access::REPORTER) + project_from.project_group_links.create!(group: maintainer_group, group_access: Gitlab::Access::MAINTAINER) + project_from.project_group_links.create!(group: developer_group, group_access: Gitlab::Access::DEVELOPER) + project_from.project_group_links.create!(group: reporter_group, group_access: Gitlab::Access::REPORTER) project_from.add_maintainer(maintainer_user) project_from.add_developer(developer_user) project_from.add_reporter(reporter_user) diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index a0e83fb4a21..3ae96d7a5ab 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -314,6 +314,37 @@ RSpec.describe Projects::TransferService do end end + context 'shared Runners group level configurations' do + using RSpec::Parameterized::TableSyntax + + where(:project_shared_runners_enabled, :shared_runners_setting, :expected_shared_runners_enabled) do + true | 'disabled_and_unoverridable' | false + false | 'disabled_and_unoverridable' | false + true | 'disabled_with_override' | true + false | 'disabled_with_override' | false + true | 'enabled' | true + false | 'enabled' | false + end + + with_them do + let(:project) { create(:project, :public, :repository, namespace: user.namespace, shared_runners_enabled: project_shared_runners_enabled) } + let(:group) { create(:group) } + + before do + group.add_owner(user) + expect_next_found_instance_of(Group) do |group| + expect(group).to receive(:shared_runners_setting).and_return(shared_runners_setting) + end + + execute_transfer + end + + it 'updates shared runners based on the parent group' do + expect(project.shared_runners_enabled).to eq(expected_shared_runners_enabled) + end + end + end + context 'missing group labels applied to issues or merge requests' do it 'delegates transfer to Labels::TransferService' do group.add_owner(user) diff --git a/spec/services/projects/unlink_fork_service_spec.rb b/spec/services/projects/unlink_fork_service_spec.rb index 073e2e09397..2a8965e62ce 100644 --- a/spec/services/projects/unlink_fork_service_spec.rb +++ b/spec/services/projects/unlink_fork_service_spec.rb @@ -61,7 +61,7 @@ RSpec.describe Projects::UnlinkForkService, :use_clean_rails_memory_store_cachin context 'when the original project was deleted' do it 'does not fail when the original project is deleted' do source = forked_project.forked_from_project - source.destroy + source.destroy! forked_project.reload expect { subject.execute }.not_to raise_error diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index bfb3cbb0131..d3eb84a3137 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -16,8 +16,6 @@ RSpec.describe Projects::UpdatePagesService do subject { described_class.new(project, build) } before do - stub_feature_flags(safezip_use_rubyzip: true) - project.remove_pages end @@ -59,6 +57,28 @@ RSpec.describe Projects::UpdatePagesService do end end + it 'creates pages_deployment and saves it in the metadata' do + expect do + expect(execute).to eq(:success) + end.to change { project.pages_deployments.count }.by(1) + + deployment = project.pages_deployments.last + + expect(deployment.size).to eq(file.size) + expect(deployment.file).to be + expect(project.pages_metadatum.reload.pages_deployment_id).to eq(deployment.id) + end + + it 'does not create deployment when zip_pages_deployments feature flag is disabled' do + stub_feature_flags(zip_pages_deployments: false) + + expect do + expect(execute).to eq(:success) + end.not_to change { project.pages_deployments.count } + + expect(project.pages_metadatum.reload.pages_deployment_id).to be_nil + end + it 'limits pages size' do stub_application_setting(max_pages_size: 1) expect(execute).not_to eq(:success) @@ -75,14 +95,14 @@ RSpec.describe Projects::UpdatePagesService do expect(project.pages_deployed?).to be_truthy expect(Dir.exist?(File.join(project.pages_path))).to be_truthy - project.destroy + project.destroy! expect(Dir.exist?(File.join(project.pages_path))).to be_falsey expect(ProjectPagesMetadatum.find_by_project_id(project)).to be_nil end it 'fails if sha on branch is not latest' do - build.update(ref: 'feature') + build.update!(ref: 'feature') expect(execute).not_to eq(:success) expect(project.pages_metadatum).not_to be_deployed @@ -104,10 +124,6 @@ RSpec.describe Projects::UpdatePagesService do let(:file) { fixture_file_upload("spec/fixtures/pages_non_writeable.zip") } context 'when using RubyZip' do - before do - stub_feature_flags(safezip_use_rubyzip: true) - end - it 'succeeds to extract' do expect(execute).to eq(:success) expect(project.pages_metadatum).to be_deployed @@ -175,7 +191,7 @@ RSpec.describe Projects::UpdatePagesService do it 'fails to remove project pages when no pages is deployed' do expect(PagesWorker).not_to receive(:perform_in) expect(project.pages_deployed?).to be_falsey - project.destroy + project.destroy! end it 'fails if no artifacts' do diff --git a/spec/services/projects/update_remote_mirror_service_spec.rb b/spec/services/projects/update_remote_mirror_service_spec.rb index 1de04888e0a..30530da8013 100644 --- a/spec/services/projects/update_remote_mirror_service_spec.rb +++ b/spec/services/projects/update_remote_mirror_service_spec.rb @@ -68,25 +68,12 @@ RSpec.describe Projects::UpdateRemoteMirrorService do end context "when given URLs containing escaped elements" do - using RSpec::Parameterized::TableSyntax + it_behaves_like "URLs containing escaped elements return expected status" do + let(:result) { execute! } - where(:url, :result_status) do - "https://user:0a%23@test.example.com/project.git" | :success - "https://git.example.com:1%2F%2F@source.developers.google.com/project.git" | :success - CGI.escape("git://localhost:1234/some-path?some-query=some-val\#@example.com/") | :error - CGI.escape(CGI.escape("https://user:0a%23@test.example.com/project.git")) | :error - end - - with_them do before do allow(remote_mirror).to receive(:url).and_return(url) end - - it "returns expected status" do - result = execute! - - expect(result[:status]).to eq(result_status) - end end end @@ -136,54 +123,36 @@ RSpec.describe Projects::UpdateRemoteMirrorService do stub_lfs_setting(enabled: true) end - context 'feature flag enabled' do - before do - stub_feature_flags(push_mirror_syncs_lfs: true) - end - - it 'pushes LFS objects to a HTTP repository' do - expect_next_instance_of(Lfs::PushService) do |service| - expect(service).to receive(:execute) - end - - execute! + it 'pushes LFS objects to a HTTP repository' do + expect_next_instance_of(Lfs::PushService) do |service| + expect(service).to receive(:execute) end - it 'does nothing to an SSH repository' do - remote_mirror.update!(url: 'ssh://example.com') - - expect_any_instance_of(Lfs::PushService).not_to receive(:execute) - - execute! - end + execute! + end - it 'does nothing if LFS is disabled' do - expect(project).to receive(:lfs_enabled?) { false } + it 'does nothing to an SSH repository' do + remote_mirror.update!(url: 'ssh://example.com') - expect_any_instance_of(Lfs::PushService).not_to receive(:execute) + expect_any_instance_of(Lfs::PushService).not_to receive(:execute) - execute! - end + execute! + end - it 'does nothing if non-password auth is specified' do - remote_mirror.update!(auth_method: 'ssh_public_key') + it 'does nothing if LFS is disabled' do + expect(project).to receive(:lfs_enabled?) { false } - expect_any_instance_of(Lfs::PushService).not_to receive(:execute) + expect_any_instance_of(Lfs::PushService).not_to receive(:execute) - execute! - end + execute! end - context 'feature flag disabled' do - before do - stub_feature_flags(push_mirror_syncs_lfs: false) - end + it 'does nothing if non-password auth is specified' do + remote_mirror.update!(auth_method: 'ssh_public_key') - it 'does nothing' do - expect_any_instance_of(Lfs::PushService).not_to receive(:execute) + expect_any_instance_of(Lfs::PushService).not_to receive(:execute) - execute! - end + execute! end end end diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index 7832d727220..989426fde8b 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -141,7 +141,7 @@ RSpec.describe Projects::UpdateService do let(:group) { create(:group, visibility_level: Gitlab::VisibilityLevel::INTERNAL) } before do - project.update(namespace: group, visibility_level: group.visibility_level) + project.update!(namespace: group, visibility_level: group.visibility_level) end it 'does not update project visibility level' do @@ -151,6 +151,32 @@ RSpec.describe Projects::UpdateService do expect(project.reload).to be_internal end end + + context 'when updating shared runners' do + context 'can enable shared runners' do + let(:group) { create(:group, shared_runners_enabled: true) } + let(:project) { create(:project, namespace: group, shared_runners_enabled: false) } + + it 'enables shared runners' do + result = update_project(project, user, shared_runners_enabled: true) + + expect(result).to eq({ status: :success }) + expect(project.reload.shared_runners_enabled).to be_truthy + end + end + + context 'cannot enable shared runners' do + let(:group) { create(:group, :shared_runners_disabled) } + let(:project) { create(:project, namespace: group, shared_runners_enabled: false) } + + it 'does not enable shared runners' do + result = update_project(project, user, shared_runners_enabled: true) + + expect(result).to eq({ status: :error, message: 'Shared runners enabled cannot be enabled because parent group does not allow it' }) + expect(project.reload.shared_runners_enabled).to be_falsey + end + end + end end describe 'when updating project that has forks' do @@ -230,7 +256,7 @@ RSpec.describe Projects::UpdateService do end it 'handles empty project feature attributes' do - project.project_feature.update(wiki_access_level: ProjectFeature::DISABLED) + project.project_feature.update!(wiki_access_level: ProjectFeature::DISABLED) result = update_project(project, user, { name: 'test1' }) @@ -241,7 +267,7 @@ RSpec.describe Projects::UpdateService do context 'when enabling a wiki' do it 'creates a wiki' do - project.project_feature.update(wiki_access_level: ProjectFeature::DISABLED) + project.project_feature.update!(wiki_access_level: ProjectFeature::DISABLED) TestEnv.rm_storage_dir(project.repository_storage, project.wiki.path) result = update_project(project, user, project_feature_attributes: { wiki_access_level: ProjectFeature::ENABLED }) @@ -252,7 +278,7 @@ RSpec.describe Projects::UpdateService do end it 'logs an error and creates a metric when wiki can not be created' do - project.project_feature.update(wiki_access_level: ProjectFeature::DISABLED) + project.project_feature.update!(wiki_access_level: ProjectFeature::DISABLED) expect_any_instance_of(ProjectWiki).to receive(:wiki).and_raise(Wiki::CouldNotCreateWikiError) expect_any_instance_of(described_class).to receive(:log_error).with("Could not create wiki for #{project.full_name}") |