From 6194c5c58a014178ff4d39188e76afd82da00321 Mon Sep 17 00:00:00 2001 From: oleghasjanov Date: Mon, 10 Feb 2025 13:42:19 +0200 Subject: [PATCH] fix: prevent client_hold status from returning after manual removal - Add flag in force_delete_data to track manual client_hold removal - Update ProcessClientHold to respect manual status removal - Add test to verify client_hold doesn't return after admin removes it When an admin manually removes the client_hold status from a domain, it should not be automatically re-added by the ProcessClientHold job. This change tracks manual removals and prevents the status from being re-added while maintaining the force delete process. --- .../client_hold/process_client_hold.rb | 6 ++++- test/models/domain/force_delete_test.rb | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/interactions/domains/client_hold/process_client_hold.rb b/app/interactions/domains/client_hold/process_client_hold.rb index 8b8d60403..71396e87b 100644 --- a/app/interactions/domains/client_hold/process_client_hold.rb +++ b/app/interactions/domains/client_hold/process_client_hold.rb @@ -5,16 +5,20 @@ module Domains class: Domain, description: 'Domain to set ClientHold on' + CLIENT_HOLD_SET_NOTE = "Has been set".freeze + # rubocop:disable Metrics/AbcSize def execute notify_on_grace_period if should_notify_on_soft_force_delete? return unless client_holdable? + return if domain.force_delete_data['client_hold_mandatory'].to_s.downcase == CLIENT_HOLD_SET_NOTE.downcase domain.statuses << DomainStatus::CLIENT_HOLD to_stdout("DomainCron.start_client_hold: #{domain.id} (#{domain.name}) #{domain.changes}\n") - + domain.force_delete_data['client_hold_mandatory'] = CLIENT_HOLD_SET_NOTE domain.save(validate: false) + notify_client_hold to_stdout("Successfully set client_hold on (#{domain.name})") diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index c889056a2..5d2445cc7 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -535,6 +535,31 @@ class ForceDeleteTest < ActionMailer::TestCase assert_enqueued_jobs 8 end + def test_client_hold_does_not_return_after_manual_removal + domain = domains(:shop) + domain.update(valid_to: Time.zone.parse('2010-10-05')) + + travel_to Time.zone.parse('2010-07-05') + domain.schedule_force_delete(type: :fast_track) + + travel_to Time.zone.parse('2010-07-25') + Domains::ClientHold::SetClientHold.run! + domain.reload + + assert_includes(domain.statuses, DomainStatus::CLIENT_HOLD) + assert_equal(domain.force_delete_data['client_hold_mandatory'], 'Has been set') + + domain.statuses.delete(DomainStatus::CLIENT_HOLD) + domain.save! + domain.reload + + Domains::ClientHold::SetClientHold.run! + domain.reload + + assert_not_includes(domain.statuses, DomainStatus::CLIENT_HOLD) + assert_equal(domain.force_delete_data['client_hold_mandatory'], 'Has been set') + end + def prepare_bounced_email_address(email) @bounced_mail = BouncedMailAddress.new @bounced_mail.email = email