factory_spec.rb 8.76 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 10 11 12 13

  before { project.team << [user, :developer] }

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

14 15 16 17 18 19 20 21 22
    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

23 24 25 26 27 28 29
    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'
      expect(status.icon).to eq 'icon_status_success'
30
      expect(status.favicon).to eq 'favicon_status_success'
31 32 33 34 35 36 37
      expect(status.label).to eq 'passed'
      expect(status).to have_details
      expect(status).to have_action
    end
  end

  context 'when build is failed' do
38 39
    context 'when build is not allowed to fail' do
      let(:build) { create(:ci_build, :failed) }
40

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
      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'
        expect(status.icon).to eq 'icon_status_failed'
57
        expect(status.favicon).to eq 'favicon_status_failed'
58 59 60 61
        expect(status.label).to eq 'failed'
        expect(status).to have_details
        expect(status).to have_action
      end
62 63
    end

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    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'
        expect(status.icon).to eq 'icon_status_warning'
84
        expect(status.favicon).to eq 'favicon_status_failed'
85 86 87 88 89 90
        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
91 92 93 94 95 96
    end
  end

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

97 98 99 100 101 102 103 104 105
    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

106 107 108 109 110 111 112
    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'
      expect(status.icon).to eq 'icon_status_canceled'
113
      expect(status.favicon).to eq 'favicon_status_canceled'
114 115 116 117 118 119 120 121 122
      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) }

123 124 125 126 127 128 129 130 131
    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

132 133 134 135 136 137 138
    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'
      expect(status.icon).to eq 'icon_status_running'
139
      expect(status.favicon).to eq 'favicon_status_running'
140 141 142 143 144 145 146 147 148
      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) }

149 150 151 152 153 154 155 156 157
    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

158 159 160 161 162 163 164
    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'
      expect(status.icon).to eq 'icon_status_pending'
165
      expect(status.favicon).to eq 'favicon_status_pending'
166 167 168 169 170 171 172 173 174
      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) }

175 176 177 178 179 180 181 182
    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

183 184 185 186 187 188 189
    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'
      expect(status.icon).to eq 'icon_status_skipped'
190
      expect(status.favicon).to eq 'favicon_status_skipped'
191 192 193 194 195 196 197 198 199 200
      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) }

201
      it 'matches correct core status' do
202
        expect(factory.core_status).to be_a Gitlab::Ci::Status::Manual
203 204 205 206
      end

      it 'matches correct extended statuses' do
        expect(factory.extended_statuses)
207
          .to eq [Gitlab::Ci::Status::Build::Play,
208
                  Gitlab::Ci::Status::Build::Action]
209 210
      end

211 212
      it 'fabricates action detailed status' do
        expect(status).to be_a Gitlab::Ci::Status::Build::Action
213 214 215 216
      end

      it 'fabricates status with correct details' do
        expect(status.text).to eq 'manual'
217
        expect(status.group).to eq 'manual'
218
        expect(status.icon).to eq 'icon_status_manual'
219
        expect(status.favicon).to eq 'favicon_status_manual'
220
        expect(status.label).to include 'manual play action'
221
        expect(status).to have_details
222
        expect(status.action_path).to include 'play'
223
      end
224 225 226

      context 'when user has ability to play action' do
        before do
227 228 229 230
          project.add_developer(user)

          create(:protected_branch, :developers_can_merge,
                 name: build.ref, project: project)
231 232 233 234 235 236 237 238 239 240 241 242
        end

        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
        it 'fabricates status that has no action' do
          expect(status).not_to have_action
        end
      end
243 244 245 246 247
    end

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

248
      it 'matches correct core status' do
249
        expect(factory.core_status).to be_a Gitlab::Ci::Status::Manual
250 251 252 253
      end

      it 'matches correct extended statuses' do
        expect(factory.extended_statuses)
254 255
          .to eq [Gitlab::Ci::Status::Build::Stop,
                  Gitlab::Ci::Status::Build::Action]
256 257
      end

258 259
      it 'fabricates action detailed status' do
        expect(status).to be_a Gitlab::Ci::Status::Build::Action
260 261
      end

262 263 264 265 266 267 268 269 270 271
      context 'when user is not allowed to execute manual action' do
        it 'fabricates status with correct details' do
          expect(status.text).to eq 'manual'
          expect(status.group).to eq 'manual'
          expect(status.icon).to eq 'icon_status_manual'
          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
272 273 274 275
      end
    end
  end
end