diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 11:18:50 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 11:18:50 +0000 |
commit | 8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch) | |
tree | a77e7fe7a93de11213032ed4ab1f33a3db51b738 /spec/services/discussions | |
parent | 00b35af3db1abfe813a778f643dad221aad51fca (diff) | |
download | gitlab-ce-8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781.tar.gz |
Add latest changes from gitlab-org/gitlab@13-1-stable-ee
Diffstat (limited to 'spec/services/discussions')
-rw-r--r-- | spec/services/discussions/resolve_service_spec.rb | 95 |
1 files changed, 75 insertions, 20 deletions
diff --git a/spec/services/discussions/resolve_service_spec.rb b/spec/services/discussions/resolve_service_spec.rb index 2e9a7a293d1..7461934b455 100644 --- a/spec/services/discussions/resolve_service_spec.rb +++ b/spec/services/discussions/resolve_service_spec.rb @@ -4,28 +4,24 @@ require 'spec_helper' describe Discussions::ResolveService do describe '#execute' do - let(:discussion) { create(:diff_note_on_merge_request).to_discussion } - let(:project) { merge_request.project } - let(:merge_request) { discussion.noteable } - let(:user) { create(:user) } - let(:service) { described_class.new(discussion.noteable.project, user, merge_request: merge_request) } - - before do - project.add_maintainer(user) - end + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user, developer_projects: [project]) } + let_it_be(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds, source_project: project) } + let(:discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion } + let(:service) { described_class.new(project, user, one_or_more_discussions: discussion) } it "doesn't resolve discussions the user can't resolve" do expect(discussion).to receive(:can_resolve?).with(user).and_return(false) - service.execute(discussion) + service.execute - expect(discussion.resolved?).to be(false) + expect(discussion).not_to be_resolved end it 'resolves the discussion' do - service.execute(discussion) + service.execute - expect(discussion.resolved?).to be(true) + expect(discussion).to be_resolved end it 'executes the notification service' do @@ -33,24 +29,83 @@ describe Discussions::ResolveService do expect(instance).to receive(:execute).with(discussion.noteable) end - service.execute(discussion) + service.execute + end + + it 'schedules an auto-merge' do + expect(AutoMergeProcessWorker).to receive(:perform_async).with(discussion.noteable.id) + + service.execute + end + + context 'with a project that requires all discussion to be resolved' do + before do + project.update(only_allow_merge_if_all_discussions_are_resolved: true) + end + + after do + project.update(only_allow_merge_if_all_discussions_are_resolved: false) + end + + let_it_be(:other_discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion } + + it 'does not schedule an auto-merge' do + expect(AutoMergeProcessWorker).not_to receive(:perform_async) + + service.execute + end + + it 'schedules an auto-merge' do + expect(AutoMergeProcessWorker).to receive(:perform_async) + + described_class.new(project, user, one_or_more_discussions: [discussion, other_discussion]).execute + end end it 'adds a system note to the discussion' do issue = create(:issue, project: project) expect(SystemNoteService).to receive(:discussion_continued_in_issue).with(discussion, project, user, issue) - service = described_class.new(project, user, merge_request: merge_request, follow_up_issue: issue) - service.execute(discussion) + service = described_class.new(project, user, one_or_more_discussions: discussion, follow_up_issue: issue) + service.execute end it 'can resolve multiple discussions at once' do - other_discussion = create(:diff_note_on_merge_request, noteable: discussion.noteable, project: discussion.noteable.source_project).to_discussion + other_discussion = create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion + service = described_class.new(project, user, one_or_more_discussions: [discussion, other_discussion]) + service.execute - service.execute([discussion, other_discussion]) + expect([discussion, other_discussion]).to all(be_resolved) + end + + it 'raises an argument error if discussions do not belong to the same noteable' do + other_merge_request = create(:merge_request) + other_discussion = create(:diff_note_on_merge_request, + noteable: other_merge_request, + project: other_merge_request.source_project).to_discussion + expect do + described_class.new(project, user, one_or_more_discussions: [discussion, other_discussion]) + end.to raise_error( + ArgumentError, + 'Discussions must be all for the same noteable' + ) + end - expect(discussion.resolved?).to be(true) - expect(other_discussion.resolved?).to be(true) + context 'when discussion is not for a merge request' do + let_it_be(:design) { create(:design, :with_file, issue: create(:issue, project: project)) } + let(:discussion) { create(:diff_note_on_design, noteable: design, project: project).to_discussion } + + it 'does not execute the notification service' do + expect(MergeRequests::ResolvedDiscussionNotificationService).not_to receive(:new) + + service.execute + end + + it 'does not schedule an auto-merge' do + expect(AutoMergeProcessWorker).not_to receive(:perform_async) + + service.execute + end end end end |