diff options
Diffstat (limited to 'spec/services/merge_requests/update_assignees_service_spec.rb')
-rw-r--r-- | spec/services/merge_requests/update_assignees_service_spec.rb | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/spec/services/merge_requests/update_assignees_service_spec.rb b/spec/services/merge_requests/update_assignees_service_spec.rb index 076161c9029..3a0b17c2768 100644 --- a/spec/services/merge_requests/update_assignees_service_spec.rb +++ b/spec/services/merge_requests/update_assignees_service_spec.rb @@ -17,6 +17,7 @@ RSpec.describe MergeRequests::UpdateAssigneesService do description: "FYI #{user2.to_reference}", assignee_ids: [user3.id], source_project: project, + target_project: project, author: create(:user)) end @@ -24,6 +25,7 @@ RSpec.describe MergeRequests::UpdateAssigneesService do project.add_maintainer(user) project.add_developer(user2) project.add_developer(user3) + merge_request.errors.clear end let(:service) { described_class.new(project: project, current_user: user, params: opts) } @@ -32,35 +34,53 @@ RSpec.describe MergeRequests::UpdateAssigneesService do describe 'execute' do def update_merge_request service.execute(merge_request) - merge_request.reload + end + + shared_examples 'removing all assignees' do + it 'removes all assignees' do + expect(update_merge_request).to have_attributes(assignees: be_empty, errors: be_none) + end + + it 'enqueues the correct background work' do + expect_next(MergeRequests::HandleAssigneesChangeService, project: project, current_user: user) do |service| + expect(service) + .to receive(:async_execute) + .with(merge_request, [user3], execute_hooks: true) + end + + update_merge_request + end end context 'when the parameters are valid' do context 'when using sentinel values' do - let(:opts) { { assignee_ids: [0] } } + context 'when using assignee_ids' do + let(:opts) { { assignee_ids: [0] } } + + it_behaves_like 'removing all assignees' + end - it 'removes all assignees' do - expect { update_merge_request }.to change(merge_request, :assignees).to([]) + context 'when using assignee_id' do + let(:opts) { { assignee_id: 0 } } + + it_behaves_like 'removing all assignees' end end - context 'the assignee_ids parameter is the empty list' do + context 'when the assignee_ids parameter is the empty list' do let(:opts) { { assignee_ids: [] } } - it 'removes all assignees' do - expect { update_merge_request }.to change(merge_request, :assignees).to([]) - end + it_behaves_like 'removing all assignees' end it 'updates the MR, and queues the more expensive work for later' do expect_next(MergeRequests::HandleAssigneesChangeService, project: project, current_user: user) do |service| expect(service) - .to receive(:async_execute) - .with(merge_request, [user3], execute_hooks: true) + .to receive(:async_execute).with(merge_request, [user3], execute_hooks: true) end expect { update_merge_request } - .to change(merge_request, :assignees).to([user2]) + .to change { merge_request.reload.assignees }.from([user3]).to([user2]) .and change(merge_request, :updated_at) .and change(merge_request, :updated_by).to(user) end @@ -68,7 +88,10 @@ RSpec.describe MergeRequests::UpdateAssigneesService do it 'does not update the assignees if they do not have access' do opts[:assignee_ids] = [create(:user).id] - expect { update_merge_request }.not_to change(merge_request, :assignee_ids) + expect(update_merge_request).to have_attributes( + assignees: [user3], + errors: be_any + ) end it 'is more efficient than using the full update-service' do |