From ffde92954057226330799f10e928ae69b8b61663 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Fri, 12 Feb 2021 15:54:04 +0500 Subject: [PATCH] Set validation to prohibit ManualInzone with any of the *Hold statuses --- app/models/concerns/domain/deletable.rb | 6 ++++++ app/models/concerns/domain/force_delete.rb | 9 +++++++++ app/models/domain.rb | 12 ++++++------ test/models/domain/force_delete_test.rb | 13 +++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/models/concerns/domain/deletable.rb b/app/models/concerns/domain/deletable.rb index 81518c739..3c63cf96d 100644 --- a/app/models/concerns/domain/deletable.rb +++ b/app/models/concerns/domain/deletable.rb @@ -1,6 +1,12 @@ module Concerns::Domain::Deletable extend ActiveSupport::Concern + DELETE_STATUSES = [ + DomainStatus::PENDING_DELETE_CONFIRMATION, + DomainStatus::PENDING_DELETE, + DomainStatus::FORCE_DELETE, + ].freeze + private def delete_later diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 87e9a957b..5f09dd9fb 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -11,6 +11,11 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength lambda { where("(force_delete_data->>'contact_notification_sent_date') is null") } + + HOLD_STATUSES = [ + DomainStatus::SERVER_HOLD, + DomainStatus::CLIENT_HOLD, + ].freeze end class_methods do @@ -19,6 +24,10 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end end + def hold_status? + HOLD_STATUSES.any? { |status| statuses.include? status } + end + def notification_template(explicit: nil) reason = explicit&.downcase return reason if %w[invalid_email invalid_phone].include?(reason) diff --git a/app/models/domain.rb b/app/models/domain.rb index 53f0fa5b6..dc3ce79f5 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -107,13 +107,13 @@ class Domain < ApplicationRecord validate :status_is_consistant def status_is_consistant - has_error = (statuses.include?(DomainStatus::SERVER_HOLD) && statuses.include?(DomainStatus::SERVER_MANUAL_INZONE)) - unless has_error - if (statuses & [DomainStatus::PENDING_DELETE_CONFIRMATION, DomainStatus::PENDING_DELETE, DomainStatus::FORCE_DELETE]).any? - has_error = statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED - end + has_error = (hold_status? && statuses.include?(DomainStatus::SERVER_MANUAL_INZONE)) + unless has_error + if (statuses & DELETE_STATUSES).any? + has_error = statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED end - errors.add(:domains, I18n.t(:object_status_prohibits_operation)) if has_error + end + errors.add(:domains, I18n.t(:object_status_prohibits_operation)) if has_error end attr_accessor :is_admin diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 2bb1b5b8f..19338f495 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -234,6 +234,19 @@ class ForceDeleteTest < ActionMailer::TestCase assert_includes(@domain.statuses, asserted_status) end + def test_client_hold_prohibits_manual_inzone + @domain.update(valid_to: Time.zone.parse('2012-08-05')) + @domain.update(template_name: 'legal_person') + travel_to Time.zone.parse('2010-07-05') + @domain.schedule_force_delete(type: :soft) + travel_to Time.zone.parse('2010-08-21') + Domains::ClientHold::SetClientHold.run! + @domain.reload + + @domain.statuses << DomainStatus::SERVER_MANUAL_INZONE + assert_not @domain.valid? + end + def test_force_delete_soft_year_ahead_not_sets_client_hold_before_threshold asserted_status = DomainStatus::CLIENT_HOLD