summaryrefslogtreecommitdiff
path: root/spec/models/ci/processable_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/ci/processable_spec.rb')
-rw-r--r--spec/models/ci/processable_spec.rb94
1 files changed, 94 insertions, 0 deletions
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index ac1a8247aaa..71fef3c1b5b 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -14,6 +14,100 @@ RSpec.describe Ci::Processable do
it { is_expected.to delegate_method(:legacy_detached_merge_request_pipeline?).to(:pipeline) }
end
+ describe '#retryable' do
+ shared_examples_for 'retryable processable' do
+ context 'when processable is successful' do
+ before do
+ processable.success!
+ end
+
+ it { is_expected.to be_retryable }
+ end
+
+ context 'when processable is failed' do
+ before do
+ processable.drop!
+ end
+
+ it { is_expected.to be_retryable }
+ end
+
+ context 'when processable is canceled' do
+ before do
+ processable.cancel!
+ end
+
+ it { is_expected.to be_retryable }
+ end
+ end
+
+ shared_examples_for 'non-retryable processable' do
+ context 'when processable is skipped' do
+ before do
+ processable.skip!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+
+ context 'when processable is degenerated' do
+ before do
+ processable.degenerate!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+
+ context 'when a canceled processable has been retried already' do
+ before do
+ project.add_developer(create(:user))
+ processable.cancel!
+ processable.update!(retried: true)
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+ end
+
+ context 'when the processable is a build' do
+ subject(:processable) { create(:ci_build, pipeline: pipeline) }
+
+ context 'when the processable is retryable' do
+ it_behaves_like 'retryable processable'
+
+ context 'when deployment is rejected' do
+ before do
+ processable.drop!(:deployment_rejected)
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+
+ context 'when build is waiting for deployment approval' do
+ subject { build_stubbed(:ci_build, :manual, environment: 'production') }
+
+ before do
+ create(:deployment, :blocked, deployable: subject)
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+ end
+
+ context 'when the processable is non-retryable' do
+ it_behaves_like 'non-retryable processable'
+
+ context 'when processable is running' do
+ before do
+ processable.run!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+ end
+ end
+ end
+
describe '#aggregated_needs_names' do
let(:with_aggregated_needs) { pipeline.processables.select_with_aggregated_needs(project) }