diff options
Diffstat (limited to 'spec/workers/merge_request_cleanup_refs_worker_spec.rb')
-rw-r--r-- | spec/workers/merge_request_cleanup_refs_worker_spec.rb | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/spec/workers/merge_request_cleanup_refs_worker_spec.rb b/spec/workers/merge_request_cleanup_refs_worker_spec.rb index 7401c6dd4d7..1de927a81e4 100644 --- a/spec/workers/merge_request_cleanup_refs_worker_spec.rb +++ b/spec/workers/merge_request_cleanup_refs_worker_spec.rb @@ -3,18 +3,41 @@ require 'spec_helper' RSpec.describe MergeRequestCleanupRefsWorker do - describe '#perform' do - context 'when merge request exists' do - let(:merge_request) { create(:merge_request) } - let(:job_args) { merge_request.id } - - include_examples 'an idempotent worker' do - it 'calls MergeRequests::CleanupRefsService#execute' do - expect_next_instance_of(MergeRequests::CleanupRefsService, merge_request) do |svc| - expect(svc).to receive(:execute).and_call_original - end.twice - - subject + let(:worker) { described_class.new } + + describe '#perform_work' do + context 'when next cleanup schedule is found' do + let(:failed_count) { 0 } + let!(:cleanup_schedule) { create(:merge_request_cleanup_schedule, failed_count: failed_count) } + + it 'marks the cleanup schedule as completed on success' do + stub_cleanup_service(status: :success) + worker.perform_work + + expect(cleanup_schedule.reload).to be_completed + expect(cleanup_schedule.completed_at).to be_present + end + + context 'when service fails' do + before do + stub_cleanup_service(status: :error) + worker.perform_work + end + + it 'marks the cleanup schedule as unstarted and track the failure' do + expect(cleanup_schedule.reload).to be_unstarted + expect(cleanup_schedule.failed_count).to eq(1) + expect(cleanup_schedule.completed_at).to be_nil + end + + context "and cleanup schedule has already failed #{described_class::FAILURE_THRESHOLD} times" do + let(:failed_count) { described_class::FAILURE_THRESHOLD } + + it 'marks the cleanup schedule as failed and track the failure' do + expect(cleanup_schedule.reload).to be_failed + expect(cleanup_schedule.failed_count).to eq(described_class::FAILURE_THRESHOLD + 1) + expect(cleanup_schedule.completed_at).to be_nil + end end end @@ -23,20 +46,52 @@ RSpec.describe MergeRequestCleanupRefsWorker do stub_feature_flags(merge_request_refs_cleanup: false) end - it 'does not clean up the merge request' do + it 'does nothing' do expect(MergeRequests::CleanupRefsService).not_to receive(:new) - perform_multiple(1) + worker.perform_work end end end - context 'when merge request does not exist' do - it 'does not call MergeRequests::CleanupRefsService' do + context 'when there is no next cleanup schedule found' do + it 'does nothing' do expect(MergeRequests::CleanupRefsService).not_to receive(:new) - perform_multiple(1) + worker.perform_work + end + end + end + + describe '#remaining_work_count' do + let_it_be(:unstarted) { create_list(:merge_request_cleanup_schedule, 2) } + let_it_be(:running) { create_list(:merge_request_cleanup_schedule, 2, :running) } + let_it_be(:completed) { create_list(:merge_request_cleanup_schedule, 2, :completed) } + + it 'returns number of scheduled and unstarted cleanup schedule records' do + expect(worker.remaining_work_count).to eq(unstarted.count) + end + + context 'when count exceeds max_running_jobs' do + before do + create_list(:merge_request_cleanup_schedule, worker.max_running_jobs) + end + + it 'gets capped at max_running_jobs' do + expect(worker.remaining_work_count).to eq(worker.max_running_jobs) end end end + + describe '#max_running_jobs' do + it 'returns the value of MAX_RUNNING_JOBS' do + expect(worker.max_running_jobs).to eq(described_class::MAX_RUNNING_JOBS) + end + end + + def stub_cleanup_service(result) + expect_next_instance_of(MergeRequests::CleanupRefsService, cleanup_schedule.merge_request) do |svc| + expect(svc).to receive(:execute).and_return(result) + end + end end |