pipeline_spec.rb 7.3 KB
Newer Older
D
Douwe Maan 已提交
1 2
require 'spec_helper'

3
describe Ci::Pipeline, models: true do
K
Kamil Trzcinski 已提交
4
  let(:project) { FactoryGirl.create :empty_project }
5
  let(:pipeline) { FactoryGirl.create :ci_empty_pipeline, project: project }
D
Douwe Maan 已提交
6

K
Kamil Trzcinski 已提交
7
  it { is_expected.to belong_to(:project) }
8 9
  it { is_expected.to belong_to(:user) }

10
  it { is_expected.to have_many(:statuses) }
K
Kamil Trzcinski 已提交
11
  it { is_expected.to have_many(:trigger_requests) }
D
Dmitriy Zaporozhets 已提交
12
  it { is_expected.to have_many(:builds) }
13

D
Dmitriy Zaporozhets 已提交
14
  it { is_expected.to validate_presence_of :sha }
K
Kamil Trzcinski 已提交
15
  it { is_expected.to validate_presence_of :status }
D
Douwe Maan 已提交
16

D
Dmitriy Zaporozhets 已提交
17 18 19
  it { is_expected.to respond_to :git_author_name }
  it { is_expected.to respond_to :git_author_email }
  it { is_expected.to respond_to :short_sha }
D
Douwe Maan 已提交
20

21
  describe '#valid_commit_sha' do
D
Douwe Maan 已提交
22 23
    context 'commit.sha can not start with 00000000' do
      before do
24 25
        pipeline.sha = '0' * 40
        pipeline.valid_commit_sha
D
Douwe Maan 已提交
26 27
      end

28
      it('commit errors should not be empty') { expect(pipeline.errors).not_to be_empty }
D
Douwe Maan 已提交
29 30 31
    end
  end

32
  describe '#short_sha' do
33
    subject { pipeline.short_sha }
D
Douwe Maan 已提交
34

D
Dmitriy Zaporozhets 已提交
35 36 37
    it 'has 8 items' do
      expect(subject.size).to eq(8)
    end
38
    it { expect(pipeline.sha).to start_with(subject) }
D
Douwe Maan 已提交
39 40
  end

41
  describe '#retried' do
42
    subject { pipeline.retried }
K
Kamil Trzcinski 已提交
43 44

    before do
45 46
      @build1 = FactoryGirl.create :ci_build, pipeline: pipeline, name: 'deploy'
      @build2 = FactoryGirl.create :ci_build, pipeline: pipeline, name: 'deploy'
K
Kamil Trzcinski 已提交
47 48 49
    end

    it 'returns old builds' do
50
      is_expected.to contain_exactly(@build1)
K
Kamil Trzcinski 已提交
51 52 53
    end
  end

D
Douwe Maan 已提交
54
  describe "coverage" do
K
Kamil Trzcinski 已提交
55
    let(:project) { FactoryGirl.create :empty_project, build_coverage_regex: "/.*/" }
56
    let(:pipeline) { FactoryGirl.create :ci_empty_pipeline, project: project }
D
Douwe Maan 已提交
57 58

    it "calculates average when there are two builds with coverage" do
59 60 61
      FactoryGirl.create :ci_build, name: "rspec", coverage: 30, pipeline: pipeline
      FactoryGirl.create :ci_build, name: "rubocop", coverage: 40, pipeline: pipeline
      expect(pipeline.coverage).to eq("35.00")
D
Douwe Maan 已提交
62 63 64
    end

    it "calculates average when there are two builds with coverage and one with nil" do
65 66 67 68
      FactoryGirl.create :ci_build, name: "rspec", coverage: 30, pipeline: pipeline
      FactoryGirl.create :ci_build, name: "rubocop", coverage: 40, pipeline: pipeline
      FactoryGirl.create :ci_build, pipeline: pipeline
      expect(pipeline.coverage).to eq("35.00")
D
Douwe Maan 已提交
69 70 71
    end

    it "calculates average when there are two builds with coverage and one is retried" do
72 73 74 75
      FactoryGirl.create :ci_build, name: "rspec", coverage: 30, pipeline: pipeline
      FactoryGirl.create :ci_build, name: "rubocop", coverage: 30, pipeline: pipeline
      FactoryGirl.create :ci_build, name: "rubocop", coverage: 40, pipeline: pipeline
      expect(pipeline.coverage).to eq("35.00")
D
Douwe Maan 已提交
76 77 78
    end

    it "calculates average when there is one build without coverage" do
79 80
      FactoryGirl.create :ci_build, pipeline: pipeline
      expect(pipeline.coverage).to be_nil
D
Douwe Maan 已提交
81 82
    end
  end
K
Kamil Trzcinski 已提交
83 84

  describe '#retryable?' do
85
    subject { pipeline.retryable? }
K
Kamil Trzcinski 已提交
86 87 88

    context 'no failed builds' do
      before do
89
        FactoryGirl.create :ci_build, name: "rspec", pipeline: pipeline, status: 'success'
K
Kamil Trzcinski 已提交
90 91 92 93 94 95 96 97 98
      end

      it 'be not retryable' do
        is_expected.to be_falsey
      end
    end

    context 'with failed builds' do
      before do
99 100
        FactoryGirl.create :ci_build, name: "rspec", pipeline: pipeline, status: 'running'
        FactoryGirl.create :ci_build, name: "rubocop", pipeline: pipeline, status: 'failed'
K
Kamil Trzcinski 已提交
101 102 103 104 105 106 107 108 109
      end

      it 'be retryable' do
        is_expected.to be_truthy
      end
    end
  end

  describe '#stages' do
110 111
    let(:pipeline2) { FactoryGirl.create :ci_pipeline, project: project }
    subject { CommitStatus.where(pipeline: [pipeline, pipeline2]).stages }
K
Kamil Trzcinski 已提交
112 113

    before do
114 115
      FactoryGirl.create :ci_build, pipeline: pipeline2, stage: 'test', stage_idx: 1
      FactoryGirl.create :ci_build, pipeline: pipeline, stage: 'build', stage_idx: 0
K
Kamil Trzcinski 已提交
116 117 118 119 120 121 122
    end

    it 'return all stages' do
      is_expected.to eq(%w(build test))
    end
  end

123
  describe '#update_counters' do
124
    let(:pipeline) { create :ci_empty_pipeline, project: project }
K
Kamil Trzcinski 已提交
125

126
    context 'updates' do
K
Kamil Trzcinski 已提交
127
      let(:current) { Time.now.change(usec: 0) }
128
      let(:build) { FactoryGirl.create :ci_build, pipeline: pipeline, started_at: current - 120, finished_at: current - 60 }
K
Kamil Trzcinski 已提交
129 130

      before do
131
        build.skip
K
Kamil Trzcinski 已提交
132 133 134
      end

      [:status, :started_at, :finished_at, :duration].each do |param|
135
        it "#{param}" do
136
          expect(pipeline.reload.send(param)).to eq(build.send(param))
K
Kamil Trzcinski 已提交
137 138 139 140
        end
      end
    end
  end
K
Kamil Trzcinski 已提交
141 142

  describe '#branch?' do
143
    subject { pipeline.branch? }
K
Kamil Trzcinski 已提交
144 145 146

    context 'is not a tag' do
      before do
147
        pipeline.tag = false
K
Kamil Trzcinski 已提交
148 149 150 151 152 153 154 155 156
      end

      it 'return true when tag is set to false' do
        is_expected.to be_truthy
      end
    end

    context 'is not a tag' do
      before do
157
        pipeline.tag = true
K
Kamil Trzcinski 已提交
158 159 160 161 162 163 164
      end

      it 'return false when tag is set to true' do
        is_expected.to be_falsey
      end
    end
  end
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

  describe '#manual_actions' do
    subject { pipeline.manual_actions }

    it 'when none defined' do
      is_expected.to be_empty
    end

    context 'when action defined' do
      let!(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy') }

      it 'returns one action' do
        is_expected.to contain_exactly(manual)
      end

      context 'there are multiple of the same name' do
        let!(:manual2) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy') }

        it 'returns latest one' do
          is_expected.to contain_exactly(manual2)
        end
      end
    end
  end
189

C
Connor Shea 已提交
190 191
  describe '#has_warnings?' do
    subject { pipeline.has_warnings? }
192 193 194

    context 'build which is allowed to fail fails' do
      before do
C
Connor Shea 已提交
195 196
        create :ci_build, :success, pipeline: pipeline, name: 'rspec'
        create :ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop'
197
      end
198

199 200 201 202 203 204 205
      it 'returns true' do
        is_expected.to be_truthy
      end
    end

    context 'build which is allowed to fail succeeds' do
      before do
C
Connor Shea 已提交
206 207
        create :ci_build, :success, pipeline: pipeline, name: 'rspec'
        create :ci_build, :allowed_to_fail, :success, pipeline: pipeline, name: 'rubocop'
208
      end
209

210 211 212 213
      it 'returns false' do
        is_expected.to be_falsey
      end
    end
C
Connor Shea 已提交
214 215 216 217 218 219 220 221 222 223 224 225

    context 'build is retried and succeeds' do
      before do
        create :ci_build, :success, pipeline: pipeline, name: 'rubocop'
        create :ci_build, :failed, pipeline: pipeline, name: 'rspec'
        create :ci_build, :success, pipeline: pipeline, name: 'rspec'
      end

      it 'returns false' do
        is_expected.to be_falsey
      end
    end
226
  end
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271

  describe '#status' do
    let!(:build) { create(:ci_build, :created, pipeline: pipeline, name: 'test') }

    subject { pipeline.reload.status }

    context 'on queuing' do
      before { build.queue }

      it { is_expected.to eq('pending') }
    end

    context 'on run' do
      before do
        build.queue
        build.run
      end

      it { is_expected.to eq('running') }
    end

    context 'on drop' do
      before do
        build.drop
      end

      it { is_expected.to eq('failed') }
    end

    context 'on success' do
      before do
        build.success
      end

      it { is_expected.to eq('success') }
    end

    context 'on cancel' do
      before do
        build.cancel
      end

      it { is_expected.to eq('canceled') }
    end
  end
D
Douwe Maan 已提交
272
end