debian-mirror-gitlab/spec/services/ci/process_build_service_spec.rb

150 lines
4.4 KiB
Ruby
Raw Normal View History

2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
require 'spec_helper'
2020-07-28 23:09:34 +05:30
RSpec.describe Ci::ProcessBuildService, '#execute' do
2018-12-05 23:21:45 +05:30
let(:user) { create(:user) }
let(:project) { create(:project) }
subject { described_class.new(project, user).execute(build, current_status) }
before do
project.add_maintainer(user)
end
2018-12-13 13:39:08 +05:30
context 'when build has on_success option' do
let(:build) { create(:ci_build, :created, when: :on_success, user: user, project: project) }
context 'when current status is success' do
let(:current_status) { 'success' }
it 'changes the build status' do
expect { subject }.to change { build.status }.to('pending')
2018-12-05 23:21:45 +05:30
end
end
2020-03-13 15:44:24 +05:30
context 'when current status is skipped' do
let(:current_status) { 'skipped' }
it 'changes the build status' do
expect { subject }.to change { build.status }.to('pending')
end
end
2018-12-13 13:39:08 +05:30
context 'when current status is failed' do
let(:current_status) { 'failed' }
it 'does not change the build status' do
expect { subject }.to change { build.status }.to('skipped')
2018-12-05 23:21:45 +05:30
end
end
end
2018-12-13 13:39:08 +05:30
context 'when build has on_failure option' do
let(:build) { create(:ci_build, :created, when: :on_failure, user: user, project: project) }
context 'when current status is success' do
let(:current_status) { 'success' }
it 'changes the build status' do
expect { subject }.to change { build.status }.to('skipped')
2018-12-05 23:21:45 +05:30
end
end
2018-12-13 13:39:08 +05:30
context 'when current status is failed' do
let(:current_status) { 'failed' }
it 'does not change the build status' do
expect { subject }.to change { build.status }.to('pending')
2018-12-05 23:21:45 +05:30
end
end
end
2018-12-13 13:39:08 +05:30
context 'when build has always option' do
let(:build) { create(:ci_build, :created, when: :always, user: user, project: project) }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
context 'when current status is success' do
let(:current_status) { 'success' }
it 'changes the build status' do
expect { subject }.to change { build.status }.to('pending')
2018-12-05 23:21:45 +05:30
end
end
2018-12-13 13:39:08 +05:30
context 'when current status is failed' do
let(:current_status) { 'failed' }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
it 'does not change the build status' do
expect { subject }.to change { build.status }.to('pending')
end
end
2018-12-05 23:21:45 +05:30
end
2018-12-13 13:39:08 +05:30
context 'when build has manual option' do
let(:build) { create(:ci_build, :created, :actionable, user: user, project: project) }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
context 'when current status is success' do
let(:current_status) { 'success' }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
it 'changes the build status' do
expect { subject }.to change { build.status }.to('manual')
end
end
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
context 'when current status is failed' do
let(:current_status) { 'failed' }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
it 'does not change the build status' do
expect { subject }.to change { build.status }.to('skipped')
end
end
2018-12-05 23:21:45 +05:30
end
context 'when build has delayed option' do
before do
allow(Ci::BuildScheduleWorker).to receive(:perform_at) { }
end
2018-12-13 13:39:08 +05:30
let(:build) { create(:ci_build, :created, :schedulable, user: user, project: project) }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
context 'when current status is success' do
let(:current_status) { 'success' }
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
it 'changes the build status' do
expect { subject }.to change { build.status }.to('scheduled')
2018-12-05 23:21:45 +05:30
end
2018-12-13 13:39:08 +05:30
end
2018-12-05 23:21:45 +05:30
2018-12-13 13:39:08 +05:30
context 'when current status is failed' do
let(:current_status) { 'failed' }
it 'does not change the build status' do
expect { subject }.to change { build.status }.to('skipped')
end
2018-12-05 23:21:45 +05:30
end
end
2020-03-13 15:44:24 +05:30
context 'when build is scheduled with DAG' do
2021-03-08 18:12:59 +05:30
using RSpec::Parameterized::TableSyntax
2020-03-13 15:44:24 +05:30
let(:pipeline) { create(:ci_pipeline, ref: 'master', project: project) }
2021-03-08 18:12:59 +05:30
let!(:build) { create(:ci_build, :created, when: build_when, pipeline: pipeline, scheduling_type: :dag) }
2020-03-13 15:44:24 +05:30
let!(:other_build) { create(:ci_build, :created, when: :on_success, pipeline: pipeline) }
let!(:build_on_other_build) { create(:ci_build_need, build: build, name: other_build.name) }
2021-03-08 18:12:59 +05:30
where(:build_when, :current_status, :after_status) do
:on_success | 'success' | 'pending'
:on_success | 'skipped' | 'skipped'
:manual | 'success' | 'manual'
:manual | 'skipped' | 'skipped'
:delayed | 'success' | 'manual'
:delayed | 'skipped' | 'skipped'
end
2020-03-13 15:44:24 +05:30
2021-03-08 18:12:59 +05:30
with_them do
it 'proceeds the build' do
expect { subject }.to change { build.status }.to(after_status)
2020-03-13 15:44:24 +05:30
end
end
end
2018-12-05 23:21:45 +05:30
end