1123057ab7
When a merge request can only be merged when all discussions are resolved. This feature allows to easily delegate those discussions to a new issue, while marking them as resolved in the merge request. The user is presented with a new issue, prepared with mentions of all unresolved discussions, including the first unresolved note of the discussion, time and link to the note. When the issue is created, the discussions in the merge request will get a system note directing the user to the newly created issue.
130 lines
4.9 KiB
Ruby
130 lines
4.9 KiB
Ruby
require 'spec_helper.rb'
|
|
|
|
describe Issues::BuildService, services: true do
|
|
let(:project) { create(:project) }
|
|
let(:user) { create(:user) }
|
|
|
|
before do
|
|
project.team << [user, :developer]
|
|
end
|
|
|
|
context 'for discussions in a merge request' do
|
|
let(:merge_request) { create(:merge_request_with_diff_notes, source_project: project) }
|
|
let(:issue) { described_class.new(project, user, merge_request_for_resolving_discussions: merge_request).execute }
|
|
|
|
def position_on_line(line_number)
|
|
Gitlab::Diff::Position.new(
|
|
old_path: "files/ruby/popen.rb",
|
|
new_path: "files/ruby/popen.rb",
|
|
old_line: nil,
|
|
new_line: line_number,
|
|
diff_refs: merge_request.diff_refs
|
|
)
|
|
end
|
|
|
|
describe '#items_for_discussions' do
|
|
it 'has an item for each discussion' do
|
|
create(:diff_note_on_merge_request, noteable: merge_request, project: merge_request.source_project, position: position_on_line(13))
|
|
service = described_class.new(project, user, merge_request_for_resolving_discussions: merge_request)
|
|
|
|
service.execute
|
|
|
|
expect(service.items_for_discussions.size).to eq(2)
|
|
end
|
|
end
|
|
|
|
describe '#item_for_discussion' do
|
|
let(:service) { described_class.new(project, user, merge_request_for_resolving_discussions: merge_request) }
|
|
|
|
it 'mentions the author of the note' do
|
|
discussion = Discussion.new([create(:diff_note_on_merge_request, author: create(:user, username: 'author'))])
|
|
expect(service.item_for_discussion(discussion)).to include('@author')
|
|
end
|
|
|
|
it 'wraps the note in a blockquote' do
|
|
note_text = "This is a string\n"\
|
|
">>>\n"\
|
|
"with a blockquote\n"\
|
|
"> That has a quote\n"\
|
|
">>>\n"
|
|
note_result = "This is a string\n"\
|
|
"> with a blockquote\n"\
|
|
"> > That has a quote\n"
|
|
discussion = Discussion.new([create(:diff_note_on_merge_request, note: note_text)])
|
|
expect(service.item_for_discussion(discussion)).to include(">>>\n#{note_result}\n>>>")
|
|
end
|
|
end
|
|
|
|
describe '#execute' do
|
|
it 'has the merge request reference in the title' do
|
|
expect(issue.title).to include(merge_request.title)
|
|
end
|
|
|
|
it 'has the reference of the merge request in the description' do
|
|
expect(issue.description).to include(merge_request.to_reference)
|
|
end
|
|
|
|
it 'does not assign title when a title was given' do
|
|
issue = described_class.new(project, user,
|
|
merge_request_for_resolving_discussions: merge_request,
|
|
title: 'What an issue').execute
|
|
|
|
expect(issue.title).to eq('What an issue')
|
|
end
|
|
|
|
it 'does not assign description when a description was given' do
|
|
issue = described_class.new(project, user,
|
|
merge_request_for_resolving_discussions: merge_request,
|
|
description: 'Fix at your earliest conveignance').execute
|
|
|
|
expect(issue.description).to eq('Fix at your earliest conveignance')
|
|
end
|
|
|
|
describe 'with multiple discussions' do
|
|
before do
|
|
create(:diff_note_on_merge_request, noteable: merge_request, project: merge_request.target_project, position: position_on_line(15))
|
|
end
|
|
|
|
it 'mentions all the authors in the description' do
|
|
authors = merge_request.diff_discussions.map(&:author)
|
|
|
|
expect(issue.description).to include(*authors.map(&:to_reference))
|
|
end
|
|
|
|
it 'has a link for each unresolved discussion in the description' do
|
|
notes = merge_request.diff_discussions.map(&:first_note)
|
|
links = notes.map { |note| Gitlab::UrlBuilder.build(note) }
|
|
|
|
expect(issue.description).to include(*links)
|
|
end
|
|
|
|
it 'mentions additional notes' do
|
|
create_list(:diff_note_on_merge_request, 2, noteable: merge_request, project: merge_request.target_project, position: position_on_line(15))
|
|
|
|
expect(issue.description).to include('(+2 comments)')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'For a merge request without discussions' do
|
|
let(:merge_request) { create(:merge_request, source_project: project) }
|
|
|
|
describe '#execute' do
|
|
it 'mentions the merge request in the description' do
|
|
issue = described_class.new(project, user, merge_request_for_resolving_discussions: merge_request).execute
|
|
|
|
expect(issue.description).to include("Review the conversation in #{merge_request.to_reference}")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#execute' do
|
|
it 'builds a new issues with given params' do
|
|
issue = described_class.new(project, user, title: 'Issue #1', description: 'Issue description').execute
|
|
|
|
expect(issue.title).to eq('Issue #1')
|
|
expect(issue.description).to eq('Issue description')
|
|
end
|
|
end
|
|
end
|