summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/suggestions/commit_message_spec.rb
blob: 965960f0c3ef29fffead8c0a2f3e0d3b747c6e80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Suggestions::CommitMessage do
  def create_suggestion(file_path, new_line, to_content)
    position = Gitlab::Diff::Position.new(old_path: file_path,
                                          new_path: file_path,
                                          old_line: nil,
                                          new_line: new_line,
                                          diff_refs: merge_request.diff_refs)

    diff_note = create(:diff_note_on_merge_request,
                       noteable: merge_request,
                       position: position,
                       project: project)

    create(:suggestion,
           :content_from_repo,
           note: diff_note,
           to_content: to_content)
  end

  let_it_be(:user) do
    create(:user, :commit_email, name: 'Test User', username: 'test.user')
  end

  let_it_be(:project) do
    create(:project, :repository, path: 'project-1', name: 'Project_1')
  end

  let_it_be(:merge_request) do
    create(:merge_request, source_project: project, target_project: project)
  end

  let_it_be(:suggestion_set) do
    suggestion1 = create_suggestion('files/ruby/popen.rb', 9, '*** SUGGESTION 1 ***')
    suggestion2 = create_suggestion('files/ruby/popen.rb', 13, '*** SUGGESTION 2 ***')
    suggestion3 = create_suggestion('files/ruby/regex.rb', 22, '*** SUGGESTION 3 ***')

    Gitlab::Suggestions::SuggestionSet.new([suggestion1, suggestion2, suggestion3])
  end

  describe '#message' do
    before do
      # Updating the suggestion_commit_message on a project shared across specs
      # avoids recreating the repository for each spec.
      project.update!(suggestion_commit_message: message)
    end

    context 'when a custom commit message is not specified' do
      let(:expected_message) { 'Apply 3 suggestion(s) to 2 file(s)' }

      context 'and is nil' do
        let(:message) { nil }

        it 'uses the default commit message' do
          expect(described_class
                   .new(user, suggestion_set)
                   .message).to eq(expected_message)
        end
      end

      context 'and is an empty string' do
        let(:message) { '' }

        it 'uses the default commit message' do
          expect(described_class
                   .new(user, suggestion_set)
                   .message).to eq(expected_message)
        end
      end
    end

    context 'when a custom commit message is specified' do
      let(:message) { "i'm a project message. a user's custom message takes precedence over me :(" }
      let(:custom_message) { "hello there! i'm a cool custom commit message." }

      it 'shows the custom commit message' do
        expect(Gitlab::Suggestions::CommitMessage
                 .new(user, suggestion_set, custom_message)
                 .message).to eq(custom_message)
      end
    end

    context 'is specified and includes all placeholders' do
      let(:message) do
        '*** %{branch_name} %{files_count} %{file_paths} %{project_name} %{project_path} %{user_full_name} %{username} %{suggestions_count} ***'
      end

      it 'generates a custom commit message' do
        expect(Gitlab::Suggestions::CommitMessage
                 .new(user, suggestion_set)
                 .message).to eq('*** master 2 files/ruby/popen.rb, files/ruby/regex.rb Project_1 project-1 Test User test.user 3 ***')
      end
    end
  end
end