Welcome to mirror list, hosted at ThFree Co, Russian Federation.

commit_message_spec.rb « suggestions « gitlab « lib « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: dcadc20671559342b5303b11342eb83fb49beb15 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Suggestions::CommitMessage do
  include ProjectForksHelper
  using RSpec::Parameterized::TableSyntax

  def create_suggestion(merge_request, 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(:forked_project) { fork_project(project, nil, repository: true) }

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

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

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

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

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

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

  describe '#message' do
    where(:suggestion_set) { [ref(:suggestion_set_same_project), ref(:suggestion_set_forked_project)] }

    with_them 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)
        forked_project.update!(suggestion_commit_message: fork_message)
      end

      let(:fork_message) { nil }

      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

        context 'when a custom commit message is specified for forked project' do
          let(:message) { nil }
          let(:fork_message) { "I'm a sad message that will not be used :(" }

          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

        context 'when a custom commit message is specified for forked project' do
          let(:fork_message) { "I'm a sad message that will not be used :(" }

          it 'uses the target project 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
  end
end