From 4b980a07f52a7f785a74facdf97211d07657dab9 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Mon, 9 Nov 2020 17:26:07 +0500 Subject: [PATCH 1/7] Add basic interactor/organizer support --- Gemfile | 2 ++ Gemfile.lock | 6 ++++ app/interactors/domain/force_delete/base.rb | 16 +++++++++ .../domain/force_delete/check_discarded.rb | 14 ++++++++ .../domain/force_delete/post_set_process.rb | 21 +++++++++++ .../domain/force_delete/prepare_domain.rb | 14 ++++++++ .../domain/force_delete/set_status.rb | 36 +++++++++++++++++++ app/models/concerns/domain/force_delete.rb | 4 +++ 8 files changed, 113 insertions(+) create mode 100644 app/interactors/domain/force_delete/base.rb create mode 100644 app/interactors/domain/force_delete/check_discarded.rb create mode 100644 app/interactors/domain/force_delete/post_set_process.rb create mode 100644 app/interactors/domain/force_delete/prepare_domain.rb create mode 100644 app/interactors/domain/force_delete/set_status.rb diff --git a/Gemfile b/Gemfile index 25c3eafff..c4f5a7cf8 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,8 @@ source 'https://rubygems.org' # core gem 'bootsnap', '>= 1.1.0', require: false +gem 'interactor', '~> 3.0' +gem 'interactor-rails', '~> 2.0' gem 'iso8601', '0.12.1' # for dates and times gem 'rails', '~> 6.0' gem 'rest-client' diff --git a/Gemfile.lock b/Gemfile.lock index c628257a2..cc59a8f41 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -251,6 +251,10 @@ GEM i18n (1.8.5) concurrent-ruby (~> 1.0) i18n_data (0.10.0) + interactor (3.1.2) + interactor-rails (2.2.1) + interactor (~> 3.0) + rails (>= 4.2) isikukood (0.1.2) iso8601 (0.12.1) jquery-rails (4.4.0) @@ -544,6 +548,8 @@ DEPENDENCIES figaro (= 1.1.1) grape haml (~> 5.0) + interactor (~> 3.0) + interactor-rails (~> 2.0) isikukood iso8601 (= 0.12.1) jquery-rails diff --git a/app/interactors/domain/force_delete/base.rb b/app/interactors/domain/force_delete/base.rb new file mode 100644 index 000000000..79de3cf2f --- /dev/null +++ b/app/interactors/domain/force_delete/base.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDelete + class Base + include Interactor::Organizer + + # As per https://github.com/collectiveidea/interactor#organizers + + organize Domain::ForceDelete::CheckDiscarded, + Domain::ForceDelete::PrepareDomain, + Domain::ForceDelete::SetStatus, + Domain::ForceDelete::PostSetProcess, + Domain::ForceDelete::NotifyRegistrar, + Domain::ForceDelete::NotifyByEmail + end + end +end diff --git a/app/interactors/domain/force_delete/check_discarded.rb b/app/interactors/domain/force_delete/check_discarded.rb new file mode 100644 index 000000000..a13c16778 --- /dev/null +++ b/app/interactors/domain/force_delete/check_discarded.rb @@ -0,0 +1,14 @@ +class Domain + module ForceDelete + class CheckDiscarded + include Interactor + + def call + return unless context.domain.discarded? + + raise StandardError, + 'Force delete procedure cannot be scheduled while a domain is discarded' + end + end + end +end diff --git a/app/interactors/domain/force_delete/post_set_process.rb b/app/interactors/domain/force_delete/post_set_process.rb new file mode 100644 index 000000000..a2fc531b2 --- /dev/null +++ b/app/interactors/domain/force_delete/post_set_process.rb @@ -0,0 +1,21 @@ +class Domain + module ForceDelete + class PostSetProcess + include Interactor + + def call + statuses = context.domain.statuses + # Stop all pending actions + statuses.delete(DomainStatus::PENDING_UPDATE) + statuses.delete(DomainStatus::PENDING_TRANSFER) + statuses.delete(DomainStatus::PENDING_RENEW) + statuses.delete(DomainStatus::PENDING_CREATE) + + # Allow deletion + statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) + statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) + context.domain.save(validate: false) + end + end + end +end diff --git a/app/interactors/domain/force_delete/prepare_domain.rb b/app/interactors/domain/force_delete/prepare_domain.rb new file mode 100644 index 000000000..4b3b83064 --- /dev/null +++ b/app/interactors/domain/force_delete/prepare_domain.rb @@ -0,0 +1,14 @@ +class Domain + module ForceDelete + class PrepareDomain + include Interactor + + def call + domain = context.domain + domain.statuses_before_force_delete = domain.statuses + domain.statuses |= domain.class.STATUSES_TO_SET + domain.save(validate: false) + end + end + end +end diff --git a/app/interactors/domain/force_delete/set_status.rb b/app/interactors/domain/force_delete/set_status.rb new file mode 100644 index 000000000..7ce481623 --- /dev/null +++ b/app/interactors/domain/force_delete/set_status.rb @@ -0,0 +1,36 @@ +class Domain + module ForceDelete + class SetStatus + include Interactor + + def call + domain.force_delete_type = context.type + context.type == :fast_track ? force_delete_fast_track : force_delete_soft + domain.save(validate: false) + end + + private + + def domain + @domain |= context.domain + end + + def force_delete_fast_track + domain.force_delete_date = force_delete_fast_track_start_date + 1.day + domain.force_delete_start = Time.zone.today + 1.day + end + + def force_delete_soft + years = (valid_to.to_date - Time.zone.today).to_i / 365 + soft_forcedelete_dates(years) + end + + def soft_forcedelete_dates(years) + domain.force_delete_start = domain.valid_to - years.years + domain.force_delete_date = domain.force_delete_start + + Setting.expire_warning_period.days + + Setting.redemption_grace_period.days + end + end + end +end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index f3bf96975..c6f9b598f 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -7,6 +7,10 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength :contact_notification_sent_date, :template_name + STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze + scope :notification_not_sent, lambda { where("(force_delete_data->>'contact_notification_sent_date') is null") From 03754b542b917fb6f10209f40a20ee038b610f5b Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Tue, 10 Nov 2020 13:50:38 +0500 Subject: [PATCH 2/7] Complete creation of interactors --- .../admin/domains/force_delete_controller.rb | 18 ++++++----- .../domain/force_delete/check_discarded.rb | 4 +-- .../domain/force_delete/notify_by_email.rb | 31 +++++++++++++++++++ .../domain/force_delete/notify_registrar.rb | 16 ++++++++++ .../domain/force_delete/prepare_domain.rb | 6 +++- .../domain/force_delete/set_status.rb | 5 ++- app/models/concerns/domain/force_delete.rb | 15 +++++---- 7 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 app/interactors/domain/force_delete/notify_by_email.rb create mode 100644 app/interactors/domain/force_delete/notify_registrar.rb diff --git a/app/controllers/admin/domains/force_delete_controller.rb b/app/controllers/admin/domains/force_delete_controller.rb index 6a111926f..ca5588964 100644 --- a/app/controllers/admin/domains/force_delete_controller.rb +++ b/app/controllers/admin/domains/force_delete_controller.rb @@ -5,19 +5,21 @@ module Admin authorize! :manage, domain domain.transaction do - domain.schedule_force_delete(type: force_delete_type) - domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', - domain_name: domain.name, - outzone_date: domain.outzone_date, - purge_date: domain.purge_date)) - - notify_by_email if notify_by_email? + # domain.schedule_force_delete(type: force_delete_type) + # domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', + # domain_name: domain.name, + # outzone_date: domain.outzone_date, + # purge_date: domain.purge_date)) # added to interactor + # + # notify_by_email if notify_by_email? # added to interactor + Domain::ForceDelete::Base.call(domain: domain, type: force_delete_type) end redirect_to edit_admin_domain_url(domain), notice: t('.scheduled') end def notify_by_email + # added to interactor if force_delete_type == :fast_track send_email domain.update(contact_notification_sent_date: Time.zone.today) @@ -39,10 +41,12 @@ module Admin end def notify_by_email? + # added to interactor ActiveRecord::Type::Boolean.new.cast(params[:notify_by_email]) end def send_email + # added to interactor DomainDeleteMailer.forced(domain: domain, registrar: domain.registrar, registrant: domain.registrant, diff --git a/app/interactors/domain/force_delete/check_discarded.rb b/app/interactors/domain/force_delete/check_discarded.rb index a13c16778..ac2cd31b6 100644 --- a/app/interactors/domain/force_delete/check_discarded.rb +++ b/app/interactors/domain/force_delete/check_discarded.rb @@ -6,8 +6,8 @@ class Domain def call return unless context.domain.discarded? - raise StandardError, - 'Force delete procedure cannot be scheduled while a domain is discarded' + message = 'Force delete procedure cannot be scheduled while a domain is discarded' + context.fail!( message: message ) end end end diff --git a/app/interactors/domain/force_delete/notify_by_email.rb b/app/interactors/domain/force_delete/notify_by_email.rb new file mode 100644 index 000000000..949dd5838 --- /dev/null +++ b/app/interactors/domain/force_delete/notify_by_email.rb @@ -0,0 +1,31 @@ +class Domain + module ForceDelete + class NotifyByEmail + include Interactor + + def call + return unless notify_by_email? + + if context.type == :fast_track + send_email + context.domain.update(contact_notification_sent_date: Time.zone.today) + else + context.domain.update(template_name: context.domain.notification_template) + end + end + + private + + def notify_by_email? + ActiveRecord::Type::Boolean.new.cast(params[:notify_by_email]) + end + + def send_email + DomainDeleteMailer.forced(domain: context.domain, + registrar: context.domain.registrar, + registrant: context.domain.registrant, + template_name: context.domain.notification_template).deliver_now + end + end + end +end diff --git a/app/interactors/domain/force_delete/notify_registrar.rb b/app/interactors/domain/force_delete/notify_registrar.rb new file mode 100644 index 000000000..345f4d7eb --- /dev/null +++ b/app/interactors/domain/force_delete/notify_registrar.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDelete + class NotifyRegistrar + include Interactor + + def call + domain = context.domain + + domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', + domain_name: domain.name, + outzone_date: domain.outzone_date, + purge_date: domain.purge_date)) + end + end + end +end diff --git a/app/interactors/domain/force_delete/prepare_domain.rb b/app/interactors/domain/force_delete/prepare_domain.rb index 4b3b83064..3bc764dc8 100644 --- a/app/interactors/domain/force_delete/prepare_domain.rb +++ b/app/interactors/domain/force_delete/prepare_domain.rb @@ -3,10 +3,14 @@ class Domain class PrepareDomain include Interactor + STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze + def call domain = context.domain domain.statuses_before_force_delete = domain.statuses - domain.statuses |= domain.class.STATUSES_TO_SET + domain.statuses |= STATUSES_TO_SET domain.save(validate: false) end end diff --git a/app/interactors/domain/force_delete/set_status.rb b/app/interactors/domain/force_delete/set_status.rb index 7ce481623..2a6c49daa 100644 --- a/app/interactors/domain/force_delete/set_status.rb +++ b/app/interactors/domain/force_delete/set_status.rb @@ -16,7 +16,10 @@ class Domain end def force_delete_fast_track - domain.force_delete_date = force_delete_fast_track_start_date + 1.day + domain.force_delete_date = Time.zone.today + + Setting.expire_warning_period.days + + Setting.redemption_grace_period.days + + 1.day domain.force_delete_start = Time.zone.today + 1.day end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index c6f9b598f..768b1d11b 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -7,10 +7,6 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength :contact_notification_sent_date, :template_name - STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, - DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze - scope :notification_not_sent, lambda { where("(force_delete_data->>'contact_notification_sent_date') is null") @@ -57,6 +53,7 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def schedule_force_delete(type: :fast_track) + # added to interactor if discarded? raise StandardError, 'Force delete procedure cannot be scheduled while a domain is discarded' end @@ -72,8 +69,8 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength preserve_current_statuses_for_force_delete add_force_delete_statuses add_force_delete_type(:fast) - self.force_delete_date = force_delete_fast_track_start_date + 1.day - self.force_delete_start = Time.zone.today + 1.day + self.force_delete_date = force_delete_fast_track_start_date + 1.day # added to interactor + self.force_delete_start = Time.zone.today + 1.day # added to interactor stop_all_pending_actions allow_deletion save(validate: false) @@ -120,12 +117,14 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def soft_delete_dates(years) + # added to interactor self.force_delete_start = valid_to - years.years self.force_delete_date = force_delete_start + Setting.expire_warning_period.days + Setting.redemption_grace_period.days end def stop_all_pending_actions + # added to interactor statuses.delete(DomainStatus::PENDING_UPDATE) statuses.delete(DomainStatus::PENDING_TRANSFER) statuses.delete(DomainStatus::PENDING_RENEW) @@ -133,6 +132,7 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def preserve_current_statuses_for_force_delete + # added to interactor update(statuses_before_force_delete: statuses) end @@ -142,6 +142,7 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def add_force_delete_statuses + # added to interactor self.statuses |= [DomainStatus::FORCE_DELETE, DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED] @@ -155,11 +156,13 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def allow_deletion + # added to interactor statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) end def force_delete_fast_track_start_date + # added to interactor Time.zone.today + Setting.expire_warning_period.days + Setting.redemption_grace_period.days end end From f97dff60029b953a946ba05074416abfc1a1a721 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Tue, 10 Nov 2020 14:06:37 +0500 Subject: [PATCH 3/7] Fix tests & interactor process --- .../admin/domains/force_delete_controller.rb | 28 +------ app/interactors/domain/force_delete/base.rb | 16 ---- .../domain/force_delete/notify_by_email.rb | 31 -------- .../domain/force_delete/notify_registrar.rb | 16 ---- .../domain/force_delete_interactor/base.rb | 16 ++++ .../check_discarded.rb | 4 +- .../notify_by_email.rb | 31 ++++++++ .../notify_registrar.rb | 16 ++++ .../post_set_process.rb | 2 +- .../prepare_domain.rb | 2 +- .../set_status.rb | 25 +++--- app/models/concerns/domain/force_delete.rb | 79 +------------------ test/models/domain/force_delete_test.rb | 7 +- test/models/domain_test.rb | 2 +- 14 files changed, 93 insertions(+), 182 deletions(-) delete mode 100644 app/interactors/domain/force_delete/base.rb delete mode 100644 app/interactors/domain/force_delete/notify_by_email.rb delete mode 100644 app/interactors/domain/force_delete/notify_registrar.rb create mode 100644 app/interactors/domain/force_delete_interactor/base.rb rename app/interactors/domain/{force_delete => force_delete_interactor}/check_discarded.rb (77%) create mode 100644 app/interactors/domain/force_delete_interactor/notify_by_email.rb create mode 100644 app/interactors/domain/force_delete_interactor/notify_registrar.rb rename app/interactors/domain/{force_delete => force_delete_interactor}/post_set_process.rb (95%) rename app/interactors/domain/{force_delete => force_delete_interactor}/prepare_domain.rb (93%) rename app/interactors/domain/{force_delete => force_delete_interactor}/set_status.rb (61%) diff --git a/app/controllers/admin/domains/force_delete_controller.rb b/app/controllers/admin/domains/force_delete_controller.rb index ca5588964..9f660ed71 100644 --- a/app/controllers/admin/domains/force_delete_controller.rb +++ b/app/controllers/admin/domains/force_delete_controller.rb @@ -5,29 +5,12 @@ module Admin authorize! :manage, domain domain.transaction do - # domain.schedule_force_delete(type: force_delete_type) - # domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', - # domain_name: domain.name, - # outzone_date: domain.outzone_date, - # purge_date: domain.purge_date)) # added to interactor - # - # notify_by_email if notify_by_email? # added to interactor - Domain::ForceDelete::Base.call(domain: domain, type: force_delete_type) + domain.schedule_force_delete(type: force_delete_type, notify_by_email: notify_by_email?) end redirect_to edit_admin_domain_url(domain), notice: t('.scheduled') end - def notify_by_email - # added to interactor - if force_delete_type == :fast_track - send_email - domain.update(contact_notification_sent_date: Time.zone.today) - else - domain.update(template_name: domain.notification_template) - end - end - def destroy authorize! :manage, domain domain.cancel_force_delete @@ -41,18 +24,9 @@ module Admin end def notify_by_email? - # added to interactor ActiveRecord::Type::Boolean.new.cast(params[:notify_by_email]) end - def send_email - # added to interactor - DomainDeleteMailer.forced(domain: domain, - registrar: domain.registrar, - registrant: domain.registrant, - template_name: domain.notification_template).deliver_now - end - def force_delete_type soft_delete? ? :soft : :fast_track end diff --git a/app/interactors/domain/force_delete/base.rb b/app/interactors/domain/force_delete/base.rb deleted file mode 100644 index 79de3cf2f..000000000 --- a/app/interactors/domain/force_delete/base.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Domain - module ForceDelete - class Base - include Interactor::Organizer - - # As per https://github.com/collectiveidea/interactor#organizers - - organize Domain::ForceDelete::CheckDiscarded, - Domain::ForceDelete::PrepareDomain, - Domain::ForceDelete::SetStatus, - Domain::ForceDelete::PostSetProcess, - Domain::ForceDelete::NotifyRegistrar, - Domain::ForceDelete::NotifyByEmail - end - end -end diff --git a/app/interactors/domain/force_delete/notify_by_email.rb b/app/interactors/domain/force_delete/notify_by_email.rb deleted file mode 100644 index 949dd5838..000000000 --- a/app/interactors/domain/force_delete/notify_by_email.rb +++ /dev/null @@ -1,31 +0,0 @@ -class Domain - module ForceDelete - class NotifyByEmail - include Interactor - - def call - return unless notify_by_email? - - if context.type == :fast_track - send_email - context.domain.update(contact_notification_sent_date: Time.zone.today) - else - context.domain.update(template_name: context.domain.notification_template) - end - end - - private - - def notify_by_email? - ActiveRecord::Type::Boolean.new.cast(params[:notify_by_email]) - end - - def send_email - DomainDeleteMailer.forced(domain: context.domain, - registrar: context.domain.registrar, - registrant: context.domain.registrant, - template_name: context.domain.notification_template).deliver_now - end - end - end -end diff --git a/app/interactors/domain/force_delete/notify_registrar.rb b/app/interactors/domain/force_delete/notify_registrar.rb deleted file mode 100644 index 345f4d7eb..000000000 --- a/app/interactors/domain/force_delete/notify_registrar.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Domain - module ForceDelete - class NotifyRegistrar - include Interactor - - def call - domain = context.domain - - domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', - domain_name: domain.name, - outzone_date: domain.outzone_date, - purge_date: domain.purge_date)) - end - end - end -end diff --git a/app/interactors/domain/force_delete_interactor/base.rb b/app/interactors/domain/force_delete_interactor/base.rb new file mode 100644 index 000000000..d10edcaef --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/base.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDeleteInteractor + class Base + include Interactor::Organizer + + # As per https://github.com/collectiveidea/interactor#organizers + + organize Domain::ForceDeleteInteractor::CheckDiscarded, + Domain::ForceDeleteInteractor::PrepareDomain, + Domain::ForceDeleteInteractor::SetStatus, + Domain::ForceDeleteInteractor::PostSetProcess, + Domain::ForceDeleteInteractor::NotifyRegistrar, + Domain::ForceDeleteInteractor::NotifyByEmail + end + end +end diff --git a/app/interactors/domain/force_delete/check_discarded.rb b/app/interactors/domain/force_delete_interactor/check_discarded.rb similarity index 77% rename from app/interactors/domain/force_delete/check_discarded.rb rename to app/interactors/domain/force_delete_interactor/check_discarded.rb index ac2cd31b6..c340f9f43 100644 --- a/app/interactors/domain/force_delete/check_discarded.rb +++ b/app/interactors/domain/force_delete_interactor/check_discarded.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class CheckDiscarded include Interactor @@ -7,7 +7,7 @@ class Domain return unless context.domain.discarded? message = 'Force delete procedure cannot be scheduled while a domain is discarded' - context.fail!( message: message ) + context.fail!(message: message) end end end diff --git a/app/interactors/domain/force_delete_interactor/notify_by_email.rb b/app/interactors/domain/force_delete_interactor/notify_by_email.rb new file mode 100644 index 000000000..91855b839 --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/notify_by_email.rb @@ -0,0 +1,31 @@ +class Domain + module ForceDeleteInteractor + class NotifyByEmail + include Interactor + + def call + return unless context.notify_by_email + + if context.type == :fast_track + send_email + domain.update(contact_notification_sent_date: Time.zone.today) + else + domain.update(template_name: context.domain.notification_template) + end + end + + private + + def domain + @domain ||= context.domain + end + + def send_email + DomainDeleteMailer.forced(domain: domain, + registrar: domain.registrar, + registrant: domain.registrant, + template_name: domain.notification_template).deliver_now + end + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/notify_registrar.rb b/app/interactors/domain/force_delete_interactor/notify_registrar.rb new file mode 100644 index 000000000..bfe35d29a --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/notify_registrar.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDeleteInteractor + class NotifyRegistrar + include Interactor + + def call + domain = context.domain + + domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', + domain_name: domain.name, + outzone_date: domain.outzone_date, + purge_date: domain.purge_date)) + end + end + end +end diff --git a/app/interactors/domain/force_delete/post_set_process.rb b/app/interactors/domain/force_delete_interactor/post_set_process.rb similarity index 95% rename from app/interactors/domain/force_delete/post_set_process.rb rename to app/interactors/domain/force_delete_interactor/post_set_process.rb index a2fc531b2..78a039d43 100644 --- a/app/interactors/domain/force_delete/post_set_process.rb +++ b/app/interactors/domain/force_delete_interactor/post_set_process.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class PostSetProcess include Interactor diff --git a/app/interactors/domain/force_delete/prepare_domain.rb b/app/interactors/domain/force_delete_interactor/prepare_domain.rb similarity index 93% rename from app/interactors/domain/force_delete/prepare_domain.rb rename to app/interactors/domain/force_delete_interactor/prepare_domain.rb index 3bc764dc8..c214a6b88 100644 --- a/app/interactors/domain/force_delete/prepare_domain.rb +++ b/app/interactors/domain/force_delete_interactor/prepare_domain.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class PrepareDomain include Interactor diff --git a/app/interactors/domain/force_delete/set_status.rb b/app/interactors/domain/force_delete_interactor/set_status.rb similarity index 61% rename from app/interactors/domain/force_delete/set_status.rb rename to app/interactors/domain/force_delete_interactor/set_status.rb index 2a6c49daa..a15b67ce2 100644 --- a/app/interactors/domain/force_delete/set_status.rb +++ b/app/interactors/domain/force_delete_interactor/set_status.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class SetStatus include Interactor @@ -9,23 +9,20 @@ class Domain domain.save(validate: false) end - private - def domain - @domain |= context.domain + @domain ||= context.domain end def force_delete_fast_track domain.force_delete_date = Time.zone.today + - Setting.expire_warning_period.days + - Setting.redemption_grace_period.days + - 1.day + expire_warning_period_days + + redemption_grace_period_days domain.force_delete_start = Time.zone.today + 1.day end def force_delete_soft - years = (valid_to.to_date - Time.zone.today).to_i / 365 - soft_forcedelete_dates(years) + years = (domain.valid_to.to_date - Time.zone.today).to_i / 365 + soft_forcedelete_dates(years) if years.positive? end def soft_forcedelete_dates(years) @@ -34,6 +31,16 @@ class Domain Setting.expire_warning_period.days + Setting.redemption_grace_period.days end + + private + + def redemption_grace_period_days + Setting.redemption_grace_period.days + 1.day + end + + def expire_warning_period_days + Setting.expire_warning_period.days + end end end end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 768b1d11b..26dc62413 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -52,38 +52,10 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength force_delete_start + Setting.expire_warning_period.days <= valid_to end - def schedule_force_delete(type: :fast_track) - # added to interactor - if discarded? - raise StandardError, 'Force delete procedure cannot be scheduled while a domain is discarded' - end - - type == :fast_track ? force_delete_fast_track : force_delete_soft - end - - def add_force_delete_type(force_delete_type) - self.force_delete_type = force_delete_type - end - - def force_delete_fast_track - preserve_current_statuses_for_force_delete - add_force_delete_statuses - add_force_delete_type(:fast) - self.force_delete_date = force_delete_fast_track_start_date + 1.day # added to interactor - self.force_delete_start = Time.zone.today + 1.day # added to interactor - stop_all_pending_actions - allow_deletion - save(validate: false) - end - - def force_delete_soft - preserve_current_statuses_for_force_delete - add_force_delete_statuses - add_force_delete_type(:soft) - calculate_soft_delete_date - stop_all_pending_actions - allow_deletion - save(validate: false) + def schedule_force_delete(type: :fast_track, notify_by_email: false) + Domain::ForceDeleteInteractor::Base.call(domain: self, + type: type, + notify_by_email: notify_by_email) end def clear_force_delete_data @@ -111,58 +83,15 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength private - def calculate_soft_delete_date - years = (valid_to.to_date - Time.zone.today).to_i / 365 - soft_delete_dates(years) if years.positive? - end - - def soft_delete_dates(years) - # added to interactor - self.force_delete_start = valid_to - years.years - self.force_delete_date = force_delete_start + Setting.expire_warning_period.days + - Setting.redemption_grace_period.days - end - - def stop_all_pending_actions - # added to interactor - statuses.delete(DomainStatus::PENDING_UPDATE) - statuses.delete(DomainStatus::PENDING_TRANSFER) - statuses.delete(DomainStatus::PENDING_RENEW) - statuses.delete(DomainStatus::PENDING_CREATE) - end - - def preserve_current_statuses_for_force_delete - # added to interactor - update(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 - # added to interactor - self.statuses |= [DomainStatus::FORCE_DELETE, - DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED] - 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::CLIENT_HOLD) end - - def allow_deletion - # added to interactor - statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) - end - - def force_delete_fast_track_start_date - # added to interactor - Time.zone.today + Setting.expire_warning_period.days + Setting.redemption_grace_period.days - end end diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index f0723c326..f5c7e7b06 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -111,9 +111,10 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - assert_raises StandardError do - @domain.schedule_force_delete(type: :fast_track) - end + context = Domain::ForceDeleteInteractor::Base.call(domain: @domain, type: :fast_track) + + assert_not context.success? + assert_equal 'Force delete procedure cannot be scheduled while a domain is discarded', context.message end def test_cancels_force_delete diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 4a9240f57..bb4dd37cf 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -414,7 +414,7 @@ class DomainTest < ActiveSupport::TestCase force_delete_date: nil) @domain.update(template_name: 'legal_person') travel_to Time.zone.parse('2010-07-05') - @domain.schedule_force_delete(type: :fast_track) + Domain::ForceDeleteInteractor::Base.call(domain: @domain, type: :fast_track) assert(@domain.force_delete_scheduled?) other_registrant = Registrant.find_by(code: 'jane-001') @domain.pending_json['new_registrant_id'] = other_registrant.id From 3c7fa8846357c797d51fab1b2cfb6bd099877cdb Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Tue, 10 Nov 2020 15:06:32 +0500 Subject: [PATCH 4/7] Inherit all the interactors from base one --- .../domain/force_delete_interactor/base.rb | 13 +++++-------- .../force_delete_interactor/check_discarded.rb | 6 ++---- .../force_delete_interactor/notify_by_email.rb | 10 +--------- .../force_delete_interactor/notify_registrar.rb | 6 +----- .../force_delete_interactor/post_set_process.rb | 8 +++----- .../force_delete_interactor/prepare_domain.rb | 5 +---- .../force_delete_interactor/set_force_delete.rb | 16 ++++++++++++++++ .../domain/force_delete_interactor/set_status.rb | 8 +------- app/models/concerns/domain/force_delete.rb | 6 +++--- test/models/domain/force_delete_test.rb | 2 +- test/models/domain_test.rb | 2 +- 11 files changed, 35 insertions(+), 47 deletions(-) create mode 100644 app/interactors/domain/force_delete_interactor/set_force_delete.rb diff --git a/app/interactors/domain/force_delete_interactor/base.rb b/app/interactors/domain/force_delete_interactor/base.rb index d10edcaef..6724d53e3 100644 --- a/app/interactors/domain/force_delete_interactor/base.rb +++ b/app/interactors/domain/force_delete_interactor/base.rb @@ -1,16 +1,13 @@ class Domain module ForceDeleteInteractor class Base - include Interactor::Organizer + include Interactor - # As per https://github.com/collectiveidea/interactor#organizers + private - organize Domain::ForceDeleteInteractor::CheckDiscarded, - Domain::ForceDeleteInteractor::PrepareDomain, - Domain::ForceDeleteInteractor::SetStatus, - Domain::ForceDeleteInteractor::PostSetProcess, - Domain::ForceDeleteInteractor::NotifyRegistrar, - Domain::ForceDeleteInteractor::NotifyByEmail + def domain + @domain ||= context.domain + end end end end diff --git a/app/interactors/domain/force_delete_interactor/check_discarded.rb b/app/interactors/domain/force_delete_interactor/check_discarded.rb index c340f9f43..b63828f49 100644 --- a/app/interactors/domain/force_delete_interactor/check_discarded.rb +++ b/app/interactors/domain/force_delete_interactor/check_discarded.rb @@ -1,10 +1,8 @@ class Domain module ForceDeleteInteractor - class CheckDiscarded - include Interactor - + class CheckDiscarded < Base def call - return unless context.domain.discarded? + return unless domain.discarded? message = 'Force delete procedure cannot be scheduled while a domain is discarded' context.fail!(message: message) diff --git a/app/interactors/domain/force_delete_interactor/notify_by_email.rb b/app/interactors/domain/force_delete_interactor/notify_by_email.rb index 91855b839..5263fdd7a 100644 --- a/app/interactors/domain/force_delete_interactor/notify_by_email.rb +++ b/app/interactors/domain/force_delete_interactor/notify_by_email.rb @@ -1,8 +1,6 @@ class Domain module ForceDeleteInteractor - class NotifyByEmail - include Interactor - + class NotifyByEmail < Base def call return unless context.notify_by_email @@ -14,12 +12,6 @@ class Domain end end - private - - def domain - @domain ||= context.domain - end - def send_email DomainDeleteMailer.forced(domain: domain, registrar: domain.registrar, diff --git a/app/interactors/domain/force_delete_interactor/notify_registrar.rb b/app/interactors/domain/force_delete_interactor/notify_registrar.rb index bfe35d29a..bd891d5dc 100644 --- a/app/interactors/domain/force_delete_interactor/notify_registrar.rb +++ b/app/interactors/domain/force_delete_interactor/notify_registrar.rb @@ -1,11 +1,7 @@ class Domain module ForceDeleteInteractor - class NotifyRegistrar - include Interactor - + class NotifyRegistrar < Base def call - domain = context.domain - domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', domain_name: domain.name, outzone_date: domain.outzone_date, diff --git a/app/interactors/domain/force_delete_interactor/post_set_process.rb b/app/interactors/domain/force_delete_interactor/post_set_process.rb index 78a039d43..4017eb459 100644 --- a/app/interactors/domain/force_delete_interactor/post_set_process.rb +++ b/app/interactors/domain/force_delete_interactor/post_set_process.rb @@ -1,10 +1,8 @@ class Domain module ForceDeleteInteractor - class PostSetProcess - include Interactor - + class PostSetProcess < Base def call - statuses = context.domain.statuses + statuses = domain.statuses # Stop all pending actions statuses.delete(DomainStatus::PENDING_UPDATE) statuses.delete(DomainStatus::PENDING_TRANSFER) @@ -14,7 +12,7 @@ class Domain # Allow deletion statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) - context.domain.save(validate: false) + domain.save(validate: false) end end end diff --git a/app/interactors/domain/force_delete_interactor/prepare_domain.rb b/app/interactors/domain/force_delete_interactor/prepare_domain.rb index c214a6b88..6317bbaf1 100644 --- a/app/interactors/domain/force_delete_interactor/prepare_domain.rb +++ b/app/interactors/domain/force_delete_interactor/prepare_domain.rb @@ -1,14 +1,11 @@ class Domain module ForceDeleteInteractor - class PrepareDomain - include Interactor - + class PrepareDomain < Base STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze def call - domain = context.domain domain.statuses_before_force_delete = domain.statuses domain.statuses |= STATUSES_TO_SET domain.save(validate: false) diff --git a/app/interactors/domain/force_delete_interactor/set_force_delete.rb b/app/interactors/domain/force_delete_interactor/set_force_delete.rb new file mode 100644 index 000000000..4435b8f8c --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/set_force_delete.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDeleteInteractor + class SetForceDelete + include Interactor::Organizer + + # As per https://github.com/collectiveidea/interactor#organizers + + organize Domain::ForceDeleteInteractor::CheckDiscarded, + Domain::ForceDeleteInteractor::PrepareDomain, + Domain::ForceDeleteInteractor::SetStatus, + Domain::ForceDeleteInteractor::PostSetProcess, + Domain::ForceDeleteInteractor::NotifyRegistrar, + Domain::ForceDeleteInteractor::NotifyByEmail + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/set_status.rb b/app/interactors/domain/force_delete_interactor/set_status.rb index a15b67ce2..418952f51 100644 --- a/app/interactors/domain/force_delete_interactor/set_status.rb +++ b/app/interactors/domain/force_delete_interactor/set_status.rb @@ -1,18 +1,12 @@ class Domain module ForceDeleteInteractor - class SetStatus - include Interactor - + class SetStatus < Base def call domain.force_delete_type = context.type context.type == :fast_track ? force_delete_fast_track : force_delete_soft domain.save(validate: false) end - def domain - @domain ||= context.domain - end - def force_delete_fast_track domain.force_delete_date = Time.zone.today + expire_warning_period_days + diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 26dc62413..4a032ab36 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -53,9 +53,9 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def schedule_force_delete(type: :fast_track, notify_by_email: false) - Domain::ForceDeleteInteractor::Base.call(domain: self, - type: type, - notify_by_email: notify_by_email) + Domain::ForceDeleteInteractor::SetForceDelete.call(domain: self, + type: type, + notify_by_email: notify_by_email) end def clear_force_delete_data diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index f5c7e7b06..ddd330f47 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -111,7 +111,7 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - context = Domain::ForceDeleteInteractor::Base.call(domain: @domain, type: :fast_track) + context = Domain::ForceDeleteInteractor::SetForceDelete.call(domain: @domain, type: :fast_track) assert_not context.success? assert_equal 'Force delete procedure cannot be scheduled while a domain is discarded', context.message diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index bb4dd37cf..2b01c795f 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -414,7 +414,7 @@ class DomainTest < ActiveSupport::TestCase force_delete_date: nil) @domain.update(template_name: 'legal_person') travel_to Time.zone.parse('2010-07-05') - Domain::ForceDeleteInteractor::Base.call(domain: @domain, type: :fast_track) + Domain::ForceDeleteInteractor::SetForceDelete.call(domain: @domain, type: :fast_track) assert(@domain.force_delete_scheduled?) other_registrant = Registrant.find_by(code: 'jane-001') @domain.pending_json['new_registrant_id'] = other_registrant.id From bce39e3404535535ce2097f2b46069e5872b092e Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Wed, 11 Nov 2020 15:44:00 +0500 Subject: [PATCH 5/7] Move interactor from Interactor gem to ActiveInteraction --- Gemfile | 3 +-- Gemfile.lock | 9 +++------ .../admin/domains/force_delete_controller.rb | 8 ++++++-- .../domain/force_delete_interaction/base.rb | 17 +++++++++++++++++ .../check_discarded.rb | 8 ++++---- .../notify_by_email.rb | 10 +++++----- .../notify_registrar.rb | 4 ++-- .../post_set_process.rb | 4 ++-- .../force_delete_interaction}/prepare_domain.rb | 4 ++-- .../set_force_delete.rb | 14 ++++++++++++++ .../force_delete_interaction}/set_status.rb | 12 ++++++------ .../domain/force_delete_interactor/base.rb | 13 ------------- .../force_delete_interactor/set_force_delete.rb | 16 ---------------- app/models/concerns/domain/force_delete.rb | 2 +- config/application.rb | 1 + test/models/domain/force_delete_test.rb | 8 +++++--- test/models/domain_test.rb | 2 +- 17 files changed, 70 insertions(+), 65 deletions(-) create mode 100644 app/interactions/domain/force_delete_interaction/base.rb rename app/{interactors/domain/force_delete_interactor => interactions/domain/force_delete_interaction}/check_discarded.rb (55%) rename app/{interactors/domain/force_delete_interactor => interactions/domain/force_delete_interaction}/notify_by_email.rb (70%) rename app/{interactors/domain/force_delete_interactor => interactions/domain/force_delete_interaction}/notify_registrar.rb (89%) rename app/{interactors/domain/force_delete_interactor => interactions/domain/force_delete_interaction}/post_set_process.rb (91%) rename app/{interactors/domain/force_delete_interactor => interactions/domain/force_delete_interaction}/prepare_domain.rb (89%) create mode 100644 app/interactions/domain/force_delete_interaction/set_force_delete.rb rename app/{interactors/domain/force_delete_interactor => interactions/domain/force_delete_interaction}/set_status.rb (86%) delete mode 100644 app/interactors/domain/force_delete_interactor/base.rb delete mode 100644 app/interactors/domain/force_delete_interactor/set_force_delete.rb diff --git a/Gemfile b/Gemfile index c4f5a7cf8..d35238fc0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,9 +1,8 @@ source 'https://rubygems.org' # core +gem 'active_interaction', '~> 3.8' gem 'bootsnap', '>= 1.1.0', require: false -gem 'interactor', '~> 3.0' -gem 'interactor-rails', '~> 2.0' gem 'iso8601', '0.12.1' # for dates and times gem 'rails', '~> 6.0' gem 'rest-client' diff --git a/Gemfile.lock b/Gemfile.lock index cc59a8f41..14970c2c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -112,6 +112,8 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) + active_interaction (3.8.3) + activemodel (>= 4, < 7) activejob (6.0.3.3) activesupport (= 6.0.3.3) globalid (>= 0.3.6) @@ -251,10 +253,6 @@ GEM i18n (1.8.5) concurrent-ruby (~> 1.0) i18n_data (0.10.0) - interactor (3.1.2) - interactor-rails (2.2.1) - interactor (~> 3.0) - rails (>= 4.2) isikukood (0.1.2) iso8601 (0.12.1) jquery-rails (4.4.0) @@ -525,6 +523,7 @@ PLATFORMS ruby DEPENDENCIES + active_interaction (~> 3.8) activerecord-import airbrake bootsnap (>= 1.1.0) @@ -548,8 +547,6 @@ DEPENDENCIES figaro (= 1.1.1) grape haml (~> 5.0) - interactor (~> 3.0) - interactor-rails (~> 2.0) isikukood iso8601 (= 0.12.1) jquery-rails diff --git a/app/controllers/admin/domains/force_delete_controller.rb b/app/controllers/admin/domains/force_delete_controller.rb index 9f660ed71..4fe85fa3b 100644 --- a/app/controllers/admin/domains/force_delete_controller.rb +++ b/app/controllers/admin/domains/force_delete_controller.rb @@ -4,11 +4,15 @@ module Admin def create authorize! :manage, domain + notice = t('.scheduled') + domain.transaction do - domain.schedule_force_delete(type: force_delete_type, notify_by_email: notify_by_email?) + result = domain.schedule_force_delete(type: force_delete_type, + notify_by_email: notify_by_email?) + notice = result.errors.messages[:domain].first unless result.valid? end - redirect_to edit_admin_domain_url(domain), notice: t('.scheduled') + redirect_to edit_admin_domain_url(domain), notice: notice end def destroy diff --git a/app/interactions/domain/force_delete_interaction/base.rb b/app/interactions/domain/force_delete_interaction/base.rb new file mode 100644 index 000000000..e8079982b --- /dev/null +++ b/app/interactions/domain/force_delete_interaction/base.rb @@ -0,0 +1,17 @@ +class Domain + module ForceDeleteInteraction + class Base < ActiveInteraction::Base + object :domain, + class: Domain, + description: 'Domain to set ForceDelete on' + symbol :type, + default: :fast_track, + description: 'Force delete type, might be :fast_track or :soft' + boolean :notify_by_email, + default: false, + description: 'Do we need to send email notification' + + validates :type, inclusion: { in: %i[fast_track soft] } + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/check_discarded.rb b/app/interactions/domain/force_delete_interaction/check_discarded.rb similarity index 55% rename from app/interactors/domain/force_delete_interactor/check_discarded.rb rename to app/interactions/domain/force_delete_interaction/check_discarded.rb index b63828f49..d2b54641a 100644 --- a/app/interactors/domain/force_delete_interactor/check_discarded.rb +++ b/app/interactions/domain/force_delete_interaction/check_discarded.rb @@ -1,11 +1,11 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class CheckDiscarded < Base - def call - return unless domain.discarded? + def execute + return true unless domain.discarded? message = 'Force delete procedure cannot be scheduled while a domain is discarded' - context.fail!(message: message) + errors.add(:domain, message) end end end diff --git a/app/interactors/domain/force_delete_interactor/notify_by_email.rb b/app/interactions/domain/force_delete_interaction/notify_by_email.rb similarity index 70% rename from app/interactors/domain/force_delete_interactor/notify_by_email.rb rename to app/interactions/domain/force_delete_interaction/notify_by_email.rb index 5263fdd7a..97abc8e5c 100644 --- a/app/interactors/domain/force_delete_interactor/notify_by_email.rb +++ b/app/interactions/domain/force_delete_interaction/notify_by_email.rb @@ -1,14 +1,14 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class NotifyByEmail < Base - def call - return unless context.notify_by_email + def execute + return unless notify_by_email - if context.type == :fast_track + if type == :fast_track send_email domain.update(contact_notification_sent_date: Time.zone.today) else - domain.update(template_name: context.domain.notification_template) + domain.update(template_name: domain.notification_template) end end diff --git a/app/interactors/domain/force_delete_interactor/notify_registrar.rb b/app/interactions/domain/force_delete_interaction/notify_registrar.rb similarity index 89% rename from app/interactors/domain/force_delete_interactor/notify_registrar.rb rename to app/interactions/domain/force_delete_interaction/notify_registrar.rb index bd891d5dc..da3e400cc 100644 --- a/app/interactors/domain/force_delete_interactor/notify_registrar.rb +++ b/app/interactions/domain/force_delete_interaction/notify_registrar.rb @@ -1,7 +1,7 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class NotifyRegistrar < Base - def call + def execute domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', domain_name: domain.name, outzone_date: domain.outzone_date, diff --git a/app/interactors/domain/force_delete_interactor/post_set_process.rb b/app/interactions/domain/force_delete_interaction/post_set_process.rb similarity index 91% rename from app/interactors/domain/force_delete_interactor/post_set_process.rb rename to app/interactions/domain/force_delete_interaction/post_set_process.rb index 4017eb459..68eb59bf9 100644 --- a/app/interactors/domain/force_delete_interactor/post_set_process.rb +++ b/app/interactions/domain/force_delete_interaction/post_set_process.rb @@ -1,7 +1,7 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class PostSetProcess < Base - def call + def execute statuses = domain.statuses # Stop all pending actions statuses.delete(DomainStatus::PENDING_UPDATE) diff --git a/app/interactors/domain/force_delete_interactor/prepare_domain.rb b/app/interactions/domain/force_delete_interaction/prepare_domain.rb similarity index 89% rename from app/interactors/domain/force_delete_interactor/prepare_domain.rb rename to app/interactions/domain/force_delete_interaction/prepare_domain.rb index 6317bbaf1..fddfeb75a 100644 --- a/app/interactors/domain/force_delete_interactor/prepare_domain.rb +++ b/app/interactions/domain/force_delete_interaction/prepare_domain.rb @@ -1,11 +1,11 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class PrepareDomain < Base STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze - def call + def execute domain.statuses_before_force_delete = domain.statuses domain.statuses |= STATUSES_TO_SET domain.save(validate: false) diff --git a/app/interactions/domain/force_delete_interaction/set_force_delete.rb b/app/interactions/domain/force_delete_interaction/set_force_delete.rb new file mode 100644 index 000000000..6bbd8ef20 --- /dev/null +++ b/app/interactions/domain/force_delete_interaction/set_force_delete.rb @@ -0,0 +1,14 @@ +class Domain + module ForceDeleteInteraction + class SetForceDelete < Base + def execute + compose(CheckDiscarded, inputs) + compose(PrepareDomain, inputs) + compose(SetStatus, inputs) + compose(PostSetProcess, inputs) + compose(NotifyRegistrar, inputs) + compose(NotifyByEmail, inputs) + end + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/set_status.rb b/app/interactions/domain/force_delete_interaction/set_status.rb similarity index 86% rename from app/interactors/domain/force_delete_interactor/set_status.rb rename to app/interactions/domain/force_delete_interaction/set_status.rb index 418952f51..a56069fcc 100644 --- a/app/interactors/domain/force_delete_interactor/set_status.rb +++ b/app/interactions/domain/force_delete_interaction/set_status.rb @@ -1,9 +1,9 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class SetStatus < Base - def call - domain.force_delete_type = context.type - context.type == :fast_track ? force_delete_fast_track : force_delete_soft + def execute + domain.force_delete_type = type + type == :fast_track ? force_delete_fast_track : force_delete_soft domain.save(validate: false) end @@ -19,6 +19,8 @@ class Domain soft_forcedelete_dates(years) if years.positive? end + private + def soft_forcedelete_dates(years) domain.force_delete_start = domain.valid_to - years.years domain.force_delete_date = domain.force_delete_start + @@ -26,8 +28,6 @@ class Domain Setting.redemption_grace_period.days end - private - def redemption_grace_period_days Setting.redemption_grace_period.days + 1.day end diff --git a/app/interactors/domain/force_delete_interactor/base.rb b/app/interactors/domain/force_delete_interactor/base.rb deleted file mode 100644 index 6724d53e3..000000000 --- a/app/interactors/domain/force_delete_interactor/base.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Domain - module ForceDeleteInteractor - class Base - include Interactor - - private - - def domain - @domain ||= context.domain - end - end - end -end diff --git a/app/interactors/domain/force_delete_interactor/set_force_delete.rb b/app/interactors/domain/force_delete_interactor/set_force_delete.rb deleted file mode 100644 index 4435b8f8c..000000000 --- a/app/interactors/domain/force_delete_interactor/set_force_delete.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Domain - module ForceDeleteInteractor - class SetForceDelete - include Interactor::Organizer - - # As per https://github.com/collectiveidea/interactor#organizers - - organize Domain::ForceDeleteInteractor::CheckDiscarded, - Domain::ForceDeleteInteractor::PrepareDomain, - Domain::ForceDeleteInteractor::SetStatus, - Domain::ForceDeleteInteractor::PostSetProcess, - Domain::ForceDeleteInteractor::NotifyRegistrar, - Domain::ForceDeleteInteractor::NotifyByEmail - end - end -end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 4a032ab36..f81669c74 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -53,7 +53,7 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def schedule_force_delete(type: :fast_track, notify_by_email: false) - Domain::ForceDeleteInteractor::SetForceDelete.call(domain: self, + Domain::ForceDeleteInteraction::SetForceDelete.run(domain: self, type: type, notify_by_email: notify_by_email) end diff --git a/config/application.rb b/config/application.rb index 5f4481512..a5fb17c9d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -36,6 +36,7 @@ module DomainNameRegistry # Autoload all model subdirs config.autoload_paths += Dir[Rails.root.join('app', 'models', '**/')] + config.autoload_paths += Dir[Rails.root.join('app', 'interactions', '**/')] config.eager_load_paths << config.root.join('lib', 'validators') config.watchable_dirs['lib'] = %i[rb] diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index ddd330f47..b57763342 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -111,10 +111,12 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - context = Domain::ForceDeleteInteractor::SetForceDelete.call(domain: @domain, type: :fast_track) + result = Domain::ForceDeleteInteraction::SetForceDelete.run(domain: @domain, type: :fast_track) - assert_not context.success? - assert_equal 'Force delete procedure cannot be scheduled while a domain is discarded', context.message + assert_not result.valid? + assert_not @domain.force_delete_scheduled? + message = ["Force delete procedure cannot be scheduled while a domain is discarded"] + assert_equal message, result.errors.messages[:domain] end def test_cancels_force_delete diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 2b01c795f..514efaf14 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -414,7 +414,7 @@ class DomainTest < ActiveSupport::TestCase force_delete_date: nil) @domain.update(template_name: 'legal_person') travel_to Time.zone.parse('2010-07-05') - Domain::ForceDeleteInteractor::SetForceDelete.call(domain: @domain, type: :fast_track) + Domain::ForceDeleteInteraction::SetForceDelete.run!(domain: @domain, type: :fast_track) assert(@domain.force_delete_scheduled?) other_registrant = Registrant.find_by(code: 'jane-001') @domain.pending_json['new_registrant_id'] = other_registrant.id From e62f0a077abda210a76866e1184d0e420391aa34 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Wed, 11 Nov 2020 21:16:27 +0500 Subject: [PATCH 6/7] Remove domain namespace --- .../domain/force_delete_interaction/base.rb | 17 -------- .../check_discarded.rb | 12 ------ .../notify_by_email.rb | 23 ----------- .../notify_registrar.rb | 12 ------ .../post_set_process.rb | 19 --------- .../prepare_domain.rb | 15 ------- .../set_force_delete.rb | 14 ------- .../force_delete_interaction/set_status.rb | 40 ------------------- .../force_delete_interaction/base.rb | 16 ++++++++ .../check_discarded.rb | 11 +++++ .../notify_by_email.rb | 21 ++++++++++ .../notify_registrar.rb | 10 +++++ .../post_set_process.rb | 17 ++++++++ .../prepare_domain.rb | 13 ++++++ .../set_force_delete.rb | 12 ++++++ .../force_delete_interaction/set_status.rb | 38 ++++++++++++++++++ app/models/concerns/domain/force_delete.rb | 6 +-- test/models/domain/force_delete_test.rb | 2 +- test/models/domain_test.rb | 2 +- 19 files changed, 143 insertions(+), 157 deletions(-) delete mode 100644 app/interactions/domain/force_delete_interaction/base.rb delete mode 100644 app/interactions/domain/force_delete_interaction/check_discarded.rb delete mode 100644 app/interactions/domain/force_delete_interaction/notify_by_email.rb delete mode 100644 app/interactions/domain/force_delete_interaction/notify_registrar.rb delete mode 100644 app/interactions/domain/force_delete_interaction/post_set_process.rb delete mode 100644 app/interactions/domain/force_delete_interaction/prepare_domain.rb delete mode 100644 app/interactions/domain/force_delete_interaction/set_force_delete.rb delete mode 100644 app/interactions/domain/force_delete_interaction/set_status.rb create mode 100644 app/interactions/force_delete_interaction/base.rb create mode 100644 app/interactions/force_delete_interaction/check_discarded.rb create mode 100644 app/interactions/force_delete_interaction/notify_by_email.rb create mode 100644 app/interactions/force_delete_interaction/notify_registrar.rb create mode 100644 app/interactions/force_delete_interaction/post_set_process.rb create mode 100644 app/interactions/force_delete_interaction/prepare_domain.rb create mode 100644 app/interactions/force_delete_interaction/set_force_delete.rb create mode 100644 app/interactions/force_delete_interaction/set_status.rb diff --git a/app/interactions/domain/force_delete_interaction/base.rb b/app/interactions/domain/force_delete_interaction/base.rb deleted file mode 100644 index e8079982b..000000000 --- a/app/interactions/domain/force_delete_interaction/base.rb +++ /dev/null @@ -1,17 +0,0 @@ -class Domain - module ForceDeleteInteraction - class Base < ActiveInteraction::Base - object :domain, - class: Domain, - description: 'Domain to set ForceDelete on' - symbol :type, - default: :fast_track, - description: 'Force delete type, might be :fast_track or :soft' - boolean :notify_by_email, - default: false, - description: 'Do we need to send email notification' - - validates :type, inclusion: { in: %i[fast_track soft] } - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/check_discarded.rb b/app/interactions/domain/force_delete_interaction/check_discarded.rb deleted file mode 100644 index d2b54641a..000000000 --- a/app/interactions/domain/force_delete_interaction/check_discarded.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Domain - module ForceDeleteInteraction - class CheckDiscarded < Base - def execute - return true unless domain.discarded? - - message = 'Force delete procedure cannot be scheduled while a domain is discarded' - errors.add(:domain, message) - end - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/notify_by_email.rb b/app/interactions/domain/force_delete_interaction/notify_by_email.rb deleted file mode 100644 index 97abc8e5c..000000000 --- a/app/interactions/domain/force_delete_interaction/notify_by_email.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Domain - module ForceDeleteInteraction - class NotifyByEmail < Base - def execute - return unless notify_by_email - - if type == :fast_track - send_email - domain.update(contact_notification_sent_date: Time.zone.today) - else - domain.update(template_name: domain.notification_template) - end - end - - def send_email - DomainDeleteMailer.forced(domain: domain, - registrar: domain.registrar, - registrant: domain.registrant, - template_name: domain.notification_template).deliver_now - end - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/notify_registrar.rb b/app/interactions/domain/force_delete_interaction/notify_registrar.rb deleted file mode 100644 index da3e400cc..000000000 --- a/app/interactions/domain/force_delete_interaction/notify_registrar.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Domain - module ForceDeleteInteraction - class NotifyRegistrar < Base - def execute - domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', - domain_name: domain.name, - outzone_date: domain.outzone_date, - purge_date: domain.purge_date)) - end - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/post_set_process.rb b/app/interactions/domain/force_delete_interaction/post_set_process.rb deleted file mode 100644 index 68eb59bf9..000000000 --- a/app/interactions/domain/force_delete_interaction/post_set_process.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Domain - module ForceDeleteInteraction - class PostSetProcess < Base - def execute - statuses = domain.statuses - # Stop all pending actions - statuses.delete(DomainStatus::PENDING_UPDATE) - statuses.delete(DomainStatus::PENDING_TRANSFER) - statuses.delete(DomainStatus::PENDING_RENEW) - statuses.delete(DomainStatus::PENDING_CREATE) - - # Allow deletion - statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) - domain.save(validate: false) - end - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/prepare_domain.rb b/app/interactions/domain/force_delete_interaction/prepare_domain.rb deleted file mode 100644 index fddfeb75a..000000000 --- a/app/interactions/domain/force_delete_interaction/prepare_domain.rb +++ /dev/null @@ -1,15 +0,0 @@ -class Domain - module ForceDeleteInteraction - class PrepareDomain < Base - STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, - DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze - - def execute - domain.statuses_before_force_delete = domain.statuses - domain.statuses |= STATUSES_TO_SET - domain.save(validate: false) - end - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/set_force_delete.rb b/app/interactions/domain/force_delete_interaction/set_force_delete.rb deleted file mode 100644 index 6bbd8ef20..000000000 --- a/app/interactions/domain/force_delete_interaction/set_force_delete.rb +++ /dev/null @@ -1,14 +0,0 @@ -class Domain - module ForceDeleteInteraction - class SetForceDelete < Base - def execute - compose(CheckDiscarded, inputs) - compose(PrepareDomain, inputs) - compose(SetStatus, inputs) - compose(PostSetProcess, inputs) - compose(NotifyRegistrar, inputs) - compose(NotifyByEmail, inputs) - end - end - end -end diff --git a/app/interactions/domain/force_delete_interaction/set_status.rb b/app/interactions/domain/force_delete_interaction/set_status.rb deleted file mode 100644 index a56069fcc..000000000 --- a/app/interactions/domain/force_delete_interaction/set_status.rb +++ /dev/null @@ -1,40 +0,0 @@ -class Domain - module ForceDeleteInteraction - class SetStatus < Base - def execute - domain.force_delete_type = type - type == :fast_track ? force_delete_fast_track : force_delete_soft - domain.save(validate: false) - end - - def force_delete_fast_track - domain.force_delete_date = Time.zone.today + - expire_warning_period_days + - redemption_grace_period_days - domain.force_delete_start = Time.zone.today + 1.day - end - - def force_delete_soft - years = (domain.valid_to.to_date - Time.zone.today).to_i / 365 - soft_forcedelete_dates(years) if years.positive? - end - - private - - def soft_forcedelete_dates(years) - domain.force_delete_start = domain.valid_to - years.years - domain.force_delete_date = domain.force_delete_start + - Setting.expire_warning_period.days + - Setting.redemption_grace_period.days - end - - def redemption_grace_period_days - Setting.redemption_grace_period.days + 1.day - end - - def expire_warning_period_days - Setting.expire_warning_period.days - end - end - end -end diff --git a/app/interactions/force_delete_interaction/base.rb b/app/interactions/force_delete_interaction/base.rb new file mode 100644 index 000000000..4764ce8fe --- /dev/null +++ b/app/interactions/force_delete_interaction/base.rb @@ -0,0 +1,16 @@ +module ForceDeleteInteraction + class Base < ActiveInteraction::Base + object :domain, + class: Domain, + description: 'Domain to set ForceDelete on' + symbol :type, + default: :fast_track, + description: 'Force delete type, might be :fast_track or :soft' + boolean :notify_by_email, + default: false, + description: 'Do we need to send email notification' + + validates :type, inclusion: { in: %i[fast_track soft] } + end +end + diff --git a/app/interactions/force_delete_interaction/check_discarded.rb b/app/interactions/force_delete_interaction/check_discarded.rb new file mode 100644 index 000000000..e0c893294 --- /dev/null +++ b/app/interactions/force_delete_interaction/check_discarded.rb @@ -0,0 +1,11 @@ +module ForceDeleteInteraction + class CheckDiscarded < Base + def execute + return true unless domain.discarded? + + message = 'Force delete procedure cannot be scheduled while a domain is discarded' + errors.add(:domain, message) + end + end +end + diff --git a/app/interactions/force_delete_interaction/notify_by_email.rb b/app/interactions/force_delete_interaction/notify_by_email.rb new file mode 100644 index 000000000..541df258d --- /dev/null +++ b/app/interactions/force_delete_interaction/notify_by_email.rb @@ -0,0 +1,21 @@ +module ForceDeleteInteraction + class NotifyByEmail < Base + def execute + return unless notify_by_email + + if type == :fast_track + send_email + domain.update(contact_notification_sent_date: Time.zone.today) + else + domain.update(template_name: domain.notification_template) + end + end + + def send_email + DomainDeleteMailer.forced(domain: domain, + registrar: domain.registrar, + registrant: domain.registrant, + template_name: domain.notification_template).deliver_now + end + end +end diff --git a/app/interactions/force_delete_interaction/notify_registrar.rb b/app/interactions/force_delete_interaction/notify_registrar.rb new file mode 100644 index 000000000..691e54f7e --- /dev/null +++ b/app/interactions/force_delete_interaction/notify_registrar.rb @@ -0,0 +1,10 @@ +module ForceDeleteInteraction + class NotifyRegistrar < Base + def execute + domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', + domain_name: domain.name, + outzone_date: domain.outzone_date, + purge_date: domain.purge_date)) + end + end +end diff --git a/app/interactions/force_delete_interaction/post_set_process.rb b/app/interactions/force_delete_interaction/post_set_process.rb new file mode 100644 index 000000000..e51acf9b7 --- /dev/null +++ b/app/interactions/force_delete_interaction/post_set_process.rb @@ -0,0 +1,17 @@ +module ForceDeleteInteraction + class PostSetProcess < Base + def execute + statuses = domain.statuses + # Stop all pending actions + statuses.delete(DomainStatus::PENDING_UPDATE) + statuses.delete(DomainStatus::PENDING_TRANSFER) + statuses.delete(DomainStatus::PENDING_RENEW) + statuses.delete(DomainStatus::PENDING_CREATE) + + # Allow deletion + statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) + statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) + domain.save(validate: false) + end + end +end diff --git a/app/interactions/force_delete_interaction/prepare_domain.rb b/app/interactions/force_delete_interaction/prepare_domain.rb new file mode 100644 index 000000000..97f364145 --- /dev/null +++ b/app/interactions/force_delete_interaction/prepare_domain.rb @@ -0,0 +1,13 @@ +module ForceDeleteInteraction + class PrepareDomain < Base + STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze + + def execute + domain.statuses_before_force_delete = domain.statuses + domain.statuses |= STATUSES_TO_SET + domain.save(validate: false) + end + end +end diff --git a/app/interactions/force_delete_interaction/set_force_delete.rb b/app/interactions/force_delete_interaction/set_force_delete.rb new file mode 100644 index 000000000..4608b5127 --- /dev/null +++ b/app/interactions/force_delete_interaction/set_force_delete.rb @@ -0,0 +1,12 @@ +module ForceDeleteInteraction + class SetForceDelete < Base + def execute + compose(CheckDiscarded, inputs) + compose(PrepareDomain, inputs) + compose(SetStatus, inputs) + compose(PostSetProcess, inputs) + compose(NotifyRegistrar, inputs) + compose(NotifyByEmail, inputs) + end + end +end diff --git a/app/interactions/force_delete_interaction/set_status.rb b/app/interactions/force_delete_interaction/set_status.rb new file mode 100644 index 000000000..7d104aeee --- /dev/null +++ b/app/interactions/force_delete_interaction/set_status.rb @@ -0,0 +1,38 @@ +module ForceDeleteInteraction + class SetStatus < Base + def execute + domain.force_delete_type = type + type == :fast_track ? force_delete_fast_track : force_delete_soft + domain.save(validate: false) + end + + def force_delete_fast_track + domain.force_delete_date = Time.zone.today + + expire_warning_period_days + + redemption_grace_period_days + domain.force_delete_start = Time.zone.today + 1.day + end + + def force_delete_soft + years = (domain.valid_to.to_date - Time.zone.today).to_i / 365 + soft_forcedelete_dates(years) if years.positive? + end + + private + + def soft_forcedelete_dates(years) + domain.force_delete_start = domain.valid_to - years.years + domain.force_delete_date = domain.force_delete_start + + Setting.expire_warning_period.days + + Setting.redemption_grace_period.days + end + + def redemption_grace_period_days + Setting.redemption_grace_period.days + 1.day + end + + def expire_warning_period_days + Setting.expire_warning_period.days + end + end +end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index f81669c74..b119b0ce0 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -53,9 +53,9 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def schedule_force_delete(type: :fast_track, notify_by_email: false) - Domain::ForceDeleteInteraction::SetForceDelete.run(domain: self, - type: type, - notify_by_email: notify_by_email) + ForceDeleteInteraction::SetForceDelete.run(domain: self, + type: type, + notify_by_email: notify_by_email) end def clear_force_delete_data diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index b57763342..2c264d916 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -111,7 +111,7 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - result = Domain::ForceDeleteInteraction::SetForceDelete.run(domain: @domain, type: :fast_track) + result = ForceDeleteInteraction::SetForceDelete.run(domain: @domain, type: :fast_track) assert_not result.valid? assert_not @domain.force_delete_scheduled? diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 514efaf14..cc88cf35f 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -414,7 +414,7 @@ class DomainTest < ActiveSupport::TestCase force_delete_date: nil) @domain.update(template_name: 'legal_person') travel_to Time.zone.parse('2010-07-05') - Domain::ForceDeleteInteraction::SetForceDelete.run!(domain: @domain, type: :fast_track) + ForceDeleteInteraction::SetForceDelete.run!(domain: @domain, type: :fast_track) assert(@domain.force_delete_scheduled?) other_registrant = Registrant.find_by(code: 'jane-001') @domain.pending_json['new_registrant_id'] = other_registrant.id From 3d01cbb6aab4b59d065583e6fee0683dba6b6878 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Thu, 19 Nov 2020 13:40:49 +0500 Subject: [PATCH 7/7] Add test to be sure if emails are sent --- test/models/domain/force_delete_test.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 2c264d916..7c205fa74 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -1,18 +1,20 @@ require 'test_helper' -class NewDomainForceDeleteTest < ActiveSupport::TestCase +class ForceDeleteTest < ActionMailer::TestCase setup do @domain = domains(:shop) Setting.redemption_grace_period = 30 + ActionMailer::Base.deliveries.clear end def test_schedules_force_delete_fast_track assert_not @domain.force_delete_scheduled? travel_to Time.zone.parse('2010-07-05') - @domain.schedule_force_delete(type: :fast_track) + @domain.schedule_force_delete(type: :fast_track, notify_by_email: true) @domain.reload + assert_emails 1 assert @domain.force_delete_scheduled? assert_equal Date.parse('2010-08-20'), @domain.force_delete_date.to_date assert_equal Date.parse('2010-07-06'), @domain.force_delete_start.to_date