2015-08-25 21:42:46 -04:00
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: builds
|
|
|
|
#
|
|
|
|
# id :integer not null, primary key
|
|
|
|
# project_id :integer
|
|
|
|
# status :string(255)
|
|
|
|
# finished_at :datetime
|
|
|
|
# trace :text
|
|
|
|
# created_at :datetime
|
|
|
|
# updated_at :datetime
|
|
|
|
# started_at :datetime
|
|
|
|
# runner_id :integer
|
|
|
|
# commit_id :integer
|
|
|
|
# coverage :float
|
|
|
|
# commands :text
|
|
|
|
# job_id :integer
|
|
|
|
# name :string(255)
|
|
|
|
# deploy :boolean default(FALSE)
|
|
|
|
# options :text
|
|
|
|
# allow_failure :boolean default(FALSE), not null
|
|
|
|
# stage :string(255)
|
|
|
|
# trigger_request_id :integer
|
|
|
|
#
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2015-09-09 08:17:16 -04:00
|
|
|
describe Ci::Build do
|
|
|
|
let(:project) { FactoryGirl.create :ci_project }
|
|
|
|
let(:commit) { FactoryGirl.create :ci_commit, project: project }
|
|
|
|
let(:build) { FactoryGirl.create :ci_build, commit: commit }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to belong_to(:commit) }
|
|
|
|
it { is_expected.to validate_presence_of :status }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
2015-09-10 09:52:52 -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? }
|
|
|
|
it { is_expected.to respond_to :trace_html }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
describe :first_pending do
|
2015-09-09 08:17:16 -04:00
|
|
|
let(:first) { FactoryGirl.create :ci_build, commit: commit, status: 'pending', created_at: Date.yesterday }
|
|
|
|
let(:second) { FactoryGirl.create :ci_build, commit: commit, status: 'pending' }
|
2015-08-25 21:42:46 -04:00
|
|
|
before { first; second }
|
2015-09-09 08:17:16 -04:00
|
|
|
subject { Ci::Build.first_pending }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_a(Ci::Build) }
|
|
|
|
it('returns with the first pending build') { is_expected.to eq(first) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :create_from do
|
|
|
|
before do
|
|
|
|
build.status = 'success'
|
|
|
|
build.save
|
|
|
|
end
|
2015-09-09 08:17:16 -04:00
|
|
|
let(:create_from_build) { Ci::Build.create_from build }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
2015-09-15 08:51:03 -04:00
|
|
|
it 'there should be a pending task' do
|
2015-09-09 08:17:16 -04:00
|
|
|
expect(Ci::Build.pending.count(:all)).to eq 0
|
2015-08-25 21:42:46 -04:00
|
|
|
create_from_build
|
2015-09-09 08:17:16 -04:00
|
|
|
expect(Ci::Build.pending.count(:all)).to be > 0
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :started? do
|
|
|
|
subject { build.started? }
|
|
|
|
|
|
|
|
context 'without started_at' do
|
|
|
|
before { build.started_at = nil }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
%w(running success failed).each do |status|
|
|
|
|
context "if build status is #{status}" do
|
|
|
|
before { build.status = status }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_truthy }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
%w(pending canceled).each do |status|
|
|
|
|
context "if build status is #{status}" do
|
|
|
|
before { build.status = status }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :active? do
|
|
|
|
subject { build.active? }
|
|
|
|
|
|
|
|
%w(pending running).each do |state|
|
|
|
|
context "if build.status is #{state}" do
|
|
|
|
before { build.status = state }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_truthy }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
%w(success failed canceled).each do |state|
|
|
|
|
context "if build.status is #{state}" do
|
|
|
|
before { build.status = state }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :complete? do
|
|
|
|
subject { build.complete? }
|
|
|
|
|
|
|
|
%w(success failed canceled).each do |state|
|
|
|
|
context "if build.status is #{state}" do
|
|
|
|
before { build.status = state }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_truthy }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
%w(pending running).each do |state|
|
|
|
|
context "if build.status is #{state}" do
|
|
|
|
before { build.status = state }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :ignored? do
|
|
|
|
subject { build.ignored? }
|
|
|
|
|
|
|
|
context 'if build is not allowed to fail' do
|
|
|
|
before { build.allow_failure = false }
|
|
|
|
|
|
|
|
context 'and build.status is success' do
|
|
|
|
before { build.status = 'success' }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'and build.status is failed' do
|
|
|
|
before { build.status = 'failed' }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'if build is allowed to fail' do
|
|
|
|
before { build.allow_failure = true }
|
|
|
|
|
|
|
|
context 'and build.status is success' do
|
|
|
|
before { build.status = 'success' }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_falsey }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'and build.status is failed' do
|
|
|
|
before { build.status = 'failed' }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_truthy }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :trace do
|
|
|
|
subject { build.trace_html }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_empty }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
context 'if build.trace contains text' do
|
|
|
|
let(:text) { 'example output' }
|
|
|
|
before { build.trace = text }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to include(text) }
|
2015-09-15 15:31:29 -04:00
|
|
|
it { expect(subject.length).to be >= text.length }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :timeout do
|
|
|
|
subject { build.timeout }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.project.timeout) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :duration do
|
|
|
|
subject { build.duration }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(120.0) }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
context 'if the building process has not started yet' do
|
|
|
|
before do
|
|
|
|
build.started_at = nil
|
|
|
|
build.finished_at = nil
|
|
|
|
end
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_nil }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'if the building process has started' do
|
|
|
|
before do
|
|
|
|
build.started_at = Time.now - 1.minute
|
|
|
|
build.finished_at = nil
|
|
|
|
end
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_a(Float) }
|
|
|
|
it { is_expected.to be > 0.0 }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :options do
|
2015-09-14 07:37:18 -04:00
|
|
|
let(:options) do
|
2015-08-25 21:42:46 -04:00
|
|
|
{
|
2015-09-14 07:37:18 -04:00
|
|
|
image: "ruby:2.1",
|
|
|
|
services: [
|
2015-08-25 21:42:46 -04:00
|
|
|
"postgres"
|
|
|
|
]
|
|
|
|
}
|
2015-09-14 07:37:18 -04:00
|
|
|
end
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
subject { build.options }
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(options) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :ref do
|
|
|
|
subject { build.ref }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.ref) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :sha do
|
|
|
|
subject { build.sha }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.sha) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :short_sha do
|
|
|
|
subject { build.short_sha }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.short_sha) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :before_sha do
|
|
|
|
subject { build.before_sha }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.before_sha) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :allow_git_fetch do
|
|
|
|
subject { build.allow_git_fetch }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(project.allow_git_fetch) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :project do
|
|
|
|
subject { build.project }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.project) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :project_id do
|
|
|
|
subject { build.project_id }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(commit.project_id) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :project_name do
|
|
|
|
subject { build.project_name }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(project.name) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :repo_url do
|
|
|
|
subject { build.repo_url }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(project.repo_url_with_auth) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe :extract_coverage do
|
|
|
|
context 'valid content & regex' do
|
|
|
|
subject { build.extract_coverage('Coverage 1033 / 1051 LOC (98.29%) covered', '\(\d+.\d+\%\) covered') }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(98.29) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'valid content & bad regex' do
|
|
|
|
subject { build.extract_coverage('Coverage 1033 / 1051 LOC (98.29%) covered', 'very covered') }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_nil }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'no coverage content & regex' do
|
|
|
|
subject { build.extract_coverage('No coverage for today :sad:', '\(\d+.\d+\%\) covered') }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to be_nil }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'multiple results in content & regex' do
|
|
|
|
subject { build.extract_coverage(' (98.39%) covered. (98.29%) covered', '\(\d+.\d+\%\) covered') }
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(98.29) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe :variables do
|
|
|
|
context 'returns variables' do
|
|
|
|
subject { build.variables }
|
|
|
|
|
2015-09-14 07:37:18 -04:00
|
|
|
let(:variables) do
|
2015-08-25 21:42:46 -04:00
|
|
|
[
|
2015-09-14 07:37:18 -04:00
|
|
|
{ key: :DB_NAME, value: 'postgres', public: true }
|
2015-08-25 21:42:46 -04:00
|
|
|
]
|
2015-09-14 07:37:18 -04:00
|
|
|
end
|
2015-08-25 21:42:46 -04:00
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(variables) }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
context 'and secure variables' do
|
2015-09-14 07:37:18 -04:00
|
|
|
let(:secure_variables) do
|
2015-08-25 21:42:46 -04:00
|
|
|
[
|
2015-09-14 07:37:18 -04:00
|
|
|
{ key: 'SECRET_KEY', value: 'secret_value', public: false }
|
2015-08-25 21:42:46 -04:00
|
|
|
]
|
2015-09-14 07:37:18 -04:00
|
|
|
end
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
before do
|
2015-09-09 08:17:16 -04:00
|
|
|
build.project.variables << Ci::Variable.new(key: 'SECRET_KEY', value: 'secret_value')
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(variables + secure_variables) }
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
context 'and trigger variables' do
|
2015-09-09 08:17:16 -04:00
|
|
|
let(:trigger) { FactoryGirl.create :ci_trigger, project: project }
|
|
|
|
let(:trigger_request) { FactoryGirl.create :ci_trigger_request_with_variables, commit: commit, trigger: trigger }
|
2015-09-14 07:37:18 -04:00
|
|
|
let(:trigger_variables) do
|
2015-08-25 21:42:46 -04:00
|
|
|
[
|
2015-09-14 07:37:18 -04:00
|
|
|
{ key: :TRIGGER_KEY, value: 'TRIGGER_VALUE', public: false }
|
2015-08-25 21:42:46 -04:00
|
|
|
]
|
2015-09-14 07:37:18 -04:00
|
|
|
end
|
2015-08-25 21:42:46 -04:00
|
|
|
|
|
|
|
before do
|
|
|
|
build.trigger_request = trigger_request
|
|
|
|
end
|
|
|
|
|
2015-09-10 09:52:52 -04:00
|
|
|
it { is_expected.to eq(variables + secure_variables + trigger_variables) }
|
2015-08-25 21:42:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|