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