factory_spec.rb 9.01 KB
Newer Older
1 2 3 4 5
require 'spec_helper'

describe Gitlab::Ci::Status::Build::Factory do
  let(:user) { create(:user) }
  let(:project) { build.project }
6 7
  let(:status) { factory.fabricate! }
  let(:factory) { described_class.new(build, user) }
8

9
  before do
10 11 12
    stub_not_protect_default_branch

    project.add_developer(user)
13
  end
14 15 16 17

  context 'when build is successful' do
    let(:build) { create(:ci_build, :success) }

18 19 20 21 22 23 24 25 26
    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Success
    end

    it 'matches correct extended statuses' do
      expect(factory.extended_statuses)
        .to eq [Gitlab::Ci::Status::Build::Retryable]
    end

27 28 29 30 31 32
    it 'fabricates a retryable build status' do
      expect(status).to be_a Gitlab::Ci::Status::Build::Retryable
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq 'passed'
Tim Zallmann's avatar
Tim Zallmann committed
33
      expect(status.icon).to eq 'status_success'
34
      expect(status.favicon).to eq 'favicon_status_success'
35 36 37 38 39 40 41
      expect(status.label).to eq 'passed'
      expect(status).to have_details
      expect(status).to have_action
    end
  end

  context 'when build is failed' do
42 43
    context 'when build is not allowed to fail' do
      let(:build) { create(:ci_build, :failed) }
44

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
      it 'matches correct core status' do
        expect(factory.core_status).to be_a Gitlab::Ci::Status::Failed
      end

      it 'matches correct extended statuses' do
        expect(factory.extended_statuses)
          .to eq [Gitlab::Ci::Status::Build::Retryable]
      end

      it 'fabricates a retryable build status' do
        expect(status).to be_a Gitlab::Ci::Status::Build::Retryable
      end

      it 'fabricates status with correct details' do
        expect(status.text).to eq 'failed'
Tim Zallmann's avatar
Tim Zallmann committed
60
        expect(status.icon).to eq 'status_failed'
61
        expect(status.favicon).to eq 'favicon_status_failed'
62 63 64 65
        expect(status.label).to eq 'failed'
        expect(status).to have_details
        expect(status).to have_action
      end
66 67
    end

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    context 'when build is allowed to fail' do
      let(:build) { create(:ci_build, :failed, :allowed_to_fail) }

      it 'matches correct core status' do
        expect(factory.core_status).to be_a Gitlab::Ci::Status::Failed
      end

      it 'matches correct extended statuses' do
        expect(factory.extended_statuses)
          .to eq [Gitlab::Ci::Status::Build::Retryable,
                  Gitlab::Ci::Status::Build::FailedAllowed]
      end

      it 'fabricates a failed but allowed build status' do
        expect(status).to be_a Gitlab::Ci::Status::Build::FailedAllowed
      end

      it 'fabricates status with correct details' do
        expect(status.text).to eq 'failed'
Tim Zallmann's avatar
Tim Zallmann committed
87
        expect(status.icon).to eq 'status_warning'
88
        expect(status.favicon).to eq 'favicon_status_failed'
89 90 91 92 93 94
        expect(status.label).to eq 'failed (allowed to fail)'
        expect(status).to have_details
        expect(status).to have_action
        expect(status.action_title).to include 'Retry'
        expect(status.action_path).to include 'retry'
      end
95 96 97 98 99 100
    end
  end

  context 'when build is a canceled' do
    let(:build) { create(:ci_build, :canceled) }

101 102 103 104 105 106 107 108 109
    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Canceled
    end

    it 'matches correct extended statuses' do
      expect(factory.extended_statuses)
        .to eq [Gitlab::Ci::Status::Build::Retryable]
    end

110 111 112 113 114 115
    it 'fabricates a retryable build status' do
      expect(status).to be_a Gitlab::Ci::Status::Build::Retryable
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq 'canceled'
Tim Zallmann's avatar
Tim Zallmann committed
116
      expect(status.icon).to eq 'status_canceled'
117
      expect(status.favicon).to eq 'favicon_status_canceled'
118 119 120 121 122 123 124 125 126
      expect(status.label).to eq 'canceled'
      expect(status).to have_details
      expect(status).to have_action
    end
  end

  context 'when build is running' do
    let(:build) { create(:ci_build, :running) }

127 128 129 130 131 132 133 134 135
    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Running
    end

    it 'matches correct extended statuses' do
      expect(factory.extended_statuses)
        .to eq [Gitlab::Ci::Status::Build::Cancelable]
    end

136 137 138 139 140 141
    it 'fabricates a canceable build status' do
      expect(status).to be_a Gitlab::Ci::Status::Build::Cancelable
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq 'running'
Tim Zallmann's avatar
Tim Zallmann committed
142
      expect(status.icon).to eq 'status_running'
143
      expect(status.favicon).to eq 'favicon_status_running'
144 145 146 147 148 149 150 151 152
      expect(status.label).to eq 'running'
      expect(status).to have_details
      expect(status).to have_action
    end
  end

  context 'when build is pending' do
    let(:build) { create(:ci_build, :pending) }

153 154 155 156 157 158 159 160 161
    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Pending
    end

    it 'matches correct extended statuses' do
      expect(factory.extended_statuses)
        .to eq [Gitlab::Ci::Status::Build::Cancelable]
    end

162 163 164 165 166 167
    it 'fabricates a cancelable build status' do
      expect(status).to be_a Gitlab::Ci::Status::Build::Cancelable
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq 'pending'
Tim Zallmann's avatar
Tim Zallmann committed
168
      expect(status.icon).to eq 'status_pending'
169
      expect(status.favicon).to eq 'favicon_status_pending'
170 171 172 173 174 175 176 177 178
      expect(status.label).to eq 'pending'
      expect(status).to have_details
      expect(status).to have_action
    end
  end

  context 'when build is skipped' do
    let(:build) { create(:ci_build, :skipped) }

179 180 181 182 183 184 185 186
    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Skipped
    end

    it 'does not match extended statuses' do
      expect(factory.extended_statuses).to be_empty
    end

187 188 189 190 191 192
    it 'fabricates a core skipped status' do
      expect(status).to be_a Gitlab::Ci::Status::Skipped
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq 'skipped'
Tim Zallmann's avatar
Tim Zallmann committed
193
      expect(status.icon).to eq 'status_skipped'
194
      expect(status.favicon).to eq 'favicon_status_skipped'
195 196 197 198 199 200 201 202 203 204
      expect(status.label).to eq 'skipped'
      expect(status).to have_details
      expect(status).not_to have_action
    end
  end

  context 'when build is a manual action' do
    context 'when build is a play action' do
      let(:build) { create(:ci_build, :playable) }

205
      it 'matches correct core status' do
206
        expect(factory.core_status).to be_a Gitlab::Ci::Status::Manual
207 208 209 210
      end

      it 'matches correct extended statuses' do
        expect(factory.extended_statuses)
211
          .to eq [Gitlab::Ci::Status::Build::Play,
212
                  Gitlab::Ci::Status::Build::Action]
213 214
      end

215 216
      it 'fabricates action detailed status' do
        expect(status).to be_a Gitlab::Ci::Status::Build::Action
217 218 219 220
      end

      it 'fabricates status with correct details' do
        expect(status.text).to eq 'manual'
221
        expect(status.group).to eq 'manual'
Tim Zallmann's avatar
Tim Zallmann committed
222
        expect(status.icon).to eq 'status_manual'
223
        expect(status.favicon).to eq 'favicon_status_manual'
224
        expect(status.label).to include 'manual play action'
225
        expect(status).to have_details
226
        expect(status.action_path).to include 'play'
227
      end
228 229 230 231 232 233 234 235

      context 'when user has ability to play action' do
        it 'fabricates status that has action' do
          expect(status).to have_action
        end
      end

      context 'when user does not have ability to play action' do
236
        before do
237
          allow(build.project).to receive(:empty_repo?).and_return(false)
238 239

          create(:protected_branch, :no_one_can_push,
240
                 name: build.ref, project: build.project)
241 242
        end

243 244 245 246
        it 'fabricates status that has no action' do
          expect(status).not_to have_action
        end
      end
247 248 249 250 251
    end

    context 'when build is an environment stop action' do
      let(:build) { create(:ci_build, :playable, :teardown_environment) }

252
      it 'matches correct core status' do
253
        expect(factory.core_status).to be_a Gitlab::Ci::Status::Manual
254 255 256 257
      end

      it 'matches correct extended statuses' do
        expect(factory.extended_statuses)
258 259
          .to eq [Gitlab::Ci::Status::Build::Stop,
                  Gitlab::Ci::Status::Build::Action]
260 261
      end

262 263
      it 'fabricates action detailed status' do
        expect(status).to be_a Gitlab::Ci::Status::Build::Action
264 265
      end

266
      context 'when user is not allowed to execute manual action' do
267
        before do
268
          allow(build.project).to receive(:empty_repo?).and_return(false)
269 270

          create(:protected_branch, :no_one_can_push,
271
                 name: build.ref, project: build.project)
272 273
        end

274 275 276
        it 'fabricates status with correct details' do
          expect(status.text).to eq 'manual'
          expect(status.group).to eq 'manual'
Tim Zallmann's avatar
Tim Zallmann committed
277
          expect(status.icon).to eq 'status_manual'
278 279 280 281 282
          expect(status.favicon).to eq 'favicon_status_manual'
          expect(status.label).to eq 'manual stop action (not allowed)'
          expect(status).to have_details
          expect(status).not_to have_action
        end
283 284 285 286
      end
    end
  end
end