user_selects_branches_for_new_mr_spec.rb 5.89 KB
Newer Older
1
require 'rails_helper'
2

3
describe 'Merge request > User selects branches for new MR', :js do
4
  let(:project) { create(:project, :public, :repository) }
5
  let(:user) { project.creator }
6 7

  before do
8
    project.add_master(user)
9
    sign_in(user)
10 11
  end

12
  it 'selects the source branch sha when a tag with the same name exists' do
13
    visit project_merge_requests_path(project)
14

Phil Hughes's avatar
Phil Hughes committed
15 16 17
    page.within '.content' do
      click_link 'New merge request'
    end
18 19 20 21
    expect(page).to have_content('Source branch')
    expect(page).to have_content('Target branch')

    first('.js-source-branch').click
22
    find('.dropdown-source-branch .dropdown-content a', match: :first).click
23 24 25 26 27

    expect(page).to have_content "b83d6e3"
  end

  it 'selects the target branch sha when a tag with the same name exists' do
28
    visit project_merge_requests_path(project)
Luke Bennett's avatar
Luke Bennett committed
29

Phil Hughes's avatar
Phil Hughes committed
30 31 32
    page.within '.content' do
      click_link 'New merge request'
    end
33 34 35 36 37

    expect(page).to have_content('Source branch')
    expect(page).to have_content('Target branch')

    first('.js-target-branch').click
38
    find('.dropdown-target-branch .dropdown-content a', text: 'v1.1.0', match: :first).click
39 40 41 42

    expect(page).to have_content "b83d6e3"
  end

43
  it 'generates a diff for an orphaned branch' do
44
    visit project_merge_requests_path(project)
45

Phil Hughes's avatar
Phil Hughes committed
46 47 48
    page.within '.content' do
      click_link 'New merge request'
    end
Phil Hughes's avatar
Phil Hughes committed
49 50
    expect(page).to have_content('Source branch')
    expect(page).to have_content('Target branch')
Phil Hughes's avatar
Phil Hughes committed
51

52 53
    find('.js-source-branch', match: :first).click
    find('.dropdown-source-branch .dropdown-content a', text: 'orphaned-branch', match: :first).click
Phil Hughes's avatar
Phil Hughes committed
54

55
    click_button "Compare branches"
Phil Hughes's avatar
Phil Hughes committed
56
    click_link "Changes"
57 58 59 60 61 62 63

    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"

64
    click_button "Check out branch"
Phil Hughes's avatar
Phil Hughes committed
65

66 67
    expect(page).to have_content 'git checkout -b orphaned-branch origin/orphaned-branch'
  end
68

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
  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

91 92
  context 'when target project cannot be viewed by the current user' do
    it 'does not leak the private project name & namespace' do
93
      private_project = create(:project, :private, :repository)
94

95
      visit project_new_merge_request_path(project, merge_request: { target_project_id: private_project.id })
96

97 98
      expect(page).not_to have_content private_project.full_path
      expect(page).to have_content project.full_path
99 100 101 102 103
    end
  end

  context 'when source project cannot be viewed by the current user' do
    it 'does not leak the private project name & namespace' do
104
      private_project = create(:project, :private, :repository)
105

106
      visit project_new_merge_request_path(project, merge_request: { source_project_id: private_project.id })
107

108 109
      expect(page).not_to have_content private_project.full_path
      expect(page).to have_content project.full_path
110 111
    end
  end
112

113
  it 'populates source branch button' do
114
    visit project_new_merge_request_path(project, change_branches: true, merge_request: { target_branch: 'master', source_branch: 'fix' })
115 116 117 118

    expect(find('.js-source-branch')).to have_content('fix')
  end

119
  it 'allows to change the diff view' do
120
    visit project_new_merge_request_path(project, merge_request: { target_branch: 'master', source_branch: 'fix' })
121 122 123

    click_link 'Changes'

124 125
    expect(page).to have_css('a.btn.active', text: 'Inline')
    expect(page).not_to have_css('a.btn.active', text: 'Side-by-side')
126 127 128

    click_link 'Side-by-side'

Alfredo Sumaran's avatar
Alfredo Sumaran committed
129 130 131 132
    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
133
  end
134 135

  it 'does not allow non-existing branches' do
136
    visit project_new_merge_request_path(project, merge_request: { target_branch: 'non-exist-target', source_branch: 'non-exist-source' })
137 138 139 140 141

    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
142 143 144

  context 'when a branch contains commits that both delete and add the same image' do
    it 'renders the diff successfully' do
145
      visit project_new_merge_request_path(project, merge_request: { target_branch: 'master', source_branch: 'deleted-image-test' })
146 147 148 149 150 151

      click_link "Changes"

      expect(page).to have_content "6049019_460s.jpg"
    end
  end
152 153 154

  # Isolates a regression (see #24627)
  it 'does not show error messages on initial form' do
155
    visit project_new_merge_request_path(project)
156 157 158
    expect(page).not_to have_selector('#error_explanation')
    expect(page).not_to have_content('The form contains the following error')
  end
159 160 161 162 163 164 165 166 167

  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
168 169
      visit project_new_merge_request_path(
        project,
170 171 172 173
        merge_request: { target_branch: 'master', source_branch: 'fix' })

      page.within('.merge-request') do
        click_link 'Pipelines'
174
        wait_for_requests
175 176 177 178 179

        expect(page).to have_content "##{pipeline.id}"
      end
    end
  end
180
end