diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-30 15:07:29 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-30 15:07:29 +0300 |
commit | 7cf8c080eda823e7e2577eeed1f96e168c37ee8f (patch) | |
tree | 25777ab1b8883dd4cff80005a2edc5e385e16714 /spec/services | |
parent | 4381702a8509383c7158a4d89a0ed187532604f2 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services')
8 files changed, 123 insertions, 55 deletions
diff --git a/spec/services/authorized_project_update/project_access_changed_service_spec.rb b/spec/services/authorized_project_update/project_access_changed_service_spec.rb index 11621055a47..da428bece20 100644 --- a/spec/services/authorized_project_update/project_access_changed_service_spec.rb +++ b/spec/services/authorized_project_update/project_access_changed_service_spec.rb @@ -4,18 +4,11 @@ require 'spec_helper' RSpec.describe AuthorizedProjectUpdate::ProjectAccessChangedService do describe '#execute' do - it 'schedules the project IDs' do - expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to receive(:bulk_perform_and_wait) - .with([[1], [2]]) - - described_class.new([1, 2]).execute - end - - it 'permits non-blocking operation' do + it 'executes projects_authorizations refresh' do expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to receive(:bulk_perform_async) .with([[1], [2]]) - described_class.new([1, 2]).execute(blocking: false) + described_class.new([1, 2]).execute end end end diff --git a/spec/services/ci/runners/register_runner_service_spec.rb b/spec/services/ci/runners/register_runner_service_spec.rb index 47d399cb19a..c67040e45eb 100644 --- a/spec/services/ci/runners/register_runner_service_spec.rb +++ b/spec/services/ci/runners/register_runner_service_spec.rb @@ -47,6 +47,7 @@ RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_categor expect(runner.run_untagged).to be true expect(runner.active).to be true expect(runner.token).not_to eq(registration_token) + expect(runner.token).not_to start_with(::Ci::Runner::CREATED_RUNNER_TOKEN_PREFIX) expect(runner).to be_instance_type end diff --git a/spec/services/export_csv/base_service_spec.rb b/spec/services/export_csv/base_service_spec.rb new file mode 100644 index 00000000000..e2b4d4829af --- /dev/null +++ b/spec/services/export_csv/base_service_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ExportCsv::BaseService, feature_category: :importers do + let_it_be(:issue) { create(:issue) } + let_it_be(:relation) { Issue.all } + let_it_be(:resource_parent) { issue.project } + + subject { described_class.new(relation, resource_parent) } + + describe '#email' do + it 'raises NotImplementedError' do + user = create(:user) + + expect { subject.email(user) }.to raise_error(NotImplementedError) + end + end + + describe '#header_to_value_hash' do + it 'raises NotImplementedError' do + expect { subject.send(:header_to_value_hash) }.to raise_error(NotImplementedError) + end + end + + describe '#associations_to_preload' do + it 'return []' do + expect(subject.send(:associations_to_preload)).to eq([]) + end + end +end diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb index 03de7175edd..a570c28cf8b 100644 --- a/spec/services/groups/group_links/destroy_service_spec.rb +++ b/spec/services/groups/group_links/destroy_service_spec.rb @@ -70,8 +70,8 @@ RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do it 'updates project authorization once per group' do expect(GroupGroupLink).to receive(:delete).and_call_original - expect(group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true, blocking: false).once - expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true, blocking: false).once + expect(group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once + expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once subject.execute(links) end diff --git a/spec/services/issues/export_csv_service_spec.rb b/spec/services/issues/export_csv_service_spec.rb index d3359447fd8..f5ff4ed3f9e 100644 --- a/spec/services/issues/export_csv_service_spec.rb +++ b/spec/services/issues/export_csv_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::ExportCsvService, :with_license do +RSpec.describe Issues::ExportCsvService, :with_license, feature_category: :importers do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, :public, group: group) } diff --git a/spec/services/members/destroy_service_spec.rb b/spec/services/members/destroy_service_spec.rb index d8a8d5881bf..9570aa1b612 100644 --- a/spec/services/members/destroy_service_spec.rb +++ b/spec/services/members/destroy_service_spec.rb @@ -111,26 +111,6 @@ RSpec.describe Members::DestroyService, feature_category: :subgroups do subject(:destroy_member) { service_object.execute(member_to_delete, **opts) } - shared_examples_for 'deletes the member without using a lock' do - it 'does not try to perform the delete within a lock' do - # `UpdateHighestRole` concern also uses locks to peform work - # whenever a Member is committed, so that needs to be accounted for. - lock_key_for_update_highest_role = "update_highest_role:#{member_to_delete.user_id}" - expect(Gitlab::ExclusiveLease) - .to receive(:new).with(lock_key_for_update_highest_role, timeout: 10.minutes.to_i).and_call_original - - # We do not use any locks for member deletion process. - expect(Gitlab::ExclusiveLease) - .not_to receive(:new).with(lock_key, timeout: timeout) - - destroy_member - end - - it 'destroys the membership' do - expect { destroy_member }.to change { entity.members.count }.by(-1) - end - end - context 'for group members' do before do group.add_owner(current_user) @@ -171,13 +151,70 @@ RSpec.describe Members::DestroyService, feature_category: :subgroups do context 'deleting group members that are not owners' do let!(:member_to_delete) { group.add_developer(member_user) } - it_behaves_like 'deletes the member without using a lock' do - let(:entity) { group } + it 'does not try to perform the deletion of the member within a lock' do + # We need to account for other places involved in the Member deletion process that + # uses ExclusiveLease. + + # 1. `UpdateHighestRole` concern uses locks to peform work + # whenever a Member is committed, so that needs to be accounted for. + lock_key_for_update_highest_role = "update_highest_role:#{member_to_delete.user_id}" + + expect(Gitlab::ExclusiveLease) + .to receive(:new).with(lock_key_for_update_highest_role, timeout: 10.minutes.to_i).and_call_original + + # 2. `Users::RefreshAuthorizedProjectsService` also uses locks to perform work, + # whenever a user's authorizations has to be refreshed, so that needs to be accounted for as well. + lock_key_for_authorizations_refresh = "refresh_authorized_projects:#{member_to_delete.user_id}" + + expect(Gitlab::ExclusiveLease) + .to receive(:new).with(lock_key_for_authorizations_refresh, timeout: 1.minute.to_i).and_call_original + + # We do not use any locks for the member deletion process, from within this service. + expect(Gitlab::ExclusiveLease) + .not_to receive(:new).with(lock_key, timeout: timeout) + + destroy_member + end + + it 'destroys the membership' do + expect { destroy_member }.to change { group.members.count }.by(-1) end end end context 'for project members' do + shared_examples_for 'deletes the project member without using a lock' do + it 'does not try to perform the deletion of a project member within a lock' do + # We need to account for other places involved in the Member deletion process that + # uses ExclusiveLease. + + # 1. `UpdateHighestRole` concern uses locks to peform work + # whenever a Member is committed, so that needs to be accounted for. + lock_key_for_update_highest_role = "update_highest_role:#{member_to_delete.user_id}" + + expect(Gitlab::ExclusiveLease) + .to receive(:new).with(lock_key_for_update_highest_role, timeout: 10.minutes.to_i).and_call_original + + # 2. `AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker` also uses locks to perform work, + # whenever a user's authorizations has to be refreshed, so that needs to be accounted for as well. + lock_key_for_authorizations_refresh = + "authorized_project_update/project_recalculate_worker/projects/#{member_to_delete.project.id}" + + expect(Gitlab::ExclusiveLease) + .to receive(:new).with(lock_key_for_authorizations_refresh, timeout: 10.seconds).and_call_original + + # We do not use any locks for the member deletion process, from within this service. + expect(Gitlab::ExclusiveLease) + .not_to receive(:new).with(lock_key, timeout: timeout) + + destroy_member + end + + it 'destroys the membership' do + expect { destroy_member }.to change { entity.members.count }.by(-1) + end + end + before do group_project.add_owner(current_user) end @@ -186,16 +223,16 @@ RSpec.describe Members::DestroyService, feature_category: :subgroups do context 'deleting project owners' do let!(:member_to_delete) { entity.add_owner(member_user) } - it_behaves_like 'deletes the member without using a lock' do + it_behaves_like 'deletes the project member without using a lock' do let(:entity) { group_project } end end end - context 'deleting project memebrs that are not owners' do + context 'deleting project members that are not owners' do let!(:member_to_delete) { group_project.add_developer(member_user) } - it_behaves_like 'deletes the member without using a lock' do + it_behaves_like 'deletes the project member without using a lock' do let(:entity) { group_project } end end diff --git a/spec/services/merge_requests/export_csv_service_spec.rb b/spec/services/merge_requests/export_csv_service_spec.rb index 97217e979a5..2f0036845e7 100644 --- a/spec/services/merge_requests/export_csv_service_spec.rb +++ b/spec/services/merge_requests/export_csv_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ExportCsvService do +RSpec.describe MergeRequests::ExportCsvService, feature_category: :importers do let_it_be(:merge_request) { create(:merge_request) } let(:csv) { CSV.parse(subject.csv_data, headers: true).first } @@ -113,5 +113,21 @@ RSpec.describe MergeRequests::ExportCsvService do end end end + + describe '#email' do + let_it_be(:user) { create(:user) } + + it 'emails csv' do + expect { subject.email(user) }.to change { ActionMailer::Base.deliveries.count } + end + + it 'renders with a target filesize' do + expect_next_instance_of(CsvBuilder) do |csv_builder| + expect(csv_builder).to receive(:render).with(described_class::TARGET_FILESIZE).once + end + + subject.email(user) + end + end end end diff --git a/spec/services/user_project_access_changed_service_spec.rb b/spec/services/user_project_access_changed_service_spec.rb index be4f205afb5..9aa7dcf09bc 100644 --- a/spec/services/user_project_access_changed_service_spec.rb +++ b/spec/services/user_project_access_changed_service_spec.rb @@ -4,18 +4,11 @@ require 'spec_helper' RSpec.describe UserProjectAccessChangedService do describe '#execute' do - it 'schedules the user IDs' do - expect(AuthorizedProjectsWorker).to receive(:bulk_perform_and_wait) - .with([[1], [2]]) - - described_class.new([1, 2]).execute - end - - it 'permits non-blocking operation' do + it 'permits high-priority operation' do expect(AuthorizedProjectsWorker).to receive(:bulk_perform_async) .with([[1], [2]]) - described_class.new([1, 2]).execute(blocking: false) + described_class.new([1, 2]).execute end it 'permits low-priority operation' do @@ -27,8 +20,7 @@ RSpec.describe UserProjectAccessChangedService do ) ) - described_class.new([1, 2]).execute(blocking: false, - priority: described_class::LOW_PRIORITY) + described_class.new([1, 2]).execute(priority: described_class::LOW_PRIORITY) end it 'permits medium-priority operation' do @@ -40,14 +32,12 @@ RSpec.describe UserProjectAccessChangedService do ) ) - described_class.new([1, 2]).execute(blocking: false, - priority: described_class::MEDIUM_PRIORITY) + described_class.new([1, 2]).execute(priority: described_class::MEDIUM_PRIORITY) end it 'sets the current caller_id as related_class in the context of all the enqueued jobs' do Gitlab::ApplicationContext.with_context(caller_id: 'Foo') do - described_class.new([1, 2]).execute(blocking: false, - priority: described_class::LOW_PRIORITY) + described_class.new([1, 2]).execute(priority: described_class::LOW_PRIORITY) end expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker.jobs).to all( @@ -60,7 +50,7 @@ RSpec.describe UserProjectAccessChangedService do let(:service) { UserProjectAccessChangedService.new([1, 2]) } before do - expect(AuthorizedProjectsWorker).to receive(:bulk_perform_and_wait) + expect(AuthorizedProjectsWorker).to receive(:bulk_perform_async) .with([[1], [2]]) .and_return(10) end @@ -79,7 +69,7 @@ RSpec.describe UserProjectAccessChangedService do service = UserProjectAccessChangedService.new([1, 2, 3, 4, 5]) - allow(AuthorizedProjectsWorker).to receive(:bulk_perform_and_wait) + allow(AuthorizedProjectsWorker).to receive(:bulk_perform_async) .with([[1], [2], [3], [4], [5]]) .and_return(10) |