1# frozen_string_literal: true
2
3require 'spec_helper'
4
5RSpec.describe Gitlab::Suggestions::CommitMessage do
6  def create_suggestion(file_path, new_line, to_content)
7    position = Gitlab::Diff::Position.new(old_path: file_path,
8                                          new_path: file_path,
9                                          old_line: nil,
10                                          new_line: new_line,
11                                          diff_refs: merge_request.diff_refs)
12
13    diff_note = create(:diff_note_on_merge_request,
14                       noteable: merge_request,
15                       position: position,
16                       project: project)
17
18    create(:suggestion,
19           :content_from_repo,
20           note: diff_note,
21           to_content: to_content)
22  end
23
24  let_it_be(:user) do
25    create(:user, :commit_email, name: 'Test User', username: 'test.user')
26  end
27
28  let_it_be(:project) do
29    create(:project, :repository, path: 'project-1', name: 'Project_1')
30  end
31
32  let_it_be(:merge_request) do
33    create(:merge_request, source_project: project, target_project: project)
34  end
35
36  let_it_be(:suggestion_set) do
37    suggestion1 = create_suggestion('files/ruby/popen.rb', 9, '*** SUGGESTION 1 ***')
38    suggestion2 = create_suggestion('files/ruby/popen.rb', 13, '*** SUGGESTION 2 ***')
39    suggestion3 = create_suggestion('files/ruby/regex.rb', 22, '*** SUGGESTION 3 ***')
40
41    Gitlab::Suggestions::SuggestionSet.new([suggestion1, suggestion2, suggestion3])
42  end
43
44  describe '#message' do
45    before do
46      # Updating the suggestion_commit_message on a project shared across specs
47      # avoids recreating the repository for each spec.
48      project.update!(suggestion_commit_message: message)
49    end
50
51    context 'when a custom commit message is not specified' do
52      let(:expected_message) { 'Apply 3 suggestion(s) to 2 file(s)' }
53
54      context 'and is nil' do
55        let(:message) { nil }
56
57        it 'uses the default commit message' do
58          expect(described_class
59                   .new(user, suggestion_set)
60                   .message).to eq(expected_message)
61        end
62      end
63
64      context 'and is an empty string' do
65        let(:message) { '' }
66
67        it 'uses the default commit message' do
68          expect(described_class
69                   .new(user, suggestion_set)
70                   .message).to eq(expected_message)
71        end
72      end
73    end
74
75    context 'when a custom commit message is specified' do
76      let(:message) { "i'm a project message. a user's custom message takes precedence over me :(" }
77      let(:custom_message) { "hello there! i'm a cool custom commit message." }
78
79      it 'shows the custom commit message' do
80        expect(Gitlab::Suggestions::CommitMessage
81                 .new(user, suggestion_set, custom_message)
82                 .message).to eq(custom_message)
83      end
84    end
85
86    context 'is specified and includes all placeholders' do
87      let(:message) do
88        '*** %{branch_name} %{files_count} %{file_paths} %{project_name} %{project_path} %{user_full_name} %{username} %{suggestions_count} ***'
89      end
90
91      it 'generates a custom commit message' do
92        expect(Gitlab::Suggestions::CommitMessage
93                 .new(user, suggestion_set)
94                 .message).to eq('*** master 2 files/ruby/popen.rb, files/ruby/regex.rb Project_1 project-1 Test User test.user 3 ***')
95      end
96    end
97  end
98end
99