-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1874 from internetee/1838-start-force-delete-proc…
…ess-for-email-addresses-in-bounces-emails-list Auto ForceDelete on email bounces/verification fails
- Loading branch information
Showing
14 changed files
with
230 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
module Domains | ||
module ForceDeleteEmail | ||
class Base < ActiveInteraction::Base | ||
string :email, | ||
description: 'Bounced email to set ForceDelete from' | ||
|
||
def execute | ||
domain_contacts = Contact.where(email: email).map(&:domain_contacts).flatten | ||
registrant_ids = Registrant.where(email: email).pluck(:id) | ||
|
||
domains = domain_contacts.map(&:domain).flatten + | ||
Domain.where(registrant_id: registrant_ids) | ||
|
||
domains.each { |domain| process_force_delete(domain) unless domain.force_delete_scheduled? } | ||
end | ||
|
||
private | ||
|
||
def process_force_delete(domain) | ||
domain.schedule_force_delete(type: :soft, | ||
notify_by_email: true, | ||
reason: 'invalid_email', | ||
email: email) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
namespace :email_bounce do | ||
desc 'Creates a dummy email bounce by email address' | ||
task :create_test, [:email] => [:environment] do |_t, args| | ||
bounced_mail = BouncedMailAddress.new | ||
bounced_mail.email = args[:email] | ||
bounced_mail.message_id = '010f0174a0c7d348-ea6e2fc1-0854-4073-b71f-5cecf9b0d0b2-000000' | ||
bounced_mail.bounce_type = 'Permanent' | ||
bounced_mail.bounce_subtype = 'General' | ||
bounced_mail.action = 'failed' | ||
bounced_mail.status = '5.1.1' | ||
bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown' | ||
bounced_mail.save! | ||
end | ||
end |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,4 +22,29 @@ def test_delivers_domain_expiration_soft_email | |
assert_equal I18n.t("domain_expire_mailer.expired_soft.subject", domain_name: domain.name), | ||
email.subject | ||
end | ||
|
||
def test_delivers_domain_expiration_soft_email_if_auto_fd | ||
domain = domains(:shop) | ||
assert_not domain.force_delete_scheduled? | ||
travel_to Time.zone.parse('2010-07-05') | ||
email = 'some@[email protected]' | ||
|
||
Truemail.configure.default_validation_type = :regex | ||
|
||
contact = domain.admin_contacts.first | ||
contact.update_attribute(:email, email) | ||
contact.email_verification.verify | ||
|
||
assert contact.email_verification_failed? | ||
|
||
domain.reload | ||
|
||
assert domain.force_delete_scheduled? | ||
|
||
email = DomainExpireMailer.expired_soft(domain: domain, registrar: domain.registrar).deliver_now | ||
|
||
assert_emails 1 | ||
assert_equal I18n.t("domain_expire_mailer.expired_soft.subject", domain_name: domain.name), | ||
email.subject | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,52 @@ def setup | |
@bounced_mail.action = 'failed' | ||
@bounced_mail.status = '5.1.1' | ||
@bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown' | ||
|
||
@contact_email = "[email protected]" | ||
end | ||
|
||
def test_soft_force_delete_related_domains | ||
domain_contacts = Contact.where(email: @contact_email).map(&:domain_contacts).flatten | ||
|
||
domain_contacts.each do |domain_contact| | ||
domain_contact.domain.update(valid_to: Time.zone.now + 5.years) | ||
assert_not domain_contact.domain.statuses.include? DomainStatus::FORCE_DELETE | ||
assert_not domain_contact.domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED | ||
assert_not domain_contact.domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED | ||
end | ||
|
||
@bounced_mail.email = @contact_email | ||
@bounced_mail.save | ||
|
||
domain_contacts.each do |domain_contact| | ||
domain_contact.reload | ||
assert_equal 'soft', domain_contact.domain.force_delete_type | ||
assert domain_contact.domain.force_delete_scheduled? | ||
assert domain_contact.domain.statuses.include? DomainStatus::FORCE_DELETE | ||
assert domain_contact.domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED | ||
assert domain_contact.domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED | ||
end | ||
end | ||
|
||
def test_soft_force_delete_if_domain_has_force_delete_status | ||
domain_contacts = Contact.where(email: @contact_email).map(&:domain_contacts).flatten | ||
perform_enqueued_jobs do | ||
domain_contacts.each do |domain_contact| | ||
domain_contact.domain.update(valid_to: Time.zone.now + 5.years) | ||
domain_contact.domain.schedule_force_delete(type: :soft, notify_by_email: false, reason: 'test') | ||
end | ||
end | ||
force_delete_date = domain_contacts.map(&:domain).each.pluck(:force_delete_date).sample | ||
assert_not_nil force_delete_date | ||
|
||
@bounced_mail.email = @contact_email | ||
@bounced_mail.save | ||
|
||
domain_contacts.all? do |domain_contact| | ||
assert_equal force_delete_date, domain_contact.domain.force_delete_date | ||
assert_equal 'soft', domain_contact.domain.force_delete_type | ||
assert domain_contact.domain.force_delete_scheduled? | ||
end | ||
end | ||
|
||
def test_email_is_required | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,11 @@ class ForceDeleteTest < ActionMailer::TestCase | |
@domain = domains(:shop) | ||
Setting.redemption_grace_period = 30 | ||
ActionMailer::Base.deliveries.clear | ||
@old_validation_type = Truemail.configure.default_validation_type | ||
end | ||
|
||
teardown do | ||
Truemail.configure.default_validation_type = @old_validation_type | ||
end | ||
|
||
def test_schedules_force_delete_fast_track | ||
|
@@ -315,4 +320,79 @@ def test_force_delete_does_not_affect_registrant_update_confirmable | |
assert @domain.force_delete_scheduled? | ||
assert @domain.registrant_update_confirmable?(@domain.registrant_verification_token) | ||
end | ||
|
||
def test_schedules_force_delete_after_bounce | ||
@domain.update(valid_to: Time.zone.parse('2012-08-05')) | ||
assert_not @domain.force_delete_scheduled? | ||
travel_to Time.zone.parse('2010-07-05') | ||
email = @domain.admin_contacts.first.email | ||
asserted_text = "Invalid email: #{email}" | ||
|
||
prepare_bounced_email_address(email) | ||
|
||
@domain.reload | ||
|
||
assert @domain.force_delete_scheduled? | ||
assert_equal 'invalid_email', @domain.template_name | ||
assert_equal Date.parse('2010-09-19'), @domain.force_delete_date.to_date | ||
assert_equal Date.parse('2010-08-05'), @domain.force_delete_start.to_date | ||
notification = @domain.registrar.notifications.last | ||
assert notification.text.include? asserted_text | ||
end | ||
|
||
def test_schedules_force_delete_after_registrant_bounce | ||
@domain.update(valid_to: Time.zone.parse('2012-08-05')) | ||
assert_not @domain.force_delete_scheduled? | ||
travel_to Time.zone.parse('2010-07-05') | ||
email = @domain.registrant.email | ||
asserted_text = "Invalid email: #{email}" | ||
|
||
prepare_bounced_email_address(email) | ||
|
||
@domain.reload | ||
|
||
assert @domain.force_delete_scheduled? | ||
assert_equal 'invalid_email', @domain.template_name | ||
assert_equal Date.parse('2010-09-19'), @domain.force_delete_date.to_date | ||
assert_equal Date.parse('2010-08-05'), @domain.force_delete_start.to_date | ||
notification = @domain.registrar.notifications.last | ||
assert notification.text.include? asserted_text | ||
end | ||
|
||
def test_schedules_force_delete_invalid_contact | ||
@domain.update(valid_to: Time.zone.parse('2012-08-05')) | ||
assert_not @domain.force_delete_scheduled? | ||
travel_to Time.zone.parse('2010-07-05') | ||
email = 'some@[email protected]' | ||
asserted_text = "Invalid email: #{email}" | ||
|
||
Truemail.configure.default_validation_type = :regex | ||
|
||
contact = @domain.admin_contacts.first | ||
contact.update_attribute(:email, email) | ||
contact.email_verification.verify | ||
|
||
assert contact.email_verification_failed? | ||
|
||
@domain.reload | ||
|
||
assert @domain.force_delete_scheduled? | ||
assert_equal 'invalid_email', @domain.template_name | ||
assert_equal Date.parse('2010-09-19'), @domain.force_delete_date.to_date | ||
assert_equal Date.parse('2010-08-05'), @domain.force_delete_start.to_date | ||
notification = @domain.registrar.notifications.last | ||
assert notification.text.include? asserted_text | ||
end | ||
|
||
def prepare_bounced_email_address(email) | ||
@bounced_mail = BouncedMailAddress.new | ||
@bounced_mail.email = email | ||
@bounced_mail.message_id = '010f0174a0c7d348-ea6e2fc1-0854-4073-b71f-5cecf9b0d0b2-000000' | ||
@bounced_mail.bounce_type = 'Permanent' | ||
@bounced_mail.bounce_subtype = 'General' | ||
@bounced_mail.action = 'failed' | ||
@bounced_mail.status = '5.1.1' | ||
@bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown' | ||
@bounced_mail.save! | ||
end | ||
end |