diff --git a/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb b/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb index e62f82f28a7a81e9c153929b5815ea5cee783e4a..a8aae44de7d9037c16b2b7d4cdc7dd1cf53afe41 100644 --- a/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb +++ b/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User adds a merge request to a merge train', :js, feature_category: :merge_trains do +RSpec.describe 'User adds a merge request to a merge train', :sidekiq_inline, :js, feature_category: :merge_trains do let_it_be_with_refind(:project) { create(:project, :repository) } let(:user) { project.owner } @@ -20,99 +20,190 @@ allow(Gitlab::QueryLimiting::Transaction).to receive(:threshold).and_return(200) stub_licensed_features(merge_pipelines: true, merge_trains: true) project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) - merge_request.all_pipelines.first.succeed! - merge_request.update_head_pipeline stub_ci_pipeline_yaml_file(YAML.dump(ci_yaml)) sign_in(user) end - it "shows 'Start merge train' button" do - visit project_merge_request_path(project, merge_request) - - expect(page).to have_button('Merge') - expect(page).to have_content('Add to merge train') - end - - context 'when merge_trains EEP license is not available' do + context 'when no active pipeline' do before do - stub_licensed_features(merge_trains: false) + merge_request.all_pipelines.first.succeed! + merge_request.update_head_pipeline end - it 'does not show Start merge train helper text' do + it "shows 'Merge' button with 'Add to merge train' helper text" do visit project_merge_request_path(project, merge_request) - expect(page).not_to have_content('Start merge train') + expect(page).to have_button('Merge') + expect(page).to have_content('Add to merge train') end - end - context "when user clicks 'Start merge train' button" do - before do - visit project_merge_request_path(project, merge_request) - click_button 'Merge' - wait_for_requests - end + context 'when merge_trains EEP license is not available' do + before do + stub_licensed_features(merge_trains: false) + end + + it 'does not show Add to merge train helper text' do + visit project_merge_request_path(project, merge_request) - it 'informs merge request that auto merge is enabled' do - page.within('.mr-state-widget') do - expect(page).to have_content("Added to the merge train by #{user.name}") - expect(page).to have_content('Source branch will not be deleted.') - expect(page).to have_button('Remove from merge train') + expect(page).not_to have_content('Add to merge train') end end - context 'when pipeline for merge train succeeds', :sidekiq_inline do - let(:project) { create(:project, :repository) } - + context "when user clicks 'Merge' button to add to merge train" do before do visit project_merge_request_path(project, merge_request) - merge_request.merge_train_car.pipeline.builds.map(&:success!) + click_button 'Merge' + wait_for_requests + end + + it 'shows merge request is added to merge train' do + page.within('.mr-state-widget') do + expect(page).to have_content("Added to the merge train by #{user.name}") + expect(page).to have_content('Source branch will not be deleted.') + expect(page).to have_button('Remove from merge train') + end end - it 'displays pipeline control' do - expect(page).to have_selector('[data-testid="mini-pipeline-graph-dropdown"]') + context 'when pipeline for merge train succeeds' do + let(:project) { create(:project, :repository) } + + before do + visit project_merge_request_path(project, merge_request) + merge_request.merge_train_car.pipeline.builds.map(&:success!) + end + + it 'displays the expected content', :js do + expect(page).to have_selector('[data-testid="mini-pipeline-graph-dropdown"]') + + find_by_testid('mini-pipeline-graph-dropdown-toggle').click + page.within '.ci-job-component' do + expect(page).to have_selector('[data-testid="ci-icon"]') + expect(page).not_to have_selector('.retry') + end + + expect(page).to have_content("Merged") + end end - it 'does not allow retry for merge train pipeline', :js do - find_by_testid('mini-pipeline-graph-dropdown-toggle').click - page.within '.ci-job-component' do - expect(page).to have_selector('[data-testid="ci-icon"]') - expect(page).not_to have_selector('.retry') + context "when user clicks 'Remove from merge train' button" do + before do + click_button 'Remove from merge train' + end + + it 'cancels automatic merge' do + page.within('.mr-state-widget') do + expect(page).not_to have_content("Added to the merge train by #{user.name}") + expect(page).to have_button('Merge') + expect(page).to have_content('Add to merge train') + end end end end - context "when user clicks 'Remove from merge train' button" do - let(:project) { create(:project, :repository) } - + context 'when the merge request is not the first queue on the train' do before do - click_button 'Remove from merge train' + create(:merge_request, :on_train, + source_project: project, source_branch: 'signed-commits', + target_project: project, target_branch: 'master') end - it 'cancels automatic merge' do - page.within('.mr-state-widget') do - expect(page).not_to have_content("Added to the merge train by #{user.name}") - expect(page).to have_button('Merge') - expect(page).to have_content('Add to merge train') - end + it "shows 'Merge' button and 'Add to merge train' helper text" do + visit project_merge_request_path(project, merge_request) + + expect(page).to have_button('Merge') + expect(page).to have_content('Add to merge train') end end end - context 'when the merge request is not the first queue on the train' do - let(:project) { create(:project, :repository) } - + context 'with an active pipeline' do before do - create(:merge_request, :on_train, - source_project: project, source_branch: 'signed-commits', - target_project: project, target_branch: 'master') + merge_request.all_pipelines.first.run! + merge_request.update_head_pipeline end - it "shows 'Merge' button and 'Add to merge train' helper text" do + it "shows 'Merge' button with 'Add to merge train when pipeline succeeds' helper text" do visit project_merge_request_path(project, merge_request) expect(page).to have_button('Merge') - expect(page).to have_content('Add to merge train') + expect(page).to have_content('Add to merge train when pipeline succeeds') + end + + context 'when merge_trains EEP license is not available' do + before do + stub_licensed_features(merge_trains: false) + end + + it "does not show 'Add to merge train when pipeline succeeds' helper text" do + visit project_merge_request_path(project, merge_request) + + expect(page).not_to have_content('Add to merge train when pipeline succeeds') + end + end + + context "when user clicks 'Add to merge train when pipeline succeeds' button" do + before do + visit project_merge_request_path(project, merge_request) + click_button 'Set to auto-merge' + wait_for_requests + end + + it 'shows merge request will be added to merge train when pipeline succeeds' do + page.within('.mr-state-widget') do + expect(page).to have_content("Set by #{user.name} to start a merge train when the pipeline succeeds") + expect(page).to have_content('Source branch will not be deleted.') + expect(page).to have_button('Cancel auto-merge') + end + end + + context 'when pipeline succeeds' do + before do + merge_request.head_pipeline.succeed! + visit project_merge_request_path(project, merge_request) + end + + it 'adds the MR to the merge train but not yet merged' do + expect(page).to have_content("Added to the merge train by #{user.name}") + expect(page).to have_content('Source branch will not be deleted.') + expect(page).to have_button('Remove from merge train') + + expect(page).not_to have_content("Merged") + end + + context 'when the merge train pipeline passes' do + let(:project) { create(:project, :repository) } + + it 'merges the MR' do + merge_request.merge_train_car.pipeline.builds.map(&:success!) + + expect(page).to have_selector('[data-testid="mini-pipeline-graph-dropdown"]') + + find_by_testid('mini-pipeline-graph-dropdown-toggle').click + page.within '.ci-job-component' do + expect(page).to have_selector('[data-testid="ci-icon"]') + expect(page).not_to have_selector('.retry') + end + + expect(page).to have_content("Merged") + end + end + end + + context "when user clicks 'Cancel auto-merge' button" do + before do + click_button 'Cancel auto-merge' + end + + it 'cancels automatic merge' do + wait_for_requests + + page.within('.mr-state-widget') do + expect(page).not_to have_content("Set by #{user.name} to start a merge train when the pipeline succeeds") + expect(page).to have_button('Set to auto-merge') + end + end + end end end end