summaryrefslogtreecommitdiff
path: root/spec/services/ci/after_requeue_job_service_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/ci/after_requeue_job_service_spec.rb')
-rw-r--r--spec/services/ci/after_requeue_job_service_spec.rb320
1 files changed, 0 insertions, 320 deletions
diff --git a/spec/services/ci/after_requeue_job_service_spec.rb b/spec/services/ci/after_requeue_job_service_spec.rb
deleted file mode 100644
index e6f46fb9ebe..00000000000
--- a/spec/services/ci/after_requeue_job_service_spec.rb
+++ /dev/null
@@ -1,320 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Ci::AfterRequeueJobService, :sidekiq_inline do
- let_it_be(:project) { create(:project, :empty_repo) }
- let_it_be(:user) { project.first_owner }
-
- before_all do
- project.repository.create_file(user, 'init', 'init', message: 'init', branch_name: 'master')
- end
-
- subject(:service) { described_class.new(project, user) }
-
- context 'stage-dag mixed pipeline' do
- let(:config) do
- <<-EOY
- stages: [a, b, c]
-
- a1:
- stage: a
- script: exit $(($RANDOM % 2))
-
- a2:
- stage: a
- script: exit 0
- needs: [a1]
-
- a3:
- stage: a
- script: exit 0
- needs: [a2]
-
- b1:
- stage: b
- script: exit 0
- needs: []
-
- b2:
- stage: b
- script: exit 0
- needs: [a2]
-
- c1:
- stage: c
- script: exit 0
- needs: [b2]
-
- c2:
- stage: c
- script: exit 0
- EOY
- end
-
- let(:pipeline) do
- Ci::CreatePipelineService.new(project, user, { ref: 'master' }).execute(:push).payload
- end
-
- let(:a1) { find_job('a1') }
- let(:b1) { find_job('b1') }
-
- before do
- stub_ci_pipeline_yaml_file(config)
- check_jobs_statuses(
- a1: 'pending',
- a2: 'created',
- a3: 'created',
- b1: 'pending',
- b2: 'created',
- c1: 'created',
- c2: 'created'
- )
-
- b1.success!
- check_jobs_statuses(
- a1: 'pending',
- a2: 'created',
- a3: 'created',
- b1: 'success',
- b2: 'created',
- c1: 'created',
- c2: 'created'
- )
-
- a1.drop!
- check_jobs_statuses(
- a1: 'failed',
- a2: 'skipped',
- a3: 'skipped',
- b1: 'success',
- b2: 'skipped',
- c1: 'skipped',
- c2: 'skipped'
- )
-
- new_a1 = Ci::RetryJobService.new(project, user).clone!(a1)
- new_a1.enqueue!
- check_jobs_statuses(
- a1: 'pending',
- a2: 'skipped',
- a3: 'skipped',
- b1: 'success',
- b2: 'skipped',
- c1: 'skipped',
- c2: 'skipped'
- )
- end
-
- it 'marks subsequent skipped jobs as processable' do
- execute_after_requeue_service(a1)
-
- check_jobs_statuses(
- a1: 'pending',
- a2: 'created',
- a3: 'created',
- b1: 'success',
- b2: 'created',
- c1: 'created',
- c2: 'created'
- )
- end
-
- context 'when executed by a different user than the original owner' do
- let(:retryer) { create(:user).tap { |u| project.add_maintainer(u) } }
- let(:service) { described_class.new(project, retryer) }
-
- it 'reassigns jobs with updated statuses to the retryer' do
- expect(jobs_name_status_owner_needs).to contain_exactly(
- { 'name' => 'a1', 'status' => 'pending', 'user_id' => user.id, 'needs' => [] },
- { 'name' => 'a2', 'status' => 'skipped', 'user_id' => user.id, 'needs' => ['a1'] },
- { 'name' => 'a3', 'status' => 'skipped', 'user_id' => user.id, 'needs' => ['a2'] },
- { 'name' => 'b1', 'status' => 'success', 'user_id' => user.id, 'needs' => [] },
- { 'name' => 'b2', 'status' => 'skipped', 'user_id' => user.id, 'needs' => ['a2'] },
- { 'name' => 'c1', 'status' => 'skipped', 'user_id' => user.id, 'needs' => ['b2'] },
- { 'name' => 'c2', 'status' => 'skipped', 'user_id' => user.id, 'needs' => [] }
- )
-
- execute_after_requeue_service(a1)
-
- expect(jobs_name_status_owner_needs).to contain_exactly(
- { 'name' => 'a1', 'status' => 'pending', 'user_id' => user.id, 'needs' => [] },
- { 'name' => 'a2', 'status' => 'created', 'user_id' => retryer.id, 'needs' => ['a1'] },
- { 'name' => 'a3', 'status' => 'created', 'user_id' => retryer.id, 'needs' => ['a2'] },
- { 'name' => 'b1', 'status' => 'success', 'user_id' => user.id, 'needs' => [] },
- { 'name' => 'b2', 'status' => 'created', 'user_id' => retryer.id, 'needs' => ['a2'] },
- { 'name' => 'c1', 'status' => 'created', 'user_id' => retryer.id, 'needs' => ['b2'] },
- { 'name' => 'c2', 'status' => 'created', 'user_id' => retryer.id, 'needs' => [] }
- )
- end
- end
- end
-
- context 'stage-dag mixed pipeline with some same-stage needs' do
- let(:config) do
- <<-EOY
- stages: [a, b, c]
-
- a1:
- stage: a
- script: exit $(($RANDOM % 2))
-
- a2:
- stage: a
- script: exit 0
- needs: [a1]
-
- b1:
- stage: b
- script: exit 0
- needs: [b2]
-
- b2:
- stage: b
- script: exit 0
-
- c1:
- stage: c
- script: exit 0
- needs: [b2]
-
- c2:
- stage: c
- script: exit 0
- EOY
- end
-
- let(:pipeline) do
- Ci::CreatePipelineService.new(project, user, { ref: 'master' }).execute(:push).payload
- end
-
- let(:a1) { find_job('a1') }
-
- before do
- stub_ci_pipeline_yaml_file(config)
- check_jobs_statuses(
- a1: 'pending',
- a2: 'created',
- b1: 'created',
- b2: 'created',
- c1: 'created',
- c2: 'created'
- )
-
- a1.drop!
- check_jobs_statuses(
- a1: 'failed',
- a2: 'skipped',
- b1: 'skipped',
- b2: 'skipped',
- c1: 'skipped',
- c2: 'skipped'
- )
-
- new_a1 = Ci::RetryJobService.new(project, user).clone!(a1)
- new_a1.enqueue!
- check_jobs_statuses(
- a1: 'pending',
- a2: 'skipped',
- b1: 'skipped',
- b2: 'skipped',
- c1: 'skipped',
- c2: 'skipped'
- )
- end
-
- it 'marks subsequent skipped jobs as processable' do
- execute_after_requeue_service(a1)
-
- check_jobs_statuses(
- a1: 'pending',
- a2: 'created',
- b1: 'created',
- b2: 'created',
- c1: 'created',
- c2: 'created'
- )
- end
- end
-
- context 'with same-stage needs' do
- let(:config) do
- <<-EOY
- a:
- script: exit $(($RANDOM % 2))
-
- b:
- script: exit 0
- needs: [a]
-
- c:
- script: exit 0
- needs: [b]
- EOY
- end
-
- let(:pipeline) do
- Ci::CreatePipelineService.new(project, user, { ref: 'master' }).execute(:push).payload
- end
-
- let(:a) { find_job('a') }
-
- before do
- stub_ci_pipeline_yaml_file(config)
- check_jobs_statuses(
- a: 'pending',
- b: 'created',
- c: 'created'
- )
-
- a.drop!
- check_jobs_statuses(
- a: 'failed',
- b: 'skipped',
- c: 'skipped'
- )
-
- new_a = Ci::RetryJobService.new(project, user).clone!(a)
- new_a.enqueue!
- check_jobs_statuses(
- a: 'pending',
- b: 'skipped',
- c: 'skipped'
- )
- end
-
- it 'marks subsequent skipped jobs as processable' do
- execute_after_requeue_service(a)
-
- check_jobs_statuses(
- a: 'pending',
- b: 'created',
- c: 'created'
- )
- end
- end
-
- private
-
- def find_job(name)
- processables.find_by!(name: name)
- end
-
- def check_jobs_statuses(statuses)
- expect(processables.order(:name).pluck(:name, :status)).to contain_exactly(*statuses.stringify_keys.to_a)
- end
-
- def processables
- pipeline.processables.latest
- end
-
- def jobs_name_status_owner_needs
- processables.reload.map do |job|
- job.attributes.slice('name', 'status', 'user_id').merge('needs' => job.needs.map(&:name))
- end
- end
-
- def execute_after_requeue_service(processable)
- service.execute(processable)
- end
-end