summaryrefslogtreecommitdiff
path: root/spec/workers/merge_request_cleanup_refs_worker_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/workers/merge_request_cleanup_refs_worker_spec.rb')
-rw-r--r--spec/workers/merge_request_cleanup_refs_worker_spec.rb89
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