diff options
Diffstat (limited to 'spec/services/ci/update_ci_ref_status_service_spec.rb')
-rw-r--r-- | spec/services/ci/update_ci_ref_status_service_spec.rb | 169 |
1 files changed, 0 insertions, 169 deletions
diff --git a/spec/services/ci/update_ci_ref_status_service_spec.rb b/spec/services/ci/update_ci_ref_status_service_spec.rb deleted file mode 100644 index 8b60586318d..00000000000 --- a/spec/services/ci/update_ci_ref_status_service_spec.rb +++ /dev/null @@ -1,169 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe Ci::UpdateCiRefStatusService do - describe '#call' do - subject { described_class.new(pipeline) } - - shared_examples 'creates ci_ref' do - it 'creates a ci_ref with the pipeline attributes' do - expect do - expect(subject.call).to eq(true) - end.to change { Ci::Ref.count }.by(1) - - created_ref = pipeline.reload.ref_status - %w[ref tag project status].each do |attr| - expect(created_ref[attr]).to eq(pipeline[attr]) - end - end - - it 'calls PipelineNotificationWorker pasing the ref_status' do - expect(PipelineNotificationWorker).to receive(:perform_async).with(pipeline.id, ref_status: pipeline.status) - - subject.call - end - end - - shared_examples 'updates ci_ref' do - where(:ref_status, :pipeline_status, :next_status) do - [ - %w[failed success fixed], - %w[failed failed failed], - %w[success success success], - %w[success failed failed] - ] - end - - with_them do - let(:ci_ref) { create(:ci_ref, status: ref_status) } - let(:pipeline) { create(:ci_pipeline, status: pipeline_status, project: ci_ref.project, ref: ci_ref.ref) } - - it 'sets ci_ref.status to next_status' do - expect do - expect(subject.call).to eq(true) - expect(ci_ref.reload.status).to eq(next_status) - end.not_to change { Ci::Ref.count } - end - - it 'calls PipelineNotificationWorker pasing the ref_status' do - expect(PipelineNotificationWorker).to receive(:perform_async).with(pipeline.id, ref_status: next_status) - - subject.call - end - end - end - - shared_examples 'does a noop' do - it "doesn't change ci_ref" do - expect do - expect do - expect(subject.call).to eq(false) - end.not_to change { ci_ref.reload.status } - end.not_to change { Ci::Ref.count } - end - - it "doesn't call PipelineNotificationWorker" do - expect(PipelineNotificationWorker).not_to receive(:perform_async) - - subject.call - end - end - - context "ci_ref doesn't exists" do - let(:pipeline) { create(:ci_pipeline, :success, ref: 'new-ref') } - - it_behaves_like 'creates ci_ref' - - context 'when an ActiveRecord::RecordNotUnique validation is raised' do - let(:ci_ref) { create(:ci_ref, status: 'failed') } - let(:pipeline) { create(:ci_pipeline, status: :success, project: ci_ref.project, ref: ci_ref.ref) } - - it 'reloads the ci_ref and retries once' do - subject.instance_variable_set("@ref", subject.send(:build_ref)) - - expect do - expect(subject.call).to eq(true) - end.not_to change { Ci::Ref.count } - expect(ci_ref.reload.status).to eq('fixed') - end - - it 'raises error on multiple retries' do - allow_any_instance_of(Ci::Ref).to receive(:update) - .and_raise(ActiveRecord::RecordNotUnique) - - expect { subject.call }.to raise_error(ActiveRecord::RecordNotUnique) - end - end - end - - context 'ci_ref exists' do - let!(:ci_ref) { create(:ci_ref, status: 'failed') } - let(:pipeline) { ci_ref.pipelines.first } - - it_behaves_like 'updates ci_ref' - - context 'pipeline status is invalid' do - let!(:pipeline) { create(:ci_pipeline, :running, project: ci_ref.project, ref: ci_ref.ref, tag: ci_ref.tag) } - - it_behaves_like 'does a noop' - end - - context 'newer pipeline finished' do - let(:newer_pipeline) { create(:ci_pipeline, :success, project: ci_ref.project, ref: ci_ref.ref, tag: ci_ref.tag) } - - before do - ci_ref.update!(last_updated_by_pipeline: newer_pipeline) - end - - it_behaves_like 'does a noop' - end - - context 'pipeline is retried' do - before do - ci_ref.update!(last_updated_by_pipeline: pipeline) - end - - it_behaves_like 'updates ci_ref' - end - - context 'ref is stale' do - let(:pipeline1) { create(:ci_pipeline, :success, project: ci_ref.project, ref: ci_ref.ref, tag: ci_ref.tag) } - let(:pipeline2) { create(:ci_pipeline, :success, project: ci_ref.project, ref: ci_ref.ref, tag: ci_ref.tag) } - - it 'reloads the ref and retry' do - service1 = described_class.new(pipeline1) - service2 = described_class.new(pipeline2) - - service2.send(:ref) - service1.call - expect(ci_ref.reload.status).to eq('fixed') - expect do - expect(service2.call).to eq(true) - # We expect 'success' in this case rather than 'fixed' because - # the ref is correctly reloaded on stale error. - expect(ci_ref.reload.status).to eq('success') - end.not_to change { Ci::Ref.count } - end - - it 'aborts when a newer pipeline finished' do - service1 = described_class.new(pipeline1) - service2 = described_class.new(pipeline2) - - service2.call - expect do - expect(service1.call).to eq(false) - expect(ci_ref.reload.status).to eq('fixed') - end.not_to change { Ci::Ref.count } - end - end - - context 'ref exists as both tag/branch and tag' do - let(:pipeline) { create(:ci_pipeline, :failed, project: ci_ref.project, ref: ci_ref.ref, tag: true) } - let!(:branch_pipeline) { create(:ci_pipeline, :success, project: ci_ref.project, ref: ci_ref.ref, tag: false) } - - it_behaves_like 'creates ci_ref' - end - end - end -end |