diff options
Diffstat (limited to 'spec/workers/environments/stop_job_failed_worker_spec.rb')
-rw-r--r-- | spec/workers/environments/stop_job_failed_worker_spec.rb | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/spec/workers/environments/stop_job_failed_worker_spec.rb b/spec/workers/environments/stop_job_failed_worker_spec.rb new file mode 100644 index 00000000000..21d952dff30 --- /dev/null +++ b/spec/workers/environments/stop_job_failed_worker_spec.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Environments::StopJobFailedWorker, feature_category: :continuous_delivery do + describe '#perform' do + let_it_be_with_refind(:environment) { create(:environment, state: :stopping) } + + subject { described_class.new.perform(job.id) } + + shared_examples_for 'recovering a stuck stopping environment' do + context 'when the job is not a stop job' do + let(:job) { non_stop_job } + + it 'does not recover the environment' do + expect { subject }.not_to change { environment.reload.state } + end + end + + context 'when the stop job is not failed' do + let(:job) { stop_job } + + before do + job.update!(status: :success) + end + + it 'does not recover the environment' do + expect { subject }.not_to change { environment.reload.state } + end + end + + context 'when the stop job is failed' do + let(:job) { stop_job } + + it 'recovers the environment' do + expect { subject } + .to change { environment.reload.state } + .from('stopping') + .to('available') + end + end + + context 'when there is no environment' do + let(:job) { stop_job } + + before do + environment.destroy! + end + + it 'does not cause an error' do + expect { subject }.not_to raise_error + end + end + end + + context 'with build job' do + let!(:stop_job) do + create( + :ci_build, + :stop_review_app, + environment: environment.name, + project: environment.project, + status: :failed + ) + end + + let!(:non_stop_job) do + create( + :ci_build, + :start_review_app, + environment: environment.name, + project: environment.project, + status: :failed + ) + end + + it_behaves_like 'recovering a stuck stopping environment' + end + + context 'with bridge job' do + let!(:stop_job) do + create( + :ci_bridge, + :stop_review_app, + environment: environment.name, + project: environment.project, + status: :failed + ) + end + + let!(:non_stop_job) do + create( + :ci_bridge, + :start_review_app, + environment: environment.name, + project: environment.project, + status: :failed + ) + end + + it_behaves_like 'recovering a stuck stopping environment' + end + + context 'when job does not exist' do + it 'does not raise exception' do + expect { described_class.new.perform(non_existing_record_id) } + .not_to raise_error + end + end + end +end |