implement mechanism of save statuses for force delete and lock

This commit is contained in:
Oleg Hasjanov 2021-07-14 11:16:56 +03:00
parent ec90722bf0
commit 96bc237484
9 changed files with 142 additions and 23 deletions

View file

@ -2,10 +2,12 @@ module Domains
module CancelForceDelete module CancelForceDelete
class RemoveForceDeleteStatuses < Base class RemoveForceDeleteStatuses < Base
def execute def execute
domain.statuses.delete(DomainStatus::FORCE_DELETE) domain_statuses = [DomainStatus::FORCE_DELETE,
domain.statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) DomainStatus::SERVER_RENEW_PROHIBITED,
domain.statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) DomainStatus::SERVER_TRANSFER_PROHIBITED,
domain.statuses.delete(DomainStatus::CLIENT_HOLD) DomainStatus::CLIENT_HOLD]
rejected_statuses = domain.statuses.reject { |a| domain_statuses.include? a }
domain.statuses = rejected_statuses
domain.save(validate: false) domain.save(validate: false)
end end
end end

View file

@ -2,8 +2,9 @@ module Domains
module CancelForceDelete module CancelForceDelete
class RestoreStatusesBeforeForceDelete < Base class RestoreStatusesBeforeForceDelete < Base
def execute def execute
domain.statuses = domain.statuses_before_force_delete domain.statuses = domain.force_delete_domain_statuses_history || []
domain.statuses_before_force_delete = nil domain.statuses_before_force_delete = nil
domain.force_delete_domain_statuses_history = nil
domain.save(validate: false) domain.save(validate: false)
end end
end end

View file

@ -6,6 +6,7 @@ module Domains
DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze
def execute def execute
domain.force_delete_domain_statuses_history = domain.statuses
domain.statuses_before_force_delete = domain.statuses domain.statuses_before_force_delete = domain.statuses
domain.statuses |= STATUSES_TO_SET domain.statuses |= STATUSES_TO_SET
domain.save(validate: false) domain.save(validate: false)

View file

@ -1,6 +1,10 @@
module Domain::ForceDelete # rubocop:disable Metrics/ModuleLength module Domain::ForceDelete
extend ActiveSupport::Concern extend ActiveSupport::Concern
FORCE_DELETE_STATUSES = [DomainStatus::FORCE_DELETE,
DomainStatus::SERVER_RENEW_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze
included do included do
store_accessor :force_delete_data, store_accessor :force_delete_data,
:force_delete_type, :force_delete_type,

View file

@ -36,9 +36,10 @@ module Domain::RegistryLockable
transaction do transaction do
LOCK_STATUSES.each do |domain_status| LOCK_STATUSES.each do |domain_status|
statuses.delete(domain_status) statuses.delete([domain_status])
end end
self.locked_by_registrant_at = nil self.locked_by_registrant_at = nil
self.statuses = admin_store_statuses_history || []
alert_registrar_lock_changes!(lock: false) alert_registrar_lock_changes!(lock: false)
save! save!

View file

@ -553,8 +553,22 @@ class Domain < ApplicationRecord
statuses.include?(DomainStatus::FORCE_DELETE) statuses.include?(DomainStatus::FORCE_DELETE)
end end
def update_unless_locked_by_registrant(update)
update(admin_store_statuses_history: update) unless locked_by_registrant?
end
def update_not_by_locked_statuses(update)
return unless locked_by_registrant?
result = update.reject { |status| RegistryLockable::LOCK_STATUSES.include? status }
update(admin_store_statuses_history: result)
end
# special handling for admin changing status # special handling for admin changing status
def admin_status_update(update) def admin_status_update(update)
update_unless_locked_by_registrant(update)
update_not_by_locked_statuses(update)
# check for deleted status # check for deleted status
statuses.each do |s| statuses.each do |s|
unless update.include? s unless update.include? s

View file

@ -12,6 +12,41 @@ class ForceDeleteTest < ActionMailer::TestCase
Truemail.configure.default_validation_type = @old_validation_type Truemail.configure.default_validation_type = @old_validation_type
end end
def test_restore_domain_statuses_after_soft_force_delete
@domain.update(statuses: [DomainStatus::SERVER_RENEW_PROHIBITED])
@domain.schedule_force_delete(type: :soft)
assert @domain.force_delete_scheduled?
assert @domain.force_delete_domain_statuses_history.include? DomainStatus::SERVER_RENEW_PROHIBITED
@domain.cancel_force_delete
assert @domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED
end
# def test_restore_domain_statuses_if_status_set_after_fc
# @domain.schedule_force_delete(type: :soft)
# assert @domain.force_delete_scheduled?
# @domain.update(statuses: [DomainStatus::SERVER_RENEW_PROHIBITED])
# assert @domain.force_delete_domain_statuses_history.include? DomainStatus::SERVER_RENEW_PROHIBITED
# @domain.cancel_force_delete
# assert @domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED
# end
def test_clear_force_delete_domain_statuses_history
@domain.update(statuses: [DomainStatus::SERVER_RENEW_PROHIBITED])
@domain.schedule_force_delete(type: :soft)
assert @domain.force_delete_scheduled?
assert @domain.force_delete_domain_statuses_history.include? DomainStatus::SERVER_RENEW_PROHIBITED
@domain.cancel_force_delete
assert_nil @domain.force_delete_domain_statuses_history
end
def test_schedules_force_delete_fast_track def test_schedules_force_delete_fast_track
assert_not @domain.force_delete_scheduled? assert_not @domain.force_delete_scheduled?
travel_to Time.zone.parse('2010-07-05') travel_to Time.zone.parse('2010-07-05')
@ -56,7 +91,7 @@ class ForceDeleteTest < ActionMailer::TestCase
statuses_to_be_added = [ statuses_to_be_added = [
DomainStatus::FORCE_DELETE, DomainStatus::FORCE_DELETE,
DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_RENEW_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED
] ]
@domain.schedule_force_delete(type: :soft) @domain.schedule_force_delete(type: :soft)
@ -68,7 +103,7 @@ class ForceDeleteTest < ActionMailer::TestCase
statuses_to_be_added = [ statuses_to_be_added = [
DomainStatus::FORCE_DELETE, DomainStatus::FORCE_DELETE,
DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_RENEW_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED
] ]
@domain.schedule_force_delete(type: :fast_track) @domain.schedule_force_delete(type: :fast_track)
@ -79,7 +114,7 @@ class ForceDeleteTest < ActionMailer::TestCase
def test_scheduling_force_delete_allows_domain_deletion def test_scheduling_force_delete_allows_domain_deletion
statuses_to_be_removed = [ statuses_to_be_removed = [
DomainStatus::CLIENT_DELETE_PROHIBITED, DomainStatus::CLIENT_DELETE_PROHIBITED,
DomainStatus::SERVER_DELETE_PROHIBITED, DomainStatus::SERVER_DELETE_PROHIBITED
] ]
@domain.statuses = statuses_to_be_removed + %w[other-status] @domain.statuses = statuses_to_be_removed + %w[other-status]
@ -94,7 +129,7 @@ class ForceDeleteTest < ActionMailer::TestCase
DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_UPDATE,
DomainStatus::PENDING_TRANSFER, DomainStatus::PENDING_TRANSFER,
DomainStatus::PENDING_RENEW, DomainStatus::PENDING_RENEW,
DomainStatus::PENDING_CREATE, DomainStatus::PENDING_CREATE
] ]
@domain.statuses = statuses_to_be_removed + %w[other-status] @domain.statuses = statuses_to_be_removed + %w[other-status]
@ -122,7 +157,7 @@ class ForceDeleteTest < ActionMailer::TestCase
assert_not result.valid? assert_not result.valid?
assert_not @domain.force_delete_scheduled? assert_not @domain.force_delete_scheduled?
message = ["Force delete procedure cannot be scheduled while a domain is discarded"] message = ['Force delete procedure cannot be scheduled while a domain is discarded']
assert_equal message, result.errors.messages[:domain] assert_equal message, result.errors.messages[:domain]
end end
@ -149,9 +184,9 @@ class ForceDeleteTest < ActionMailer::TestCase
def test_force_delete_does_not_double_statuses def test_force_delete_does_not_double_statuses
statuses = [ statuses = [
DomainStatus::FORCE_DELETE, DomainStatus::FORCE_DELETE,
DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_RENEW_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED
] ]
@domain.statuses = @domain.statuses + statuses @domain.statuses = @domain.statuses + statuses
@domain.save! @domain.save!
@ -177,8 +212,8 @@ class ForceDeleteTest < ActionMailer::TestCase
def test_cancelling_force_delete_keeps_previous_statuses def test_cancelling_force_delete_keeps_previous_statuses
statuses = [ statuses = [
DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_RENEW_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED
] ]
@domain.statuses = statuses @domain.statuses = statuses
@ -479,7 +514,7 @@ class ForceDeleteTest < ActionMailer::TestCase
@bounced_mail.bounce_subtype = 'General' @bounced_mail.bounce_subtype = 'General'
@bounced_mail.action = 'failed' @bounced_mail.action = 'failed'
@bounced_mail.status = '5.1.1' @bounced_mail.status = '5.1.1'
@bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown' @bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown'
@bounced_mail.save! @bounced_mail.save!
end end
end end

View file

@ -11,12 +11,62 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase
refute(@domain.locked_by_registrant?) refute(@domain.locked_by_registrant?)
@domain.update(statuses: [DomainStatus::SERVER_TRANSFER_PROHIBITED]) @domain.update(statuses: [DomainStatus::SERVER_TRANSFER_PROHIBITED])
@domain.apply_registry_lock #Raise validation error @domain.apply_registry_lock # Raise validation error
check_statuses_lockable_domain check_statuses_lockable_domain
assert(@domain.locked_by_registrant?) assert(@domain.locked_by_registrant?)
end end
def test_remove_lockalable_statuses_after_admin_intervention
@domain.apply_registry_lock
assert @domain.locked_by_registrant?
assert_equal @domain.statuses.sort, Domain::RegistryLockable::LOCK_STATUSES.sort
deleted_status = @domain.statuses - [DomainStatus::SERVER_DELETE_PROHIBITED]
@domain.update(statuses: deleted_status)
assert_not @domain.locked_by_registrant?
@domain.apply_registry_lock
assert @domain.locked_by_registrant?
@domain.remove_registry_lock
assert_not @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED
end
def test_restore_domain_statuses_after_unlock
@domain.statuses = [DomainStatus::SERVER_UPDATE_PROHIBITED]
@domain.admin_store_statuses_history = [DomainStatus::SERVER_UPDATE_PROHIBITED]
@domain.save
assert @domain.admin_store_statuses_history.include? DomainStatus::SERVER_UPDATE_PROHIBITED
@domain.apply_registry_lock
assert @domain.locked_by_registrant?
assert_equal @domain.statuses.sort, Domain::RegistryLockable::LOCK_STATUSES.sort
@domain.remove_registry_lock
assert @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED
end
def test_add_additinal_status_for_locked_domain
@domain.apply_registry_lock
assert @domain.locked_by_registrant?
assert_equal @domain.statuses.sort, Domain::RegistryLockable::LOCK_STATUSES.sort
@domain.statuses += [DomainStatus::SERVER_RENEW_PROHIBITED]
@domain.admin_store_statuses_history = [DomainStatus::SERVER_RENEW_PROHIBITED]
@domain.save
@domain.remove_registry_lock
assert @domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED
assert_not @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED
end
def test_lockable_domain_if_remove_some_prohibited_status def test_lockable_domain_if_remove_some_prohibited_status
refute(@domain.locked_by_registrant?) refute(@domain.locked_by_registrant?)
@domain.apply_registry_lock @domain.apply_registry_lock
@ -74,7 +124,7 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase
@domain.remove_registry_lock @domain.remove_registry_lock
assert_equal(["ok"], @domain.statuses) assert_equal(['ok'], @domain.statuses)
refute(@domain.locked_by_registrant?) refute(@domain.locked_by_registrant?)
refute(@domain.locked_by_registrant_at) refute(@domain.locked_by_registrant_at)
end end
@ -100,8 +150,8 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase
def check_statuses_lockable_domain def check_statuses_lockable_domain
lock_statuses = [DomainStatus::SERVER_UPDATE_PROHIBITED, lock_statuses = [DomainStatus::SERVER_UPDATE_PROHIBITED,
DomainStatus::SERVER_DELETE_PROHIBITED, DomainStatus::SERVER_DELETE_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED] DomainStatus::SERVER_TRANSFER_PROHIBITED]
@domain.statuses.include? lock_statuses @domain.statuses.include? lock_statuses
end end

View file

@ -27,6 +27,17 @@ class DomainTest < ActiveSupport::TestCase
assert domains(:invalid).invalid? assert domains(:invalid).invalid?
end end
def test_valid_domain_statuses_history
@domain.force_delete_domain_statuses_history = [DomainStatus::SERVER_UPDATE_PROHIBITED,
DomainStatus::SERVER_TRANSFER_PROHIBITED]
@domain.admin_store_statuses_history = [DomainStatus::SERVER_UPDATE_PROHIBITED]
assert @domain.valid?
assert @domain.json_statuses_history['force_delete_domain_statuses_history'].include? 'serverUpdateProhibited'
assert @domain.json_statuses_history['force_delete_domain_statuses_history'].include? 'serverTransferProhibited'
assert_equal @domain.json_statuses_history['admin_store_statuses_history'], ['serverUpdateProhibited']
end
# https://www.internet.ee/domeenid/ee-domeenireeglid#domeeninimede-registreerimine # https://www.internet.ee/domeenid/ee-domeenireeglid#domeeninimede-registreerimine
def test_validates_name_format def test_validates_name_format
assert_equal dns_zones(:one).origin, 'test' assert_equal dns_zones(:one).origin, 'test'