diff options
Diffstat (limited to 'spec/services/projects/transfer_service_spec.rb')
-rw-r--r-- | spec/services/projects/transfer_service_spec.rb | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index 3171abfb36f..b71677a5e8f 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -7,7 +7,8 @@ RSpec.describe Projects::TransferService do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } - let_it_be(:group_integration) { create(:slack_service, group: group, project: nil, webhook: 'http://group.slack.com') } + let_it_be(:group_integration) { create(:integrations_slack, group: group, project: nil, webhook: 'http://group.slack.com') } + let(:project) { create(:project, :repository, :legacy_storage, namespace: user.namespace) } subject(:execute_transfer) { described_class.new(project, user).execute(group).tap { project.reload } } @@ -121,24 +122,24 @@ RSpec.describe Projects::TransferService do context 'with a project integration' do let_it_be_with_reload(:project) { create(:project, namespace: user.namespace) } - let_it_be(:instance_integration) { create(:slack_service, :instance, webhook: 'http://project.slack.com') } + let_it_be(:instance_integration) { create(:integrations_slack, :instance, webhook: 'http://project.slack.com') } context 'with an inherited integration' do - let_it_be(:project_integration) { create(:slack_service, project: project, webhook: 'http://project.slack.com', inherit_from_id: instance_integration.id) } + let_it_be(:project_integration) { create(:integrations_slack, project: project, webhook: 'http://project.slack.com', inherit_from_id: instance_integration.id) } it 'replaces inherited integrations', :aggregate_failures do execute_transfer - expect(project.slack_service.webhook).to eq(group_integration.webhook) + expect(project.slack_integration.webhook).to eq(group_integration.webhook) expect(Integration.count).to eq(3) end end context 'with a custom integration' do - let_it_be(:project_integration) { create(:slack_service, project: project, webhook: 'http://project.slack.com') } + let_it_be(:project_integration) { create(:integrations_slack, project: project, webhook: 'http://project.slack.com') } it 'does not updates the integrations' do - expect { execute_transfer }.not_to change { project.slack_service.webhook } + expect { execute_transfer }.not_to change { project.slack_integration.webhook } end end end @@ -434,28 +435,74 @@ RSpec.describe Projects::TransferService do end describe 'refreshing project authorizations' do + let(:old_group) { create(:group) } + let!(:project) { create(:project, namespace: old_group) } + let(:member_of_old_group) { create(:user) } let(:group) { create(:group) } - let(:owner) { project.namespace.owner } - let(:group_member) { create(:user) } + let(:member_of_new_group) { create(:user) } before do - group.add_user(owner, GroupMember::MAINTAINER) - group.add_user(group_member, GroupMember::DEVELOPER) + old_group.add_developer(member_of_old_group) + group.add_maintainer(member_of_new_group) + + # Add the executing user as owner in both groups, so that + # transfer can be executed. + old_group.add_owner(user) + group.add_owner(user) end - it 'refreshes the permissions of the old and new namespace' do - execute_transfer + context 'when the feature flag `specialized_worker_for_project_transfer_auth_recalculation` is enabled' do + before do + stub_feature_flags(specialized_worker_for_project_transfer_auth_recalculation: true) + end + + it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do + expect(AuthorizedProjectUpdate::ProjectRecalculateWorker) + .to receive(:perform_async).with(project.id) + + execute_transfer + end + + it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do + user_ids = [user.id, member_of_old_group.id, member_of_new_group.id].map { |id| [id] } + + expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to( + receive(:bulk_perform_in) + .with(1.hour, + user_ids, + batch_delay: 30.seconds, batch_size: 100) + ) - expect(group_member.authorized_projects).to include(project) - expect(owner.authorized_projects).to include(project) + subject + end + + it 'refreshes the permissions of the members of the old and new namespace', :sidekiq_inline do + expect { execute_transfer } + .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false) + .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true) + end end - it 'only schedules a single job for every user' do - expect_next_instance_of(UserProjectAccessChangedService, [owner.id, group_member.id]) do |service| - expect(service).to receive(:execute).once.and_call_original + context 'when the feature flag `specialized_worker_for_project_transfer_auth_recalculation` is disabled' do + before do + stub_feature_flags(specialized_worker_for_project_transfer_auth_recalculation: false) end - execute_transfer + it 'calls UserProjectAccessChangedService to update project authorizations' do + user_ids = [user.id, member_of_old_group.id, member_of_new_group.id] + + expect_next_instance_of(UserProjectAccessChangedService, user_ids) do |service| + expect(service).to receive(:execute) + end + + execute_transfer + end + + it 'refreshes the permissions of the members of the old and new namespace' do + expect { execute_transfer } + .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false) + .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true) + end end end |