diff options
Diffstat (limited to 'spec/features/merge_request/user_squashes_merge_request_spec.rb')
-rw-r--r-- | spec/features/merge_request/user_squashes_merge_request_spec.rb | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/spec/features/merge_request/user_squashes_merge_request_spec.rb b/spec/features/merge_request/user_squashes_merge_request_spec.rb new file mode 100644 index 00000000000..84964bd0637 --- /dev/null +++ b/spec/features/merge_request/user_squashes_merge_request_spec.rb @@ -0,0 +1,149 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'User squashes a merge request', :js do + let(:user) { create(:user) } + let(:project) { create(:project, :repository) } + let(:source_branch) { 'csv' } + let(:protected_source_branch) { false } + + let!(:original_head) { project.repository.commit('master') } + + shared_examples 'squash' do + it 'squashes the commits into a single commit, and adds a merge commit', :sidekiq_might_not_need_inline do + expect(page).to have_content('Merged') + + latest_master_commits = project.repository.commits_between(original_head.sha, 'master').map(&:raw) + + squash_commit = an_object_having_attributes(sha: a_string_matching(/\h{40}/), + message: a_string_starting_with(project.merge_requests.first.default_squash_commit_message), + author_name: user.name, + committer_name: user.name) + + merge_commit = an_object_having_attributes(sha: a_string_matching(/\h{40}/), + message: a_string_starting_with("Merge branch 'csv' into 'master'"), + author_name: user.name, + committer_name: user.name) + + expect(project.repository).not_to be_merged_to_root_ref(source_branch) + expect(latest_master_commits).to match([squash_commit, merge_commit]) + end + end + + shared_examples 'no squash' do + it 'accepts the merge request without squashing', :sidekiq_might_not_need_inline do + expect(page).to have_content('Merged') + expect(project.repository).to be_merged_to_root_ref(source_branch) + end + end + + def accept_mr + expect(page).to have_button('Merge') + + uncheck 'Delete source branch' unless protected_source_branch + click_on 'Merge' + end + + before do + # Prevent source branch from being removed so we can use be_merged_to_root_ref + # method to check if squash was performed or not + allow_next_instance_of(MergeRequest) do |instance| + allow(instance).to receive(:force_remove_source_branch?).and_return(false) + end + project.add_maintainer(user) + + sign_in user + end + + context 'when the MR has only one commit' do + let(:source_branch) { 'master' } + let(:target_branch) { 'branch-merged' } + let(:protected_source_branch) { true } + let(:source_sha) { project.commit(source_branch).sha } + let(:target_sha) { project.commit(target_branch).sha } + + before do + merge_request = create(:merge_request, source_project: project, target_project: project, source_branch: source_branch, target_branch: target_branch, squash: true) + + visit project_merge_request_path(project, merge_request) + end + + it 'accepts the merge request without issuing a squash request', :sidekiq_inline do + expect_next_instance_of(Gitlab::GitalyClient::OperationService) do |instance| + expect(instance).not_to receive(:user_squash) + end + + expect(project.repository.ancestor?(source_branch, target_branch)).to be_falsey + expect(page).not_to have_field('squash') + + accept_mr + + expect(page).to have_content('Merged') + + latest_target_commits = project.repository.commits_between(source_sha, target_sha).map(&:raw) + + expect(latest_target_commits.count).to eq(1) + expect(project.repository.ancestor?(source_branch, target_branch)).to be_truthy + end + end + + context 'when squash is enabled on merge request creation', :sidekiq_might_not_need_inline do + before do + visit project_new_merge_request_path(project, merge_request: { target_branch: 'master', source_branch: source_branch }) + check 'merge_request[squash]' + click_on 'Submit merge request' + wait_for_requests + end + + it 'shows the squash checkbox as checked' do + expect(page).to have_checked_field('squash') + end + + context 'when accepting with squash checked' do + before do + accept_mr + end + + include_examples 'squash' + end + + context 'when accepting and unchecking squash' do + before do + uncheck 'squash' + accept_mr + end + + include_examples 'no squash' + end + end + + context 'when squash is not enabled on merge request creation', :sidekiq_might_not_need_inline do + before do + visit project_new_merge_request_path(project, merge_request: { target_branch: 'master', source_branch: source_branch }) + click_on 'Submit merge request' + wait_for_requests + end + + it 'shows the squash checkbox as unchecked' do + expect(page).to have_unchecked_field('squash') + end + + context 'when accepting and checking squash' do + before do + check 'squash' + accept_mr + end + + include_examples 'squash' + end + + context 'when accepting with squash unchecked' do + before do + accept_mr + end + + include_examples 'no squash' + end + end +end |