widget_spec.rb 7.3 KB
Newer Older
1 2
require 'rails_helper'

3
describe 'Merge request', :js do
4
  let(:user) { create(:user) }
5
  let(:project) { create(:project, :repository) }
6
  let(:merge_request) { create(:merge_request, source_project: project) }
7 8 9

  before do
    project.team << [user, :master]
10
    sign_in(user)
11
  end
12

13 14
  context 'new merge request' do
    before do
15
      visit project_new_merge_request_path(
16 17 18 19 20 21
        project,
        merge_request: {
          source_project_id: project.id,
          target_project_id: project.id,
          source_branch: 'feature',
          target_branch: 'master'
22
        })
23 24 25 26 27
    end

    it 'shows widget status after creating new merge request' do
      click_button 'Submit merge request'

28
      wait_for_requests
29

30
      expect(page).to have_selector('.accept-merge-request')
F
Fatih Acet 已提交
31
      expect(find('.accept-merge-request')['disabled']).not_to be(true)
32
    end
33 34
  end

35 36
  context 'view merge request' do
    let!(:environment) { create(:environment, project: project) }
37 38 39 40 41 42

    let!(:deployment) do
      create(:deployment, environment: environment,
                          ref: 'feature',
                          sha: merge_request.diff_head_sha)
    end
43

44
    before do
45
      visit project_merge_request_path(project, merge_request)
46
    end
47

48
    it 'shows environments link' do
49
      wait_for_requests
50

51 52
      page.within('.mr-widget-heading') do
        expect(page).to have_content("Deployed to #{environment.name}")
F
Fatih Acet 已提交
53
        expect(find('.js-deploy-url')[:href]).to include(environment.formatted_external_url)
54 55
      end
    end
56 57 58

    it 'shows green accept merge request button' do
      # Wait for the `ci_status` and `merge_check` requests
59
      wait_for_requests
F
Fatih Acet 已提交
60 61
      expect(page).to have_selector('.accept-merge-request')
      expect(find('.accept-merge-request')['disabled']).not_to be(true)
62 63 64 65 66 67 68 69 70 71
    end
  end

  context 'view merge request with external CI service' do
    before do
      create(:service, project: project,
                       active: true,
                       type: 'CiService',
                       category: 'ci')

72
      visit project_merge_request_path(project, merge_request)
73 74 75 76
    end

    it 'has danger button while waiting for external CI status' do
      # Wait for the `ci_status` and `merge_check` requests
77
      wait_for_requests
78 79 80 81 82 83 84 85 86 87 88
      expect(page).to have_selector('.accept-merge-request.btn-danger')
    end
  end

  context 'view merge request with failed GitLab CI pipelines' do
    before do
      commit_status = create(:commit_status, project: project, status: 'failed')
      pipeline = create(:ci_pipeline, project: project,
                                      sha: merge_request.diff_head_sha,
                                      ref: merge_request.source_branch,
                                      status: 'failed',
89 90
                                      statuses: [commit_status],
                                      head_pipeline_of: merge_request)
91 92
      create(:ci_build, :pending, pipeline: pipeline)

93
      visit project_merge_request_path(project, merge_request)
94 95 96 97
    end

    it 'has danger button when not succeeded' do
      # Wait for the `ci_status` and `merge_check` requests
98
      wait_for_requests
99 100 101 102
      expect(page).to have_selector('.accept-merge-request.btn-danger')
    end
  end

103 104
  context 'when merge request is in the blocked pipeline state' do
    before do
105
      create(
F
Felipe Artur 已提交
106 107 108 109
        :ci_pipeline,
        project: project,
        sha: merge_request.diff_head_sha,
        ref: merge_request.source_branch,
110 111
        status: :manual,
        head_pipeline_of: merge_request)
112

113
      visit project_merge_request_path(project, merge_request)
114 115 116 117 118 119 120 121 122 123
    end

    it 'shows information about blocked pipeline' do
      expect(page).to have_content("Pipeline blocked")
      expect(page).to have_content(
        "The pipeline for this merge request requires a manual action")
      expect(page).to have_css('.ci-status-icon-manual')
    end
  end

124 125 126 127 128 129 130
  context 'view merge request with MWBS button' do
    before do
      commit_status = create(:commit_status, project: project, status: 'pending')
      pipeline = create(:ci_pipeline, project: project,
                                      sha: merge_request.diff_head_sha,
                                      ref: merge_request.source_branch,
                                      status: 'pending',
131 132
                                      statuses: [commit_status],
                                      head_pipeline_of: merge_request)
133 134
      create(:ci_build, :pending, pipeline: pipeline)

135
      visit project_merge_request_path(project, merge_request)
136 137 138 139
    end

    it 'has info button when MWBS button' do
      # Wait for the `ci_status` and `merge_check` requests
140
      wait_for_requests
F
Fatih Acet 已提交
141 142 143 144 145 146 147 148 149 150 151 152
      expect(page).to have_selector('.accept-merge-request.btn-info')
    end
  end

  context 'view merge request with MWPS enabled but automatically merge fails' do
    before do
      merge_request.update(
        merge_when_pipeline_succeeds: true,
        merge_user: merge_request.author,
        merge_error: 'Something went wrong'
      )

153
      visit project_merge_request_path(project, merge_request)
F
Fatih Acet 已提交
154 155 156 157
    end

    it 'shows information about the merge error' do
      # Wait for the `ci_status` and `merge_check` requests
158
      wait_for_requests
F
Fatih Acet 已提交
159 160 161 162

      page.within('.mr-widget-body') do
        expect(page).to have_content('Something went wrong')
      end
163
    end
164
  end
165

166 167 168 169 170 171 172 173
  context 'view merge request with MWPS enabled but automatically merge fails' do
    before do
      merge_request.update(
        merge_when_pipeline_succeeds: true,
        merge_user: merge_request.author,
        merge_error: 'Something went wrong'
      )

174
      visit project_merge_request_path(project, merge_request)
175 176 177 178
    end

    it 'shows information about the merge error' do
      # Wait for the `ci_status` and `merge_check` requests
179
      wait_for_requests
180 181 182 183 184 185 186

      page.within('.mr-widget-body') do
        expect(page).to have_content('Something went wrong')
      end
    end
  end

187 188 189
  context 'merge error' do
    before do
      allow_any_instance_of(Repository).to receive(:merge).and_return(false)
190
      visit project_merge_request_path(project, merge_request)
191 192 193
    end

    it 'updates the MR widget' do
F
Fatih Acet 已提交
194 195
      click_button 'Merge'

196 197 198 199 200
      page.within('.mr-widget-body') do
        expect(page).to have_content('Conflicts detected during merge')
      end
    end
  end
201 202

  context 'user can merge into source project but cannot push to fork', js: true do
203
    let(:fork_project) { create(:project, :public, :repository) }
204 205 206 207
    let(:user2) { create(:user) }

    before do
      project.team << [user2, :master]
208 209
      sign_out(:user)
      sign_in(user2)
210
      merge_request.update(target_project: fork_project)
211
      visit project_merge_request_path(project, merge_request)
212 213 214 215 216 217 218 219 220 221
    end

    it 'user can merge into the source project' do
      expect(page).to have_button('Merge', disabled: false)
    end

    it 'user cannot remove source branch' do
      expect(page).to have_field('remove-source-branch-input', disabled: true)
    end
  end
222 223 224 225 226 227 228 229 230 231 232 233 234

  context 'ongoing merge process' do
    it 'shows Merging state' do
      allow_any_instance_of(MergeRequest).to receive(:merge_ongoing?).and_return(true)

      visit project_merge_request_path(project, merge_request)

      wait_for_requests

      expect(page).not_to have_button('Merge')
      expect(page).to have_content('This merge request is in the process of being merged')
    end
  end
235
end