gitlab-org--gitlab-foss/spec/models/commit_status_spec.rb

227 lines
6.7 KiB
Ruby
Raw Normal View History

2015-10-06 06:01:16 -04:00
require 'spec_helper'
2015-12-09 04:50:51 -05:00
describe CommitStatus, models: true do
let(:project) { create(:project) }
let(:pipeline) do
create(:ci_pipeline, project: project, sha: project.commit.id)
end
let(:commit_status) { create(:commit_status, pipeline: pipeline) }
2015-10-06 06:01:16 -04:00
it { is_expected.to belong_to(:pipeline) }
2015-10-06 06:01:16 -04:00
it { is_expected.to belong_to(:user) }
2015-12-11 08:37:16 -05:00
it { is_expected.to belong_to(:project) }
2015-10-06 06:01:16 -04:00
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_inclusion_of(:status).in_array(%w(pending running failed success canceled)) }
it { is_expected.to delegate_method(:sha).to(:pipeline) }
it { is_expected.to delegate_method(:short_sha).to(:pipeline) }
2015-10-06 06:01:16 -04:00
it { is_expected.to respond_to :success? }
it { is_expected.to respond_to :failed? }
it { is_expected.to respond_to :running? }
it { is_expected.to respond_to :pending? }
2016-07-11 18:12:31 -04:00
describe '#author' do
2015-10-12 06:15:48 -04:00
subject { commit_status.author }
before { commit_status.author = User.new }
it { is_expected.to eq(commit_status.user) }
end
2016-07-11 18:12:31 -04:00
describe '#started?' do
2015-10-06 06:01:16 -04:00
subject { commit_status.started? }
context 'without started_at' do
before { commit_status.started_at = nil }
it { is_expected.to be_falsey }
end
2016-09-13 03:53:10 -04:00
%w[running success failed].each do |status|
2015-10-06 06:01:16 -04:00
context "if commit status is #{status}" do
before { commit_status.status = status }
it { is_expected.to be_truthy }
end
end
2016-09-13 03:53:10 -04:00
%w[pending canceled].each do |status|
2015-10-06 06:01:16 -04:00
context "if commit status is #{status}" do
before { commit_status.status = status }
it { is_expected.to be_falsey }
end
end
end
2016-07-11 18:12:31 -04:00
describe '#active?' do
2015-10-06 06:01:16 -04:00
subject { commit_status.active? }
2016-09-13 03:53:10 -04:00
%w[pending running].each do |state|
2015-10-06 06:01:16 -04:00
context "if commit_status.status is #{state}" do
before { commit_status.status = state }
it { is_expected.to be_truthy }
end
end
2016-09-13 03:53:10 -04:00
%w[success failed canceled].each do |state|
2015-10-06 06:01:16 -04:00
context "if commit_status.status is #{state}" do
before { commit_status.status = state }
it { is_expected.to be_falsey }
end
end
end
2016-07-11 18:12:31 -04:00
describe '#complete?' do
2015-10-06 06:01:16 -04:00
subject { commit_status.complete? }
2016-09-13 03:53:10 -04:00
%w[success failed canceled].each do |state|
2015-10-06 06:01:16 -04:00
context "if commit_status.status is #{state}" do
before { commit_status.status = state }
it { is_expected.to be_truthy }
end
end
2016-09-13 03:53:10 -04:00
%w[pending running].each do |state|
2015-10-06 06:01:16 -04:00
context "if commit_status.status is #{state}" do
before { commit_status.status = state }
it { is_expected.to be_falsey }
end
end
end
2016-07-11 18:12:31 -04:00
describe '#duration' do
2015-10-06 06:01:16 -04:00
subject { commit_status.duration }
it { is_expected.to eq(120.0) }
context 'if the building process has not started yet' do
before do
commit_status.started_at = nil
commit_status.finished_at = nil
end
it { is_expected.to be_nil }
end
context 'if the building process has started' do
before do
commit_status.started_at = Time.now - 1.minute
commit_status.finished_at = nil
end
it { is_expected.to be_a(Float) }
it { is_expected.to be > 0.0 }
end
end
2016-07-11 18:12:31 -04:00
describe '.latest' do
2015-10-06 06:01:16 -04:00
subject { CommitStatus.latest.order(:id) }
before do
@commit1 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'aa', ref: 'bb', status: 'running'
@commit2 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'cc', ref: 'cc', status: 'pending'
@commit3 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'aa', ref: 'cc', status: 'success'
@commit4 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'cc', ref: 'bb', status: 'success'
@commit5 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'aa', ref: 'bb', status: 'success'
2015-10-06 06:01:16 -04:00
end
it 'returns unique statuses' do
2016-04-11 10:55:40 -04:00
is_expected.to eq([@commit4, @commit5])
2015-10-06 06:01:16 -04:00
end
end
2016-07-11 18:12:31 -04:00
describe '.running_or_pending' do
2015-10-06 06:01:16 -04:00
subject { CommitStatus.running_or_pending.order(:id) }
before do
@commit1 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'aa', ref: 'bb', status: 'running'
@commit2 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'cc', ref: 'cc', status: 'pending'
@commit3 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'aa', ref: nil, status: 'success'
@commit4 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'dd', ref: nil, status: 'failed'
@commit5 = FactoryGirl.create :commit_status, pipeline: pipeline, name: 'ee', ref: nil, status: 'canceled'
2015-10-06 06:01:16 -04:00
end
it 'returns statuses that are running or pending' do
2015-10-06 06:01:16 -04:00
is_expected.to eq([@commit1, @commit2])
end
end
2016-04-16 16:43:40 -04:00
describe '#before_sha' do
subject { commit_status.before_sha }
context 'when no before_sha is set for pipeline' do
before { pipeline.before_sha = nil }
2016-04-16 16:43:40 -04:00
it 'returns blank sha' do
2016-04-16 16:43:40 -04:00
is_expected.to eq(Gitlab::Git::BLANK_SHA)
end
end
context 'for before_sha set for pipeline' do
2016-04-16 16:43:40 -04:00
let(:value) { '1234' }
before { pipeline.before_sha = value }
2016-04-16 16:43:40 -04:00
it 'returns the set value' do
2016-04-16 16:43:40 -04:00
is_expected.to eq(value)
end
end
end
describe '#stages' do
before do
2016-07-15 10:35:48 -04:00
create :commit_status, pipeline: pipeline, stage: 'build', name: 'linux', stage_idx: 0, status: 'success'
create :commit_status, pipeline: pipeline, stage: 'build', name: 'mac', stage_idx: 0, status: 'failed'
create :commit_status, pipeline: pipeline, stage: 'deploy', name: 'staging', stage_idx: 2, status: 'running'
create :commit_status, pipeline: pipeline, stage: 'test', name: 'rspec', stage_idx: 1, status: 'success'
2016-04-16 16:43:40 -04:00
end
context 'stages list' do
subject { CommitStatus.where(pipeline: pipeline).stages }
2016-04-16 16:43:40 -04:00
it 'returns ordered list of stages' do
2016-09-13 03:53:10 -04:00
is_expected.to eq(%w[build test deploy])
2016-04-16 16:43:40 -04:00
end
end
context 'stages with statuses' do
2016-07-15 10:35:48 -04:00
subject { CommitStatus.where(pipeline: pipeline).latest.stages_status }
2016-04-16 16:43:40 -04:00
it 'returns list of stages with statuses' do
2016-04-16 16:43:40 -04:00
is_expected.to eq({
'build' => 'failed',
'test' => 'success',
'deploy' => 'running'
})
end
2016-07-15 10:35:48 -04:00
context 'when build is retried' do
before do
create :commit_status, pipeline: pipeline, stage: 'build', name: 'mac', stage_idx: 0, status: 'success'
end
it 'ignores a previous state' do
is_expected.to eq({
'build' => 'success',
'test' => 'success',
'deploy' => 'running'
})
end
end
2016-04-16 16:43:40 -04:00
end
end
describe '#commit' do
it 'returns commit pipeline has been created for' do
expect(commit_status.commit).to eq project.commit
end
end
2015-10-06 06:01:16 -04:00
end