debian-mirror-gitlab/spec/models/concerns/ci/has_status_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

420 lines
11 KiB
Ruby
Raw Permalink Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2016-06-02 11:05:42 +05:30
require 'spec_helper'
2023-04-23 21:23:45 +05:30
RSpec.describe Ci::HasStatus, feature_category: :continuous_integration do
2020-10-24 23:57:45 +05:30
describe '.composite_status' do
2019-12-21 20:55:43 +05:30
using RSpec::Parameterized::TableSyntax
2020-10-24 23:57:45 +05:30
subject { CommitStatus.composite_status }
2016-09-29 09:46:39 +05:30
2016-06-02 11:05:42 +05:30
shared_examples 'build status summary' do
context 'all successful' do
2016-11-03 12:29:30 +05:30
let!(:statuses) { Array.new(2) { create(type, status: :success) } }
2019-12-21 20:55:43 +05:30
2016-06-02 11:05:42 +05:30
it { is_expected.to eq 'success' }
end
context 'at least one failed' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success), create(type, status: :failed)]
end
it { is_expected.to eq 'failed' }
end
context 'at least one running' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success), create(type, status: :running)]
end
it { is_expected.to eq 'running' }
end
context 'at least one pending' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success), create(type, status: :pending)]
end
it { is_expected.to eq 'running' }
end
2020-03-13 15:44:24 +05:30
context 'all waiting for resource' do
let!(:statuses) do
[create(type, status: :waiting_for_resource), create(type, status: :waiting_for_resource)]
end
it { is_expected.to eq 'waiting_for_resource' }
end
context 'at least one waiting for resource' do
let!(:statuses) do
[create(type, status: :success), create(type, status: :waiting_for_resource)]
end
it { is_expected.to eq 'waiting_for_resource' }
end
2019-07-07 11:18:12 +05:30
context 'all preparing' do
let!(:statuses) do
[create(type, status: :preparing), create(type, status: :preparing)]
end
it { is_expected.to eq 'preparing' }
end
context 'at least one preparing' do
let!(:statuses) do
[create(type, status: :success), create(type, status: :preparing)]
end
it { is_expected.to eq 'preparing' }
end
2016-06-02 11:05:42 +05:30
context 'success and failed but allowed to fail' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success),
create(type, status: :failed, allow_failure: true)]
end
it { is_expected.to eq 'success' }
end
context 'one failed but allowed to fail' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
[create(type, status: :failed, allow_failure: true)]
end
2017-09-10 17:25:29 +05:30
it { is_expected.to eq 'success' }
2016-06-02 11:05:42 +05:30
end
context 'success and canceled' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success), create(type, status: :canceled)]
end
it { is_expected.to eq 'canceled' }
end
context 'one failed and one canceled' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :failed), create(type, status: :canceled)]
end
it { is_expected.to eq 'failed' }
end
context 'one failed but allowed to fail and one canceled' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :failed, allow_failure: true),
create(type, status: :canceled)]
end
it { is_expected.to eq 'canceled' }
end
context 'one running one canceled' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :running), create(type, status: :canceled)]
end
it { is_expected.to eq 'running' }
end
context 'all canceled' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :canceled), create(type, status: :canceled)]
end
2016-11-03 12:29:30 +05:30
2016-06-02 11:05:42 +05:30
it { is_expected.to eq 'canceled' }
end
context 'success and canceled but allowed to fail' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success),
create(type, status: :canceled, allow_failure: true)]
end
it { is_expected.to eq 'success' }
end
context 'one finished and second running but allowed to fail' do
2016-11-03 12:29:30 +05:30
let!(:statuses) do
2016-06-02 11:05:42 +05:30
[create(type, status: :success),
create(type, status: :running, allow_failure: true)]
end
it { is_expected.to eq 'running' }
end
2017-08-17 22:00:37 +05:30
context 'when one status finished and second is still created' do
let!(:statuses) do
[create(type, status: :success), create(type, status: :created)]
end
it { is_expected.to eq 'running' }
end
context 'when there is a manual status before created status' do
let!(:statuses) do
[create(type, status: :success),
create(type, status: :manual, allow_failure: false),
create(type, status: :created)]
end
it { is_expected.to eq 'manual' }
end
context 'when one status is a blocking manual action' do
let!(:statuses) do
[create(type, status: :failed),
create(type, status: :manual, allow_failure: false)]
end
it { is_expected.to eq 'manual' }
end
context 'when one status is a non-blocking manual action' do
let!(:statuses) do
[create(type, status: :failed),
create(type, status: :manual, allow_failure: true)]
end
it { is_expected.to eq 'failed' }
end
2016-06-02 11:05:42 +05:30
end
2020-10-24 23:57:45 +05:30
context 'ci build statuses' do
let(:type) { :ci_build }
2019-12-21 20:55:43 +05:30
2020-10-24 23:57:45 +05:30
it_behaves_like 'build status summary'
end
2019-12-21 20:55:43 +05:30
2020-10-24 23:57:45 +05:30
context 'generic commit statuses' do
let(:type) { :generic_commit_status }
2019-12-21 20:55:43 +05:30
2020-10-24 23:57:45 +05:30
it_behaves_like 'build status summary'
2016-06-02 11:05:42 +05:30
end
end
2017-08-17 22:00:37 +05:30
context 'for scope with one status' do
shared_examples 'having a job' do |status|
%i[ci_build generic_commit_status].each do |type|
context "when it's #{status} #{type} job" do
let!(:job) { create(type, status) }
describe ".#{status}" do
it 'contains the job' do
2017-09-10 17:25:29 +05:30
expect(CommitStatus.public_send(status).all)
.to contain_exactly(job)
2017-08-17 22:00:37 +05:30
end
end
describe '.relevant' do
if status == :created
it 'contains nothing' do
expect(CommitStatus.relevant.all).to be_empty
end
else
it 'contains the job' do
expect(CommitStatus.relevant.all).to contain_exactly(job)
end
end
end
end
end
end
2020-03-13 15:44:24 +05:30
%i[created waiting_for_resource preparing running pending success
2017-08-17 22:00:37 +05:30
failed canceled skipped].each do |status|
it_behaves_like 'having a job', status
end
end
context 'for scope with more statuses' do
shared_examples 'containing the job' do |status|
%i[ci_build generic_commit_status].each do |type|
context "when it's #{status} #{type} job" do
let!(:job) { create(type, status) }
it 'contains the job' do
is_expected.to contain_exactly(job)
end
end
end
end
shared_examples 'not containing the job' do |status|
%i[ci_build generic_commit_status].each do |type|
context "when it's #{status} #{type} job" do
let!(:job) { create(type, status) }
it 'contains nothing' do
is_expected.to be_empty
end
end
end
end
describe '.running_or_pending' do
subject { CommitStatus.running_or_pending }
%i[running pending].each do |status|
it_behaves_like 'containing the job', status
end
%i[created failed success].each do |status|
it_behaves_like 'not containing the job', status
end
end
2018-03-17 18:26:18 +05:30
describe '.alive' do
subject { CommitStatus.alive }
2020-03-13 15:44:24 +05:30
%i[running pending waiting_for_resource preparing created].each do |status|
2018-03-17 18:26:18 +05:30
it_behaves_like 'containing the job', status
end
%i[failed success].each do |status|
it_behaves_like 'not containing the job', status
end
end
2019-12-04 20:38:33 +05:30
describe '.alive_or_scheduled' do
subject { CommitStatus.alive_or_scheduled }
2020-03-13 15:44:24 +05:30
%i[running pending waiting_for_resource preparing created scheduled].each do |status|
2019-12-04 20:38:33 +05:30
it_behaves_like 'containing the job', status
end
%i[failed success canceled skipped].each do |status|
it_behaves_like 'not containing the job', status
end
end
2017-08-17 22:00:37 +05:30
describe '.created_or_pending' do
subject { CommitStatus.created_or_pending }
%i[created pending].each do |status|
it_behaves_like 'containing the job', status
end
%i[running failed success].each do |status|
it_behaves_like 'not containing the job', status
end
end
describe '.finished' do
subject { CommitStatus.finished }
%i[success failed canceled].each do |status|
it_behaves_like 'containing the job', status
end
%i[created running pending].each do |status|
it_behaves_like 'not containing the job', status
end
end
describe '.cancelable' do
subject { CommitStatus.cancelable }
2020-03-13 15:44:24 +05:30
%i[running pending waiting_for_resource preparing created scheduled].each do |status|
2017-08-17 22:00:37 +05:30
it_behaves_like 'containing the job', status
end
2018-12-05 23:21:45 +05:30
%i[failed success skipped canceled manual].each do |status|
2017-08-17 22:00:37 +05:30
it_behaves_like 'not containing the job', status
end
end
describe '.manual' do
subject { CommitStatus.manual }
%i[manual].each do |status|
it_behaves_like 'containing the job', status
end
%i[failed success skipped canceled].each do |status|
it_behaves_like 'not containing the job', status
end
end
2018-12-05 23:21:45 +05:30
describe '.scheduled' do
subject { CommitStatus.scheduled }
%i[scheduled].each do |status|
it_behaves_like 'containing the job', status
end
%i[failed success skipped canceled].each do |status|
it_behaves_like 'not containing the job', status
end
end
2021-10-27 15:23:28 +05:30
describe '.complete' do
subject { CommitStatus.complete }
described_class::COMPLETED_STATUSES.each do |status|
it_behaves_like 'containing the job', status
end
described_class::ACTIVE_STATUSES.each do |status|
it_behaves_like 'not containing the job', status
end
end
2021-11-18 22:05:49 +05:30
describe '.waiting_for_resource_or_upcoming' do
subject { CommitStatus.waiting_for_resource_or_upcoming }
%i[created scheduled waiting_for_resource].each do |status|
it_behaves_like 'containing the job', status
end
%i[running failed success canceled].each do |status|
it_behaves_like 'not containing the job', status
end
end
2017-08-17 22:00:37 +05:30
end
describe '::DEFAULT_STATUS' do
it 'is a status created' do
expect(described_class::DEFAULT_STATUS).to eq 'created'
end
end
describe '::BLOCKED_STATUS' do
it 'is a status manual' do
2018-12-05 23:21:45 +05:30
expect(described_class::BLOCKED_STATUS).to eq %w[manual scheduled]
end
end
describe 'blocked?' do
subject { object.blocked? }
%w[ci_pipeline ci_stage ci_build generic_commit_status].each do |type|
2023-07-09 08:55:56 +05:30
context "when #{type}" do
let(:object) { build(type, status: status) }
2018-12-05 23:21:45 +05:30
2023-07-09 08:55:56 +05:30
context 'when status is scheduled' do
let(:status) { :scheduled }
2018-12-05 23:21:45 +05:30
2023-07-09 08:55:56 +05:30
it { is_expected.to be_truthy }
end
2018-12-05 23:21:45 +05:30
2023-07-09 08:55:56 +05:30
context 'when status is manual' do
let(:status) { :manual }
2018-12-05 23:21:45 +05:30
2023-07-09 08:55:56 +05:30
it { is_expected.to be_truthy }
end
2018-12-05 23:21:45 +05:30
2023-07-09 08:55:56 +05:30
context 'when status is created' do
let(:status) { :created }
2018-12-05 23:21:45 +05:30
2023-07-09 08:55:56 +05:30
it { is_expected.to be_falsy }
end
2018-12-05 23:21:45 +05:30
end
end
end
2016-06-02 11:05:42 +05:30
end