summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb')
-rw-r--r--spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb322
1 files changed, 319 insertions, 3 deletions
diff --git a/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb b/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb
index 65c76aac10c..2407b497249 100644
--- a/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb
+++ b/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb
@@ -15,7 +15,8 @@ RSpec.describe Gitlab::MergeRequests::CommitMessageGenerator do
)
end
- let(:user) { project.creator }
+ let(:current_user) { create(:user, name: 'John Doe', email: 'john.doe@example.com') }
+ let(:author) { project.creator }
let(:source_branch) { 'feature' }
let(:merge_request_description) { "Merge Request Description\nNext line" }
let(:merge_request_title) { 'Bugfix' }
@@ -27,13 +28,13 @@ RSpec.describe Gitlab::MergeRequests::CommitMessageGenerator do
target_project: project,
target_branch: 'master',
source_branch: source_branch,
- author: user,
+ author: author,
description: merge_request_description,
title: merge_request_title
)
end
- subject { described_class.new(merge_request: merge_request) }
+ subject { described_class.new(merge_request: merge_request, current_user: current_user) }
shared_examples_for 'commit message with template' do |message_template_name|
it 'returns nil when template is not set in target project' do
@@ -56,6 +57,19 @@ RSpec.describe Gitlab::MergeRequests::CommitMessageGenerator do
end
end
+ context 'when project has commit template with only the title' do
+ let(:merge_request) do
+ double(:merge_request, title: 'Fixes', target_project: project, to_reference: '!123', metrics: nil, merge_user: nil)
+ end
+
+ let(message_template_name) { '%{title}' }
+
+ it 'evaluates only necessary variables' do
+ expect(result_message).to eq 'Fixes'
+ expect(merge_request).not_to have_received(:to_reference)
+ end
+ end
+
context 'when project has commit template with closed issues' do
let(message_template_name) { <<~MSG.rstrip }
Merge branch '%{source_branch}' into '%{target_branch}'
@@ -274,17 +288,319 @@ RSpec.describe Gitlab::MergeRequests::CommitMessageGenerator do
end
end
end
+
+ context 'when project has merge commit template with approvers' do
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+ let(message_template_name) { <<~MSG.rstrip }
+ Merge branch '%{source_branch}' into '%{target_branch}'
+
+ %{approved_by}
+ MSG
+
+ context 'and mr has no approval' do
+ before do
+ merge_request.approved_by_users = []
+ end
+
+ it 'removes variable and blank line' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge branch 'feature' into 'master'
+ MSG
+ end
+
+ context 'when there is blank line after approved_by' do
+ let(message_template_name) { <<~MSG.rstrip }
+ Merge branch '%{source_branch}' into '%{target_branch}'
+
+ %{approved_by}
+
+ Type: merge
+ MSG
+
+ it 'removes blank line before it' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge branch 'feature' into 'master'
+
+ Type: merge
+ MSG
+ end
+ end
+
+ context 'when there is no blank line after approved_by' do
+ let(message_template_name) { <<~MSG.rstrip }
+ Merge branch '%{source_branch}' into '%{target_branch}'
+
+ %{approved_by}
+ Type: merge
+ MSG
+
+ it 'does not remove blank line before it' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge branch 'feature' into 'master'
+
+ Type: merge
+ MSG
+ end
+ end
+ end
+
+ context 'and mr has one approval' do
+ before do
+ merge_request.approved_by_users = [user1]
+ end
+
+ it 'returns user name and email' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge branch 'feature' into 'master'
+
+ Approved-by: #{user1.name} <#{user1.email}>
+ MSG
+ end
+ end
+
+ context 'and mr has multiple approvals' do
+ before do
+ merge_request.approved_by_users = [user1, user2]
+ end
+
+ it 'returns users names and emails' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge branch 'feature' into 'master'
+
+ Approved-by: #{user1.name} <#{user1.email}>
+ Approved-by: #{user2.name} <#{user2.email}>
+ MSG
+ end
+ end
+ end
+
+ context 'when project has merge commit template with url' do
+ let(message_template_name) do
+ "Merge Request URL is '%{url}'"
+ end
+
+ context "and merge request has url" do
+ it "returns mr url" do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge Request URL is '#{Gitlab::UrlBuilder.build(merge_request)}'
+ MSG
+ end
+ end
+ end
+
+ context 'when project has merge commit template with merged_by' do
+ let(message_template_name) do
+ "Merge Request merged by '%{merged_by}'"
+ end
+
+ context "and current_user is passed" do
+ it "returns user name and email" do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge Request merged by '#{current_user.name} <#{current_user.email}>'
+ MSG
+ end
+ end
+ end
+
+ context 'user' do
+ subject { described_class.new(merge_request: merge_request, current_user: nil) }
+
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+ let(message_template_name) do
+ "Merge Request merged by '%{merged_by}'"
+ end
+
+ context 'comes from metrics' do
+ before do
+ merge_request.metrics.merged_by = user1
+ end
+
+ it "returns user name and email" do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge Request merged by '#{user1.name} <#{user1.email}>'
+ MSG
+ end
+ end
+
+ context 'comes from merge_user' do
+ before do
+ merge_request.merge_user = user2
+ end
+
+ it "returns user name and email" do
+ expect(result_message).to eq <<~MSG.rstrip
+ Merge Request merged by '#{user2.name} <#{user2.email}>'
+ MSG
+ end
+ end
+ end
+
+ context 'when project has commit template with the same variable used twice' do
+ let(message_template_name) { '%{title} %{title}' }
+
+ it 'uses custom template' do
+ expect(result_message).to eq 'Bugfix Bugfix'
+ end
+ end
+
+ context 'when project has commit template without any variable' do
+ let(message_template_name) { 'static text' }
+
+ it 'uses custom template' do
+ expect(result_message).to eq 'static text'
+ end
+ end
+
+ context 'when project has template with all variables' do
+ let(message_template_name) { <<~MSG.rstrip }
+ source_branch:%{source_branch}
+ target_branch:%{target_branch}
+ title:%{title}
+ issues:%{issues}
+ description:%{description}
+ first_commit:%{first_commit}
+ first_multiline_commit:%{first_multiline_commit}
+ url:%{url}
+ approved_by:%{approved_by}
+ merged_by:%{merged_by}
+ co_authored_by:%{co_authored_by}
+ MSG
+
+ it 'uses custom template' do
+ expect(result_message).to eq <<~MSG.rstrip
+ source_branch:feature
+ target_branch:master
+ title:Bugfix
+ issues:
+ description:Merge Request Description
+ Next line
+ first_commit:Feature added
+
+ Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
+ first_multiline_commit:Feature added
+
+ Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
+ url:#{Gitlab::UrlBuilder.build(merge_request)}
+ approved_by:
+ merged_by:#{current_user.name} <#{current_user.commit_email_or_default}>
+ co_authored_by:Co-authored-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
+ MSG
+ end
+ end
+
+ context 'when project has merge commit template with co_authored_by' do
+ let(:source_branch) { 'signed-commits' }
+ let(message_template_name) { <<~MSG.rstrip }
+ %{title}
+
+ %{co_authored_by}
+ MSG
+
+ it 'uses custom template' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Bugfix
+
+ Co-authored-by: Nannie Bernhard <nannie.bernhard@example.com>
+ Co-authored-by: Winnie Hellmann <winnie@gitlab.com>
+ MSG
+ end
+
+ context 'when author and merging user is one of the commit authors' do
+ let(:author) { create(:user, email: 'nannie.bernhard@example.com') }
+
+ before do
+ merge_request.merge_user = author
+ end
+
+ it 'skips his mail in coauthors' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Bugfix
+
+ Co-authored-by: Winnie Hellmann <winnie@gitlab.com>
+ MSG
+ end
+ end
+
+ context 'when author and merging user is the only author of commits' do
+ let(:author) { create(:user, email: 'dmitriy.zaporozhets@gmail.com') }
+ let(:source_branch) { 'feature' }
+
+ before do
+ merge_request.merge_user = author
+ end
+
+ it 'skips coauthors and empty lines before it' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Bugfix
+ MSG
+ end
+ end
+ end
end
describe '#merge_message' do
let(:result_message) { subject.merge_message }
it_behaves_like 'commit message with template', :merge_commit_template
+
+ context 'when project has merge commit template with co_authored_by' do
+ let(:source_branch) { 'signed-commits' }
+ let(:merge_commit_template) { <<~MSG.rstrip }
+ %{title}
+
+ %{co_authored_by}
+ MSG
+
+ context 'when author and merging user are one of the commit authors' do
+ let(:author) { create(:user, email: 'nannie.bernhard@example.com') }
+ let(:merge_user) { create(:user, email: 'winnie@gitlab.com') }
+
+ before do
+ merge_request.merge_user = merge_user
+ end
+
+ it 'skips merging user, but does not skip merge request author' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Bugfix
+
+ Co-authored-by: Nannie Bernhard <nannie.bernhard@example.com>
+ MSG
+ end
+ end
+ end
end
describe '#squash_message' do
let(:result_message) { subject.squash_message }
it_behaves_like 'commit message with template', :squash_commit_template
+
+ context 'when project has merge commit template with co_authored_by' do
+ let(:source_branch) { 'signed-commits' }
+ let(:squash_commit_template) { <<~MSG.rstrip }
+ %{title}
+
+ %{co_authored_by}
+ MSG
+
+ context 'when author and merging user are one of the commit authors' do
+ let(:author) { create(:user, email: 'nannie.bernhard@example.com') }
+ let(:merge_user) { create(:user, email: 'winnie@gitlab.com') }
+
+ before do
+ merge_request.merge_user = merge_user
+ end
+
+ it 'skips merge request author, but does not skip merging user' do
+ expect(result_message).to eq <<~MSG.rstrip
+ Bugfix
+
+ Co-authored-by: Winnie Hellmann <winnie@gitlab.com>
+ MSG
+ end
+ end
+ end
end
end