pipeline_spec.rb 9.6 KB
Newer Older
Filipa Lacerda's avatar
Filipa Lacerda committed
1 2
require 'spec_helper'

3
describe 'Pipeline', :feature, :js do
Filipa Lacerda's avatar
Filipa Lacerda committed
4 5 6 7 8 9 10 11 12 13
  include GitlabRoutingHelper

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

  before do
    login_as(user)
    project.team << [user, :developer]
  end

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
  shared_context 'pipeline builds' do
    let!(:build_passed) do
      create(:ci_build, :success,
             pipeline: pipeline, stage: 'build', name: 'build')
    end

    let!(:build_failed) do
      create(:ci_build, :failed,
             pipeline: pipeline, stage: 'test', name: 'test', commands: 'test')
    end

    let!(:build_running) do
      create(:ci_build, :running,
             pipeline: pipeline, stage: 'deploy', name: 'deploy')
    end

    let!(:build_manual) do
      create(:ci_build, :manual,
             pipeline: pipeline, stage: 'deploy', name: 'manual-build')
    end

    let!(:build_external) do
      create(:generic_commit_status, status: 'success',
                                     pipeline: pipeline,
                                     name: 'jenkins',
39 40
                                     stage: 'external',
                                     target_url: 'http://gitlab.com/status')
41 42 43
    end
  end

Filipa Lacerda's avatar
Filipa Lacerda committed
44
  describe 'GET /:project/pipelines/:id' do
45 46
    include_context 'pipeline builds'

Filipa Lacerda's avatar
Filipa Lacerda committed
47
    let(:project) { create(:project) }
48
    let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user) }
Filipa Lacerda's avatar
Filipa Lacerda committed
49

50 51 52
    before do
      visit namespace_project_pipeline_path(project.namespace, project, pipeline)
    end
Filipa Lacerda's avatar
Filipa Lacerda committed
53

Filipa Lacerda's avatar
Filipa Lacerda committed
54 55 56
    it 'shows the pipeline graph' do
      expect(page).to have_selector('.pipeline-visualization')
      expect(page).to have_content('Build')
Filipa Lacerda's avatar
Filipa Lacerda committed
57 58
      expect(page).to have_content('Test')
      expect(page).to have_content('Deploy')
dimitrieh's avatar
dimitrieh committed
59
      expect(page).to have_content('Retry')
Filipa Lacerda's avatar
Filipa Lacerda committed
60 61 62 63 64 65 66
      expect(page).to have_content('Cancel running')
    end

    it 'shows Pipeline tab pane as active' do
      expect(page).to have_css('#js-tab-pipeline.active')
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
67 68 69
    describe 'pipeline graph' do
      context 'when pipeline has running builds' do
        it 'shows a running icon and a cancel action for the running build' do
70
          page.within('#ci-badge-deploy') do
Filipa Lacerda's avatar
Filipa Lacerda committed
71
            expect(page).to have_selector('.js-ci-status-icon-running')
Filipa Lacerda's avatar
Filipa Lacerda committed
72
            expect(page).to have_selector('.js-icon-action-cancel')
73
            expect(page).to have_content('deploy')
Filipa Lacerda's avatar
Filipa Lacerda committed
74
          end
Filipa Lacerda's avatar
Filipa Lacerda committed
75 76
        end

Filipa Lacerda's avatar
Filipa Lacerda committed
77
        it 'should be possible to cancel the running build' do
78
          find('#ci-badge-deploy .ci-action-icon-container').trigger('click')
Filipa Lacerda's avatar
Filipa Lacerda committed
79

Filipa Lacerda's avatar
Filipa Lacerda committed
80 81
          expect(page).not_to have_content('Cancel running')
        end
82 83
      end

Filipa Lacerda's avatar
Filipa Lacerda committed
84
      context 'when pipeline has successful builds' do
85 86
        it 'shows the success icon and a retry action for the successful build' do
          page.within('#ci-badge-build') do
Filipa Lacerda's avatar
Filipa Lacerda committed
87
            expect(page).to have_selector('.js-ci-status-icon-success')
Filipa Lacerda's avatar
Filipa Lacerda committed
88 89
            expect(page).to have_content('build')
          end
Filipa Lacerda's avatar
Filipa Lacerda committed
90

91
          page.within('#ci-badge-build .ci-action-icon-container') do
Filipa Lacerda's avatar
Filipa Lacerda committed
92
            expect(page).to have_selector('.js-icon-action-retry')
Filipa Lacerda's avatar
Filipa Lacerda committed
93
          end
Filipa Lacerda's avatar
Filipa Lacerda committed
94 95
        end

Filipa Lacerda's avatar
Filipa Lacerda committed
96
        it 'should be possible to retry the success job' do
97
          find('#ci-badge-build .ci-action-icon-container').trigger('click')
Filipa Lacerda's avatar
Filipa Lacerda committed
98

Filipa Lacerda's avatar
Filipa Lacerda committed
99
          expect(page).not_to have_content('Retry job')
100 101 102
        end
      end

Filipa Lacerda's avatar
Filipa Lacerda committed
103 104
      context 'when pipeline has failed builds' do
        it 'shows the failed icon and a retry action for the failed build' do
105
          page.within('#ci-badge-test') do
Filipa Lacerda's avatar
Filipa Lacerda committed
106
            expect(page).to have_selector('.js-ci-status-icon-failed')
Filipa Lacerda's avatar
Filipa Lacerda committed
107 108
            expect(page).to have_content('test')
          end
Filipa Lacerda's avatar
Filipa Lacerda committed
109

110
          page.within('#ci-badge-test .ci-action-icon-container') do
Filipa Lacerda's avatar
Filipa Lacerda committed
111
            expect(page).to have_selector('.js-icon-action-retry')
Filipa Lacerda's avatar
Filipa Lacerda committed
112
          end
Filipa Lacerda's avatar
Filipa Lacerda committed
113 114
        end

Filipa Lacerda's avatar
Filipa Lacerda committed
115
        it 'should be possible to retry the failed build' do
116
          find('#ci-badge-test .ci-action-icon-container').trigger('click')
Filipa Lacerda's avatar
Filipa Lacerda committed
117

Filipa Lacerda's avatar
Filipa Lacerda committed
118
          expect(page).not_to have_content('Retry job')
119 120 121
        end
      end

Filipa Lacerda's avatar
Filipa Lacerda committed
122
      context 'when pipeline has manual jobs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
123
        it 'shows the skipped icon and a play action for the manual build' do
124
          page.within('#ci-badge-manual-build') do
Filipa Lacerda's avatar
Filipa Lacerda committed
125
            expect(page).to have_selector('.js-ci-status-icon-manual')
Filipa Lacerda's avatar
Filipa Lacerda committed
126 127
            expect(page).to have_content('manual')
          end
Filipa Lacerda's avatar
Filipa Lacerda committed
128

129
          page.within('#ci-badge-manual-build .ci-action-icon-container') do
Filipa Lacerda's avatar
Filipa Lacerda committed
130
            expect(page).to have_selector('.js-icon-action-play')
Filipa Lacerda's avatar
Filipa Lacerda committed
131
          end
132 133
        end

Filipa Lacerda's avatar
Filipa Lacerda committed
134
        it 'should be possible to play the manual job' do
135
          find('#ci-badge-manual-build .ci-action-icon-container').trigger('click')
Filipa Lacerda's avatar
Filipa Lacerda committed
136

Filipa Lacerda's avatar
Filipa Lacerda committed
137
          expect(page).not_to have_content('Play job')
138 139
        end
      end
Filipa Lacerda's avatar
Filipa Lacerda committed
140

Filipa Lacerda's avatar
Filipa Lacerda committed
141
      context 'when pipeline has external job' do
Filipa Lacerda's avatar
Filipa Lacerda committed
142
        it 'shows the success icon and the generic comit status build' do
Filipa Lacerda's avatar
Filipa Lacerda committed
143
          expect(page).to have_selector('.js-ci-status-icon-success')
Filipa Lacerda's avatar
Filipa Lacerda committed
144
          expect(page).to have_content('jenkins')
145
          expect(page).to have_link('jenkins', href: 'http://gitlab.com/status')
Filipa Lacerda's avatar
Filipa Lacerda committed
146
        end
Filipa Lacerda's avatar
Filipa Lacerda committed
147
      end
148 149
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
150
    context 'page tabs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
151
      it 'shows Pipeline and Jobs tabs with link' do
Filipa Lacerda's avatar
Filipa Lacerda committed
152
        expect(page).to have_link('Pipeline')
Filipa Lacerda's avatar
Filipa Lacerda committed
153
        expect(page).to have_link('Jobs')
Filipa Lacerda's avatar
Filipa Lacerda committed
154 155
      end

Filipa Lacerda's avatar
Filipa Lacerda committed
156
      it 'shows counter in Jobs tab' do
Filipa Lacerda's avatar
Filipa Lacerda committed
157 158 159 160 161 162 163 164
        expect(page.find('.js-builds-counter').text).to eq(pipeline.statuses.count.to_s)
      end

      it 'shows Pipeline tab as active' do
        expect(page).to have_css('.js-pipeline-tab-link.active')
      end
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
165
    context 'retrying jobs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
166 167 168
      it { expect(page).not_to have_content('retried') }

      context 'when retrying' do
169 170 171
        before do
          find('.js-retry-button').trigger('click')
        end
Filipa Lacerda's avatar
Filipa Lacerda committed
172

dimitrieh's avatar
dimitrieh committed
173
        it { expect(page).not_to have_content('Retry') }
Filipa Lacerda's avatar
Filipa Lacerda committed
174 175 176
      end
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
177
    context 'canceling jobs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
178 179 180
      it { expect(page).not_to have_selector('.ci-canceled') }

      context 'when canceling' do
181 182 183
        before do
          click_on 'Cancel running'
        end
Filipa Lacerda's avatar
Filipa Lacerda committed
184 185 186 187 188 189 190

        it { expect(page).not_to have_content('Cancel running') }
      end
    end
  end

  describe 'GET /:project/pipelines/:id/builds' do
191 192
    include_context 'pipeline builds'

Filipa Lacerda's avatar
Filipa Lacerda committed
193 194 195 196
    let(:project) { create(:project) }
    let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }

    before do
197
      visit builds_namespace_project_pipeline_path(project.namespace, project, pipeline)
Filipa Lacerda's avatar
Filipa Lacerda committed
198 199
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
200
    it 'shows a list of jobs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
201
      expect(page).to have_content('Test')
202
      expect(page).to have_content(build_passed.id)
Filipa Lacerda's avatar
Filipa Lacerda committed
203
      expect(page).to have_content('Deploy')
204 205 206
      expect(page).to have_content(build_failed.id)
      expect(page).to have_content(build_running.id)
      expect(page).to have_content(build_external.id)
dimitrieh's avatar
dimitrieh committed
207
      expect(page).to have_content('Retry')
Filipa Lacerda's avatar
Filipa Lacerda committed
208 209 210 211
      expect(page).to have_content('Cancel running')
      expect(page).to have_link('Play')
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
212
    it 'shows jobs tab pane as active' do
Filipa Lacerda's avatar
Filipa Lacerda committed
213 214 215 216
      expect(page).to have_css('#js-tab-builds.active')
    end

    context 'page tabs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
217
      it 'shows Pipeline and Jobs tabs with link' do
Filipa Lacerda's avatar
Filipa Lacerda committed
218
        expect(page).to have_link('Pipeline')
Filipa Lacerda's avatar
Filipa Lacerda committed
219
        expect(page).to have_link('Jobs')
Filipa Lacerda's avatar
Filipa Lacerda committed
220 221
      end

Filipa Lacerda's avatar
Filipa Lacerda committed
222
      it 'shows counter in Jobs tab' do
Filipa Lacerda's avatar
Filipa Lacerda committed
223 224 225
        expect(page.find('.js-builds-counter').text).to eq(pipeline.statuses.count.to_s)
      end

Filipa Lacerda's avatar
Filipa Lacerda committed
226
      it 'shows Jobs tab as active' do
Filipa Lacerda's avatar
Filipa Lacerda committed
227 228 229 230
        expect(page).to have_css('li.js-builds-tab-link.active')
      end
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
231
    context 'retrying jobs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
232 233 234
      it { expect(page).not_to have_content('retried') }

      context 'when retrying' do
235 236 237
        before do
          find('.js-retry-button').trigger('click')
        end
Filipa Lacerda's avatar
Filipa Lacerda committed
238

dimitrieh's avatar
dimitrieh committed
239
        it { expect(page).not_to have_content('Retry') }
Filipa Lacerda's avatar
Filipa Lacerda committed
240 241 242
      end
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
243
    context 'canceling jobs' do
Filipa Lacerda's avatar
Filipa Lacerda committed
244 245 246
      it { expect(page).not_to have_selector('.ci-canceled') }

      context 'when canceling' do
247 248 249
        before do
          click_on 'Cancel running'
        end
Filipa Lacerda's avatar
Filipa Lacerda committed
250 251 252 253 254

        it { expect(page).not_to have_content('Cancel running') }
      end
    end

Filipa Lacerda's avatar
Filipa Lacerda committed
255
    context 'playing manual job' do
Filipa Lacerda's avatar
Filipa Lacerda committed
256 257 258 259 260 261
      before do
        within '.pipeline-holder' do
          click_link('Play')
        end
      end

262
      it { expect(build_manual.reload).to be_pending }
Filipa Lacerda's avatar
Filipa Lacerda committed
263 264
    end
  end
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279

  describe 'GET /:project/pipelines/:id/failures' do
    let(:project) { create(:project) }
    let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
    let(:pipeline_failures_page) { failures_namespace_project_pipeline_path(project.namespace, project, pipeline) }
    let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline) }

    context 'with failed build' do
      before do
        failed_build.trace.set('4 examples, 1 failure')

        visit pipeline_failures_page
      end

      it 'shows jobs tab pane as active' do
280
        expect(page).to have_content('Failed Jobs')
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
        expect(page).to have_css('#js-tab-failures.active')
      end

      it 'lists failed builds' do
        expect(page).to have_content(failed_build.name)
        expect(page).to have_content(failed_build.stage)
      end

      it 'shows build failure logs' do
        expect(page).to have_content('4 examples, 1 failure')
      end
    end

    context 'when missing build logs' do
      before do
        visit pipeline_failures_page
      end

      it 'includes failed jobs' do
        expect(page).to have_content('No job trace')
      end
    end
303 304 305 306 307 308 309 310 311 312 313 314 315 316

    context 'without failures' do
      before do
        failed_build.update!(status: :success)

        visit pipeline_failures_page
      end

      it 'displays the pipeline graph' do
        expect(current_path).to eq(pipeline_path(pipeline))
        expect(page).not_to have_content('Failed Jobs')
        expect(page).to have_selector('.pipeline-visualization')
      end
    end
317
  end
Filipa Lacerda's avatar
Filipa Lacerda committed
318
end