139 lines
5 KiB
Ruby
139 lines
5 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
|
|
let(:milestone) { create(:milestone, project: project) }
|
|
|
|
it 'builds a new issues with given params' do
|
|
issue = described_class.new(
|
|
project,
|
|
user,
|
|
title: 'Issue #1',
|
|
description: 'Issue description',
|
|
milestone_id: milestone.id,
|
|
).execute
|
|
|
|
expect(issue.title).to eq('Issue #1')
|
|
expect(issue.description).to eq('Issue description')
|
|
expect(issue.milestone).to eq(milestone)
|
|
end
|
|
end
|
|
end
|