Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-01-30 15:07:29 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-01-30 15:07:29 +0300
commit7cf8c080eda823e7e2577eeed1f96e168c37ee8f (patch)
tree25777ab1b8883dd4cff80005a2edc5e385e16714 /spec/services
parent4381702a8509383c7158a4d89a0ed187532604f2 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services')
-rw-r--r--spec/services/authorized_project_update/project_access_changed_service_spec.rb11
-rw-r--r--spec/services/ci/runners/register_runner_service_spec.rb1
-rw-r--r--spec/services/export_csv/base_service_spec.rb31
-rw-r--r--spec/services/groups/group_links/destroy_service_spec.rb4
-rw-r--r--spec/services/issues/export_csv_service_spec.rb2
-rw-r--r--spec/services/members/destroy_service_spec.rb87
-rw-r--r--spec/services/merge_requests/export_csv_service_spec.rb18
-rw-r--r--spec/services/user_project_access_changed_service_spec.rb24
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)