debian-mirror-gitlab/spec/services/issues/build_service_spec.rb

194 lines
6.6 KiB
Ruby
Raw Normal View History

2019-07-31 22:56:46 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
require 'spec_helper.rb'
2020-07-28 23:09:34 +05:30
RSpec.describe Issues::BuildService do
2021-01-03 14:25:43 +05:30
let_it_be(:project) { create(:project, :repository) }
let_it_be(:developer) { create(:user) }
let_it_be(:guest) { create(:user) }
let(:user) { developer }
before_all do
project.add_developer(developer)
project.add_guest(guest)
2017-08-17 22:00:37 +05:30
end
2019-03-13 22:55:13 +05:30
def build_issue(issue_params = {})
described_class.new(project, user, issue_params).execute
end
2017-08-17 22:00:37 +05:30
context 'for a single discussion' do
describe '#execute' do
let(:merge_request) { create(:merge_request, title: "Hello world", source_project: project) }
let(:discussion) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, note: "Almost done").to_discussion }
2019-03-13 22:55:13 +05:30
subject { build_issue(merge_request_to_resolve_discussions_of: merge_request.iid, discussion_to_resolve: discussion.id) }
2017-08-17 22:00:37 +05:30
2019-03-13 22:55:13 +05:30
it 'references the noteable title in the issue title' do
expect(subject.title).to include('Hello world')
2017-08-17 22:00:37 +05:30
end
it 'adds the note content to the description' do
2019-03-13 22:55:13 +05:30
expect(subject.description).to include('Almost done')
2017-08-17 22:00:37 +05:30
end
end
end
context 'for discussions in a merge request' do
let(:merge_request) { create(:merge_request_with_diff_notes, source_project: project) }
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, line_number: 13)
service = described_class.new(project, user, merge_request_to_resolve_discussions_of: merge_request.iid)
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_to_resolve_discussions_of: merge_request.iid) }
it 'mentions the author of the note' do
discussion = create(:diff_note_on_merge_request, author: create(:user, username: 'author')).to_discussion
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"\
2019-07-07 11:18:12 +05:30
" > \n"\
2017-08-17 22:00:37 +05:30
" > > with a blockquote\n"\
2019-07-07 11:18:12 +05:30
" > > > That has a quote\n"\
" > \n"
2017-08-17 22:00:37 +05:30
discussion = create(:diff_note_on_merge_request, note: note_text).to_discussion
expect(service.item_for_discussion(discussion)).to include(note_result)
end
end
describe '#execute' do
2019-03-13 22:55:13 +05:30
let(:base_params) { { merge_request_to_resolve_discussions_of: merge_request.iid } }
2017-08-17 22:00:37 +05:30
2019-03-13 22:55:13 +05:30
context 'without additional params' do
subject { build_issue(base_params) }
it 'has the merge request reference in the title' do
expect(subject.title).to include(merge_request.title)
end
it 'has the reference of the merge request in the description' do
expect(subject.description).to include(merge_request.to_reference)
end
2017-08-17 22:00:37 +05:30
end
2019-03-13 22:55:13 +05:30
it 'uses provided title if title param given' do
issue = build_issue(base_params.merge(title: 'What an issue'))
2017-08-17 22:00:37 +05:30
expect(issue.title).to eq('What an issue')
end
2019-03-13 22:55:13 +05:30
it 'uses provided description if description param given' do
issue = build_issue(base_params.merge(description: 'Fix at your earliest convenience'))
2017-08-17 22:00:37 +05:30
2019-03-13 22:55:13 +05:30
expect(issue.description).to eq('Fix at your earliest convenience')
2017-08-17 22:00:37 +05:30
end
describe 'with multiple discussions' do
let!(:diff_note) { create(:diff_note_on_merge_request, noteable: merge_request, project: merge_request.target_project, line_number: 15) }
it 'mentions all the authors in the description' do
authors = merge_request.resolvable_discussions.map(&:author)
2019-03-13 22:55:13 +05:30
expect(build_issue(base_params).description).to include(*authors.map(&:to_reference))
2017-08-17 22:00:37 +05:30
end
it 'has a link for each unresolved discussion in the description' do
notes = merge_request.resolvable_discussions.map(&:first_note)
links = notes.map { |note| Gitlab::UrlBuilder.build(note) }
2019-03-13 22:55:13 +05:30
expect(build_issue(base_params).description).to include(*links)
2017-08-17 22:00:37 +05:30
end
it 'mentions additional notes' do
create_list(:diff_note_on_merge_request, 2, noteable: merge_request, project: merge_request.target_project, in_reply_to: diff_note)
2019-03-13 22:55:13 +05:30
expect(build_issue(base_params).description).to include('(+2 comments)')
2017-08-17 22:00:37 +05:30
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
2019-03-13 22:55:13 +05:30
issue = build_issue(merge_request_to_resolve_discussions_of: merge_request.iid)
2017-08-17 22:00:37 +05:30
expect(issue.description).to include("Review the conversation in #{merge_request.to_reference}")
end
end
end
describe '#execute' do
2021-01-03 14:25:43 +05:30
context 'as developer' do
it 'builds a new issues with given params' do
milestone = create(:milestone, project: project)
issue = build_issue(milestone_id: milestone.id)
2019-03-13 22:55:13 +05:30
2021-01-03 14:25:43 +05:30
expect(issue.milestone).to eq(milestone)
end
2019-03-13 22:55:13 +05:30
2021-01-03 14:25:43 +05:30
it 'sets milestone to nil if it is not available for the project' do
milestone = create(:milestone, project: create(:project))
issue = build_issue(milestone_id: milestone.id)
2019-03-13 22:55:13 +05:30
2021-01-03 14:25:43 +05:30
expect(issue.milestone).to be_nil
end
2019-03-13 22:55:13 +05:30
end
2020-10-24 23:57:45 +05:30
2021-01-03 14:25:43 +05:30
context 'as guest' do
let(:user) { guest }
2020-10-24 23:57:45 +05:30
2021-01-03 14:25:43 +05:30
it 'cannot set milestone' do
milestone = create(:milestone, project: project)
issue = build_issue(milestone_id: milestone.id)
expect(issue.milestone).to be_nil
2020-10-24 23:57:45 +05:30
end
2021-01-03 14:25:43 +05:30
context 'setting issue type' do
it 'defaults to issue if issue_type not given' do
issue = build_issue
expect(issue).to be_issue
end
it 'sets issue' do
issue = build_issue(issue_type: 'issue')
expect(issue).to be_issue
end
it 'sets incident' do
issue = build_issue(issue_type: 'incident')
2020-10-24 23:57:45 +05:30
2021-01-03 14:25:43 +05:30
expect(issue).to be_incident
end
it 'cannot set invalid type' do
expect do
build_issue(issue_type: 'invalid type')
end.to raise_error(ArgumentError, "'invalid type' is not a valid issue_type")
end
2020-10-24 23:57:45 +05:30
end
end
2017-08-17 22:00:37 +05:30
end
end