summaryrefslogtreecommitdiff
path: root/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb')
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb180
1 files changed, 180 insertions, 0 deletions
diff --git a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
new file mode 100644
index 00000000000..fb73ab05f87
--- /dev/null
+++ b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
@@ -0,0 +1,180 @@
+require 'rails_helper'
+
+describe 'Merge request > User selects branches for new MR', :js do
+ let(:project) { create(:project, :public, :repository) }
+ let(:user) { project.creator }
+
+ before do
+ project.add_master(user)
+ sign_in(user)
+ end
+
+ it 'selects the source branch sha when a tag with the same name exists' do
+ visit project_merge_requests_path(project)
+
+ page.within '.content' do
+ click_link 'New merge request'
+ end
+ expect(page).to have_content('Source branch')
+ expect(page).to have_content('Target branch')
+
+ first('.js-source-branch').click
+ find('.dropdown-source-branch .dropdown-content a', match: :first).click
+
+ expect(page).to have_content "b83d6e3"
+ end
+
+ it 'selects the target branch sha when a tag with the same name exists' do
+ visit project_merge_requests_path(project)
+
+ page.within '.content' do
+ click_link 'New merge request'
+ end
+
+ expect(page).to have_content('Source branch')
+ expect(page).to have_content('Target branch')
+
+ first('.js-target-branch').click
+ find('.dropdown-target-branch .dropdown-content a', text: 'v1.1.0', match: :first).click
+
+ expect(page).to have_content "b83d6e3"
+ end
+
+ it 'generates a diff for an orphaned branch' do
+ visit project_merge_requests_path(project)
+
+ page.within '.content' do
+ click_link 'New merge request'
+ end
+ expect(page).to have_content('Source branch')
+ expect(page).to have_content('Target branch')
+
+ find('.js-source-branch', match: :first).click
+ find('.dropdown-source-branch .dropdown-content a', text: 'orphaned-branch', match: :first).click
+
+ click_button "Compare branches"
+ click_link "Changes"
+
+ expect(page).to have_content "README.md"
+ expect(page).to have_content "wm.png"
+
+ fill_in "merge_request_title", with: "Orphaned MR test"
+ click_button "Submit merge request"
+
+ click_link "Check out branch"
+
+ expect(page).to have_content 'git checkout -b orphaned-branch origin/orphaned-branch'
+ end
+
+ it 'allows filtering multiple dropdowns' do
+ visit project_new_merge_request_path(project)
+
+ first('.js-source-branch').click
+
+ input = find('.dropdown-source-branch .dropdown-input-field')
+ input.click
+ input.send_keys('orphaned-branch')
+
+ find('.dropdown-source-branch .dropdown-content li', match: :first)
+ source_items = all('.dropdown-source-branch .dropdown-content li')
+
+ expect(source_items.count).to eq(1)
+
+ first('.js-target-branch').click
+
+ find('.dropdown-target-branch .dropdown-content li', match: :first)
+ target_items = all('.dropdown-target-branch .dropdown-content li')
+
+ expect(target_items.count).to be > 1
+ end
+
+ context 'when target project cannot be viewed by the current user' do
+ it 'does not leak the private project name & namespace' do
+ private_project = create(:project, :private, :repository)
+
+ visit project_new_merge_request_path(project, merge_request: { target_project_id: private_project.id })
+
+ expect(page).not_to have_content private_project.full_path
+ expect(page).to have_content project.full_path
+ end
+ end
+
+ context 'when source project cannot be viewed by the current user' do
+ it 'does not leak the private project name & namespace' do
+ private_project = create(:project, :private, :repository)
+
+ visit project_new_merge_request_path(project, merge_request: { source_project_id: private_project.id })
+
+ expect(page).not_to have_content private_project.full_path
+ expect(page).to have_content project.full_path
+ end
+ end
+
+ it 'populates source branch button' do
+ visit project_new_merge_request_path(project, change_branches: true, merge_request: { target_branch: 'master', source_branch: 'fix' })
+
+ expect(find('.js-source-branch')).to have_content('fix')
+ end
+
+ it 'allows to change the diff view' do
+ visit project_new_merge_request_path(project, merge_request: { target_branch: 'master', source_branch: 'fix' })
+
+ click_link 'Changes'
+
+ expect(page).to have_css('a.btn.active', text: 'Inline')
+ expect(page).not_to have_css('a.btn.active', text: 'Side-by-side')
+
+ click_link 'Side-by-side'
+
+ within '.merge-request' do
+ expect(page).not_to have_css('a.btn.active', text: 'Inline')
+ expect(page).to have_css('a.btn.active', text: 'Side-by-side')
+ end
+ end
+
+ it 'does not allow non-existing branches' do
+ visit project_new_merge_request_path(project, merge_request: { target_branch: 'non-exist-target', source_branch: 'non-exist-source' })
+
+ expect(page).to have_content('The form contains the following errors')
+ expect(page).to have_content('Source branch "non-exist-source" does not exist')
+ expect(page).to have_content('Target branch "non-exist-target" does not exist')
+ end
+
+ context 'when a branch contains commits that both delete and add the same image' do
+ it 'renders the diff successfully' do
+ visit project_new_merge_request_path(project, merge_request: { target_branch: 'master', source_branch: 'deleted-image-test' })
+
+ click_link "Changes"
+
+ expect(page).to have_content "6049019_460s.jpg"
+ end
+ end
+
+ # Isolates a regression (see #24627)
+ it 'does not show error messages on initial form' do
+ visit project_new_merge_request_path(project)
+ expect(page).not_to have_selector('#error_explanation')
+ expect(page).not_to have_content('The form contains the following error')
+ end
+
+ context 'when a new merge request has a pipeline' do
+ let!(:pipeline) do
+ create(:ci_pipeline, sha: project.commit('fix').id,
+ ref: 'fix',
+ project: project)
+ end
+
+ it 'shows pipelines for a new merge request' do
+ visit project_new_merge_request_path(
+ project,
+ merge_request: { target_branch: 'master', source_branch: 'fix' })
+
+ page.within('.merge-request') do
+ click_link 'Pipelines'
+ wait_for_requests
+
+ expect(page).to have_content "##{pipeline.id}"
+ end
+ end
+ end
+end