2015-10-24 18:46:33 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2015-12-23 02:04:40 +05:30
|
|
|
describe CommitStatus, models: true do
|
2016-06-22 15:30:34 +05:30
|
|
|
let(:project) { create(:project) }
|
|
|
|
|
|
|
|
let(:pipeline) do
|
|
|
|
create(:ci_pipeline, project: project, sha: project.commit.id)
|
|
|
|
end
|
|
|
|
|
2016-11-03 12:29:30 +05:30
|
|
|
let(:commit_status) { create_status }
|
|
|
|
|
|
|
|
def create_status(args = {})
|
|
|
|
create(:commit_status, args.merge(pipeline: pipeline))
|
|
|
|
end
|
2015-10-24 18:46:33 +05:30
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
it { is_expected.to belong_to(:pipeline) }
|
2015-10-24 18:46:33 +05:30
|
|
|
it { is_expected.to belong_to(:user) }
|
2015-12-23 02:04:40 +05:30
|
|
|
it { is_expected.to belong_to(:project) }
|
|
|
|
|
2015-10-24 18:46:33 +05:30
|
|
|
it { is_expected.to validate_presence_of(:name) }
|
|
|
|
it { is_expected.to validate_inclusion_of(:status).in_array(%w(pending running failed success canceled)) }
|
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
it { is_expected.to delegate_method(:sha).to(:pipeline) }
|
|
|
|
it { is_expected.to delegate_method(:short_sha).to(:pipeline) }
|
2016-06-22 15:30:34 +05:30
|
|
|
|
2015-10-24 18:46:33 +05:30
|
|
|
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-08-24 12:49:21 +05:30
|
|
|
describe '#author' do
|
2015-10-24 18:46:33 +05:30
|
|
|
subject { commit_status.author }
|
|
|
|
before { commit_status.author = User.new }
|
|
|
|
|
|
|
|
it { is_expected.to eq(commit_status.user) }
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '#started?' do
|
2015-10-24 18:46:33 +05:30
|
|
|
subject { commit_status.started? }
|
|
|
|
|
|
|
|
context 'without started_at' do
|
|
|
|
before { commit_status.started_at = nil }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
%w[running success failed].each do |status|
|
2015-10-24 18:46:33 +05:30
|
|
|
context "if commit status is #{status}" do
|
|
|
|
before { commit_status.status = status }
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
%w[pending canceled].each do |status|
|
2015-10-24 18:46:33 +05:30
|
|
|
context "if commit status is #{status}" do
|
|
|
|
before { commit_status.status = status }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '#active?' do
|
2015-10-24 18:46:33 +05:30
|
|
|
subject { commit_status.active? }
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
%w[pending running].each do |state|
|
2015-10-24 18:46:33 +05:30
|
|
|
context "if commit_status.status is #{state}" do
|
|
|
|
before { commit_status.status = state }
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
%w[success failed canceled].each do |state|
|
2015-10-24 18:46:33 +05:30
|
|
|
context "if commit_status.status is #{state}" do
|
|
|
|
before { commit_status.status = state }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '#complete?' do
|
2015-10-24 18:46:33 +05:30
|
|
|
subject { commit_status.complete? }
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
%w[success failed canceled].each do |state|
|
2015-10-24 18:46:33 +05:30
|
|
|
context "if commit_status.status is #{state}" do
|
|
|
|
before { commit_status.status = state }
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
%w[pending running].each do |state|
|
2015-10-24 18:46:33 +05:30
|
|
|
context "if commit_status.status is #{state}" do
|
|
|
|
before { commit_status.status = state }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '#duration' do
|
2015-10-24 18:46:33 +05:30
|
|
|
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-06-22 15:30:34 +05:30
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '.latest' do
|
2015-10-24 18:46:33 +05:30
|
|
|
subject { CommitStatus.latest.order(:id) }
|
|
|
|
|
2016-11-03 12:29:30 +05:30
|
|
|
let(:statuses) do
|
|
|
|
[create_status(name: 'aa', ref: 'bb', status: 'running'),
|
|
|
|
create_status(name: 'cc', ref: 'cc', status: 'pending'),
|
|
|
|
create_status(name: 'aa', ref: 'cc', status: 'success'),
|
|
|
|
create_status(name: 'cc', ref: 'bb', status: 'success'),
|
|
|
|
create_status(name: 'aa', ref: 'bb', status: 'success')]
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns unique statuses' do
|
2016-11-03 12:29:30 +05:30
|
|
|
is_expected.to eq(statuses.values_at(3, 4))
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '.running_or_pending' do
|
2016-06-02 11:05:42 +05:30
|
|
|
subject { CommitStatus.running_or_pending.order(:id) }
|
2015-10-24 18:46:33 +05:30
|
|
|
|
2016-11-03 12:29:30 +05:30
|
|
|
let(:statuses) do
|
|
|
|
[create_status(name: 'aa', ref: 'bb', status: 'running'),
|
|
|
|
create_status(name: 'cc', ref: 'cc', status: 'pending'),
|
|
|
|
create_status(name: 'aa', ref: nil, status: 'success'),
|
|
|
|
create_status(name: 'dd', ref: nil, status: 'failed'),
|
|
|
|
create_status(name: 'ee', ref: nil, status: 'canceled')]
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns statuses that are running or pending' do
|
2016-11-03 12:29:30 +05:30
|
|
|
is_expected.to eq(statuses.values_at(0, 1))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.exclude_ignored' do
|
|
|
|
subject { CommitStatus.exclude_ignored.order(:id) }
|
|
|
|
|
|
|
|
let(:statuses) do
|
|
|
|
[create_status(when: 'manual', status: 'skipped'),
|
|
|
|
create_status(when: 'manual', status: 'success'),
|
|
|
|
create_status(when: 'manual', status: 'failed'),
|
|
|
|
create_status(when: 'on_failure', status: 'skipped'),
|
|
|
|
create_status(when: 'on_failure', status: 'success'),
|
|
|
|
create_status(when: 'on_failure', status: 'failed'),
|
|
|
|
create_status(allow_failure: true, status: 'success'),
|
|
|
|
create_status(allow_failure: true, status: 'failed'),
|
|
|
|
create_status(allow_failure: false, status: 'success'),
|
|
|
|
create_status(allow_failure: false, status: 'failed')]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns statuses without what we want to ignore' do
|
|
|
|
is_expected.to eq(statuses.values_at(1, 2, 4, 5, 6, 8, 9))
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
describe '#before_sha' do
|
|
|
|
subject { commit_status.before_sha }
|
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
context 'when no before_sha is set for pipeline' do
|
|
|
|
before { pipeline.before_sha = nil }
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns blank sha' do
|
2016-06-02 11:05:42 +05:30
|
|
|
is_expected.to eq(Gitlab::Git::BLANK_SHA)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
context 'for before_sha set for pipeline' do
|
2016-06-02 11:05:42 +05:30
|
|
|
let(:value) { '1234' }
|
2016-06-16 23:09:34 +05:30
|
|
|
before { pipeline.before_sha = value }
|
2015-10-24 18:46:33 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns the set value' do
|
2016-06-02 11:05:42 +05:30
|
|
|
is_expected.to eq(value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#stages' do
|
2015-10-24 18:46:33 +05:30
|
|
|
before do
|
2016-08-24 12:49:21 +05:30
|
|
|
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'
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
context 'stages list' do
|
2016-06-16 23:09:34 +05:30
|
|
|
subject { CommitStatus.where(pipeline: pipeline).stages }
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns ordered list of stages' do
|
2016-09-29 09:46:39 +05:30
|
|
|
is_expected.to eq(%w[build test deploy])
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'stages with statuses' do
|
2016-08-24 12:49:21 +05:30
|
|
|
subject { CommitStatus.where(pipeline: pipeline).latest.stages_status }
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns list of stages with statuses' do
|
2016-06-02 11:05:42 +05:30
|
|
|
is_expected.to eq({
|
|
|
|
'build' => 'failed',
|
|
|
|
'test' => 'success',
|
|
|
|
'deploy' => 'running'
|
|
|
|
})
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
|
|
|
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
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
end
|
2016-06-22 15:30:34 +05:30
|
|
|
|
|
|
|
describe '#commit' do
|
|
|
|
it 'returns commit pipeline has been created for' do
|
|
|
|
expect(commit_status.commit).to eq project.commit
|
|
|
|
end
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
describe '#group_name' do
|
|
|
|
subject { commit_status.group_name }
|
|
|
|
|
|
|
|
tests = {
|
|
|
|
'rspec:windows' => 'rspec:windows',
|
|
|
|
'rspec:windows 0' => 'rspec:windows 0',
|
|
|
|
'rspec:windows 0 test' => 'rspec:windows 0 test',
|
|
|
|
'rspec:windows 0 1' => 'rspec:windows',
|
|
|
|
'rspec:windows 0 1 name' => 'rspec:windows name',
|
|
|
|
'rspec:windows 0/1' => 'rspec:windows',
|
|
|
|
'rspec:windows 0/1 name' => 'rspec:windows name',
|
|
|
|
'rspec:windows 0:1' => 'rspec:windows',
|
|
|
|
'rspec:windows 0:1 name' => 'rspec:windows name',
|
|
|
|
'rspec:windows 10000 20000' => 'rspec:windows',
|
|
|
|
'rspec:windows 0 : / 1' => 'rspec:windows',
|
|
|
|
'rspec:windows 0 : / 1 name' => 'rspec:windows name',
|
|
|
|
'0 1 name ruby' => 'name ruby',
|
|
|
|
'0 :/ 1 name ruby' => 'name ruby'
|
|
|
|
}
|
|
|
|
|
|
|
|
tests.each do |name, group_name|
|
|
|
|
it "'#{name}' puts in '#{group_name}'" do
|
|
|
|
commit_status.name = name
|
|
|
|
|
|
|
|
is_expected.to eq(group_name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|