pipelines_spec.rb 8.8 KB
Newer Older
K
Kamil Trzcinski 已提交
1
require 'spec_helper'
2
require 'rails_helper'
K
Kamil Trzcinski 已提交
3

4
describe 'Pipelines', :feature, :js do
5
  include WaitForVueResource
K
Kamil Trzcinski 已提交
6 7 8

  let(:project) { create(:empty_project) }

9 10
  context 'when user is logged in' do
    let(:user) { create(:user) }
11

12 13 14
    before do
      login_as(user)
      project.team << [user, :developer]
15 16
    end

17 18 19 20 21 22 23 24 25 26 27
    describe 'GET /:project/pipelines' do
      let(:project) { create(:project) }

      let!(:pipeline) do
        create(
          :ci_empty_pipeline,
          project: project,
          ref: 'master',
          status: 'running',
          sha: project.commit.id,
        )
28 29
      end

30 31 32 33 34
      [:all, :running, :branches].each do |scope|
        context "when displaying #{scope}" do
          before do
            visit_project_pipelines(scope: scope)
          end
35

36 37 38 39
          it 'contains pipeline commit short SHA' do
            expect(page).to have_content(pipeline.short_sha)
          end
        end
R
Regis 已提交
40
      end
K
Kamil Trzcinski 已提交
41

42 43 44 45 46 47
      context 'when pipeline is cancelable' do
        let!(:build) do
          create(:ci_build, pipeline: pipeline,
                            stage: 'test',
                            commands: 'test')
        end
K
Kamil Trzcinski 已提交
48

49 50 51 52
        before do
          build.run
          visit_project_pipelines
        end
K
Kamil Trzcinski 已提交
53

54
        it { expect(page).to have_link('Cancel') }
K
Kamil Trzcinski 已提交
55

K
Kamil Trzcinski 已提交
56
        it { expect(page).to have_selector('.ci-running') }
57

58 59
        context 'when canceling' do
          before { click_link('Cancel') }
60

61 62 63
          it { expect(page).not_to have_link('Cancel') }
          it { expect(page).to have_selector('.ci-canceled') }
        end
64
      end
65

66 67 68 69 70 71
      context 'when pipeline is retryable' do
        let!(:build) do
          create(:ci_build, pipeline: pipeline,
                            stage: 'test',
                            commands: 'test')
        end
R
Regis 已提交
72

73
        before do
74 75
          build.drop
          visit_project_pipelines
76
        end
77

78 79 80 81 82 83 84 85
        it { expect(page).to have_link('Retry') }
        it { expect(page).to have_selector('.ci-failed') }

        context 'when retrying' do
          before { click_link('Retry') }

          it { expect(page).not_to have_link('Retry') }
          it { expect(page).to have_selector('.ci-running') }
86
        end
87 88
      end

89 90 91
      context 'with manual actions' do
        let!(:manual) do
          create(:ci_build, :manual,
R
Regis 已提交
92
            pipeline: pipeline,
93 94 95
            name: 'manual build',
            stage: 'test',
            commands: 'test')
R
Regis 已提交
96
        end
97

98
        before { visit_project_pipelines }
99

100 101
        it 'has a dropdown with play button' do
          expect(page).to have_selector('.dropdown-toggle.btn.btn-default .icon-play')
102 103
        end

104 105 106 107
        it 'has link to the manual action' do
          find('.js-pipeline-dropdown-manual-actions').click

          expect(page).to have_link('Manual build')
108
        end
109

110 111 112 113 114
        context 'when manual action was played' do
          before do
            find('.js-pipeline-dropdown-manual-actions').click
            click_link('Manual build')
          end
115

116 117 118
          it 'enqueues manual action job' do
            expect(manual.reload).to be_pending
          end
119
        end
120 121
      end

122 123 124 125 126 127 128 129 130
      context 'for generic statuses' do
        context 'when running' do
          let!(:running) do
            create(:generic_commit_status,
              status: 'running',
              pipeline: pipeline,
              stage: 'test'
            )
          end
131

132 133 134 135 136
          before { visit_project_pipelines }

          it 'is cancelable' do
            expect(page).to have_link('Cancel')
          end
137

138 139 140 141 142 143 144 145 146 147
          it 'has pipeline running' do
            expect(page).to have_selector('.ci-running')
          end

          context 'when canceling' do
            before { click_link('Cancel') }

            it { expect(page).not_to have_link('Cancel') }
            it { expect(page).to have_selector('.ci-canceled') }
          end
148 149
        end

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
        context 'when failed' do
          let!(:status) do
            create(:generic_commit_status, :pending,
              pipeline: pipeline,
              stage: 'test')
          end

          before do
            status.drop
            visit_project_pipelines
          end

          it 'is not retryable' do
            expect(page).not_to have_link('Retry')
          end

          it 'has failed pipeline' do
            expect(page).to have_selector('.ci-failed')
          end
169 170 171
        end
      end

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
      context 'downloadable pipelines' do
        context 'with artifacts' do
          let!(:with_artifacts) do
            create(:ci_build, :artifacts, :success,
              pipeline: pipeline,
              name: 'rspec tests',
              stage: 'test')
          end

          before { visit_project_pipelines }

          it 'has artifats' do
            expect(page).to have_selector('.build-artifacts')
          end

          it 'has artifacts download dropdown' do
            find('.js-pipeline-dropdown-download').click

            expect(page).to have_link(with_artifacts.name)
          end
R
Regis 已提交
192
        end
K
Kamil Trzcinski 已提交
193

194 195 196 197 198 199 200
        context 'with artifacts expired' do
          let!(:with_artifacts_expired) do
            create(:ci_build, :artifacts_expired, :success,
              pipeline: pipeline,
              name: 'rspec',
              stage: 'test')
          end
201

202 203 204
          before { visit_project_pipelines }

          it { expect(page).not_to have_selector('.build-artifacts') }
205 206
        end

207 208 209 210 211 212 213 214 215
        context 'without artifacts' do
          let!(:without_artifacts) do
            create(:ci_build, :success,
              pipeline: pipeline,
              name: 'rspec',
              stage: 'test')
          end

          before { visit_project_pipelines }
216

217
          it { expect(page).not_to have_selector('.build-artifacts') }
218
        end
K
Kamil Trzcinski 已提交
219
      end
K
Kamil Trzcinski 已提交
220

221 222 223 224 225
      context 'mini pipleine graph' do
        let!(:build) do
          create(:ci_build, pipeline: pipeline,
                            stage: 'build',
                            name: 'build')
R
Regis 已提交
226
        end
227

228
        before { visit_project_pipelines }
229

230 231 232
        context 'when clicking a graph stage' do
          it 'should open a dropdown' do
            find('.js-builds-dropdown-button').trigger('click')
233

234 235
            expect(page).to have_link build.name
          end
K
Kamil Trzcinski 已提交
236

237 238
          it 'should be possible to retry the failed build' do
            find('.js-builds-dropdown-button').trigger('click')
239

240 241 242 243
            find('a.ci-action-icon-container').trigger('click')
            expect(page).not_to have_content('Cancel running')
          end
        end
K
Kamil Trzcinski 已提交
244 245
      end
    end
246

247 248 249 250 251
    describe 'POST /:project/pipelines' do
      let(:project) { create(:project) }

      before do
        visit new_namespace_project_pipeline_path(project.namespace, project)
252 253
      end

254 255
      context 'for valid commit' do
        before { fill_in('pipeline[ref]', with: 'master') }
256

257 258
        context 'with gitlab-ci.yml' do
          before { stub_ci_pipeline_to_return_yaml_file }
259

260 261 262 263
          it 'creates a new pipeline' do
            expect { click_on 'Create pipeline' }
              .to change { Ci::Pipeline.count }.by(1)
          end
264 265
        end

266 267
        context 'without gitlab-ci.yml' do
          before { click_on 'Create pipeline' }
268

269
          it { expect(page).to have_content('Missing .gitlab-ci.yml file') }
270 271
        end
      end
K
Kamil Trzcinski 已提交
272

273 274 275 276 277
      context 'for invalid commit' do
        before do
          fill_in('pipeline[ref]', with: 'invalid-reference')
          click_on 'Create pipeline'
        end
K
Kamil Trzcinski 已提交
278

279 280
        it { expect(page).to have_content('Reference not found') }
      end
R
Regis 已提交
281
    end
K
Kamil Trzcinski 已提交
282

283 284
    describe 'Create pipelines' do
      let(:project) { create(:project) }
285

286 287 288
      before do
        visit new_namespace_project_pipeline_path(project.namespace, project)
      end
289

290 291 292 293
      describe 'new pipeline page' do
        it 'has field to add a new pipeline' do
          expect(page).to have_field('pipeline[ref]')
          expect(page).to have_content('Create for')
R
Regis 已提交
294
        end
K
Kamil Trzcinski 已提交
295
      end
K
Kamil Trzcinski 已提交
296

297 298 299 300
      describe 'find pipelines' do
        it 'shows filtered pipelines', js: true do
          fill_in('pipeline[ref]', with: 'fix')
          find('input#ref').native.send_keys(:keydown)
301

302 303 304 305
          within('.ui-autocomplete') do
            expect(page).to have_selector('li', text: 'fix')
          end
        end
K
Kamil Trzcinski 已提交
306 307
      end
    end
K
Kamil Trzcinski 已提交
308
  end
U
ubudzisz 已提交
309

310
  context 'when user is not logged in' do
U
ubudzisz 已提交
311
    before do
312
      visit namespace_project_pipelines_path(project.namespace, project)
U
ubudzisz 已提交
313 314
    end

315 316 317 318 319
    context 'when project is public' do
      let(:project) { create(:project, :public) }

      it { expect(page).to have_content 'No pipelines to show' }
      it { expect(page).to have_http_status(:success) }
U
ubudzisz 已提交
320 321
    end

322 323
    context 'when project is private' do
      let(:project) { create(:project, :private) }
U
ubudzisz 已提交
324

325
      it { expect(page).to have_content 'You need to sign in' }
U
ubudzisz 已提交
326 327
    end
  end
328 329 330 331 332

  def visit_project_pipelines(**query)
    visit namespace_project_pipelines_path(project.namespace, project, query)
    wait_for_vue_resource
  end
K
Kamil Trzcinski 已提交
333
end