diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index bf67a33f2..c7b3ef454 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -6,16 +6,8 @@ module Concerns::Domain::ForceDelete end def schedule_force_delete - statuses << DomainStatus::FORCE_DELETE - statuses << DomainStatus::SERVER_RENEW_PROHIBITED - statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED - statuses << DomainStatus::SERVER_UPDATE_PROHIBITED - statuses << DomainStatus::PENDING_DELETE - - if (statuses & [DomainStatus::SERVER_HOLD, DomainStatus::CLIENT_HOLD]).empty? - statuses << DomainStatus::SERVER_MANUAL_INZONE - end - + preserve_current_statuses_for_force_delete + add_force_delete_statuses self.force_delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc .beginning_of_day stop_all_pending_actions @@ -25,13 +17,8 @@ module Concerns::Domain::ForceDelete def cancel_force_delete raise 'Domain must be discarded before cancelling force delete procedure' unless discarded? - statuses.delete(DomainStatus::FORCE_DELETE) - statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) - statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) - statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED) - statuses.delete(DomainStatus::PENDING_DELETE) - statuses.delete(DomainStatus::SERVER_MANUAL_INZONE) - + restore_statuses_before_force_delete + remove_force_delete_statuses self.force_delete_at = nil save(validate: false) end @@ -46,4 +33,34 @@ module Concerns::Domain::ForceDelete statuses.delete(DomainStatus::PENDING_RENEW) statuses.delete(DomainStatus::PENDING_CREATE) end + + def preserve_current_statuses_for_force_delete + self.statuses_before_force_delete = statuses + end + + def restore_statuses_before_force_delete + self.statuses = statuses_before_force_delete + self.statuses_before_force_delete = nil + end + + def add_force_delete_statuses + statuses << DomainStatus::FORCE_DELETE + statuses << DomainStatus::SERVER_RENEW_PROHIBITED + statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED + statuses << DomainStatus::SERVER_UPDATE_PROHIBITED + statuses << DomainStatus::PENDING_DELETE + + if (statuses & [DomainStatus::SERVER_HOLD, DomainStatus::CLIENT_HOLD]).empty? + statuses << DomainStatus::SERVER_MANUAL_INZONE + end + end + + def remove_force_delete_statuses + statuses.delete(DomainStatus::FORCE_DELETE) + statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) + statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) + statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED) + statuses.delete(DomainStatus::PENDING_DELETE) + statuses.delete(DomainStatus::SERVER_MANUAL_INZONE) + end end diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 328a45658..058a49bfb 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -20,13 +20,50 @@ class DomainForceDeleteTest < ActiveSupport::TestCase Setting.redemption_grace_period = @original_redemption_grace_period end + def test_scheduling_force_delete_adds_corresponding_statuses + statuses = [ + DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::SERVER_UPDATE_PROHIBITED, + DomainStatus::PENDING_DELETE, + ] + + @domain.schedule_force_delete + @domain.reload + assert (@domain.statuses & statuses) == statuses + end + + def test_scheduling_force_delete_stops_pending_actions + statuses = [ + DomainStatus::CLIENT_DELETE_PROHIBITED, + DomainStatus::SERVER_DELETE_PROHIBITED, + DomainStatus::PENDING_UPDATE, + DomainStatus::PENDING_TRANSFER, + DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_CREATE, + ] + + @domain.statuses = statuses + %w[other-status] + @domain.schedule_force_delete + @domain.reload + assert_not (@domain.statuses & statuses).any?, 'Pending actions should be stopped' + end + + def test_scheduling_force_delete_preserves_current_statuses + @domain.statuses = %w[test1 test2] + @domain.schedule_force_delete + @domain.reload + assert_equal %w[test1 test2], @domain.statuses_before_force_delete + end + def test_scheduling_force_delete_bypasses_validation @domain = domains(:invalid) @domain.schedule_force_delete assert @domain.force_delete_scheduled? end - def test_cancelling_force_delete_on_discarded_domain + def test_cancelling_force_delete_on_a_discarded_domain @domain.discard @domain.schedule_force_delete @domain.cancel_force_delete @@ -49,4 +86,34 @@ class DomainForceDeleteTest < ActiveSupport::TestCase @domain.cancel_force_delete assert_not @domain.force_delete_scheduled? end + + def test_cancelling_force_delete_removes_statuses_that_were_set_on_force_delete + statuses = [ + DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::SERVER_UPDATE_PROHIBITED, + DomainStatus::PENDING_DELETE, + DomainStatus::SERVER_MANUAL_INZONE + ] + @domain.discard + @domain.statuses = @domain.statuses + statuses + @domain.schedule_force_delete + + @domain.cancel_force_delete + @domain.reload + + assert (@domain.statuses & statuses).empty? + end + + def test_cancelling_force_delete_restores_statuses_that_a_domain_had_before_force_delete + @domain.discard + @domain.statuses_before_force_delete = ['test1', DomainStatus::DELETE_CANDIDATE] + + @domain.cancel_force_delete + @domain.reload + + assert_equal ['test1', DomainStatus::DELETE_CANDIDATE], @domain.statuses + assert_nil @domain.statuses_before_force_delete + end end