diff --git a/app/models/concerns/email_verifable.rb b/app/models/concerns/email_verifable.rb index 1973e06280..546333ece0 100644 --- a/app/models/concerns/email_verifable.rb +++ b/app/models/concerns/email_verifable.rb @@ -4,12 +4,18 @@ module EmailVerifable included do scope :recently_not_validated, -> { where.not(id: ValidationEvent.validated_ids_by(name)) } - after_save :verify_email, if: :email_changed? + after_save :validate_email_by_regex_and_mx, if: :email_previously_changed? + after_save :remove_force_delete, if: :email_previously_changed? + end + + def validate_email_by_regex_and_mx + verify_email(check_level: 'regex') + verify_email(check_level: 'mx') end def remove_force_delete domains.each do |domain| - contact_emails_valid?(domain) ? domain.cancel_force_delete : domain.schedule_force_delete + contact_emails_valid?(domain) ? domain.cancel_force_delete : nil end end diff --git a/test/models/contact_test.rb b/test/models/contact_test.rb index 2953f9b3d0..84caf73294 100644 --- a/test/models/contact_test.rb +++ b/test/models/contact_test.rb @@ -321,6 +321,61 @@ def test_remove_email_whitespaces assert_equal contact.email, 'test@test.test' end + def test_verify_email_if_it_changed + Contact.set_callback(:save, :after, :validate_email_by_regex_and_mx) + + # check that email is invalid + assert_equal @contact.validation_events.count, 0 + + trumail_results = OpenStruct.new(success: false, + email: @contact.email, + domain: 'box.tests', + errors: { mx: 'target host(s) not found' }) + + runner = Actions::EmailCheck.new(email: @contact.email, + validation_eventable: @contact, + check_level: 'mx') + + runner.stub :call, trumail_results do + 3.times do + perform_enqueued_jobs do + VerifyEmailsJob.perform_now(email: @contact.email, check_level: 'mx') + end + end + end + + assert_equal @contact.validation_events.count, 3 + validation_event = @contact.validation_events.last + + assert_equal validation_event.check_level, 'mx' + assert_equal validation_event.success, false + + # set force delete to releted contact domain because invlid email + assert @contact.need_to_start_force_delete? + + @contact.domains.each do |domain| + domain.schedule_force_delete(type: :soft) + end + + # check it + assert @contact.domains.first.force_delete_scheduled? + + # change email to valid + + Truemail.configure.whitelisted_domains = ['email.com'] + + @contact.email = 'valid@email.com' + @contact.save && @contact.reload + + @contact.reload + + assert_equal @contact.validation_events.count, 1 + + # check that force delete is removed + + assert_not @contact.domains.first.force_delete_scheduled? + end + private def make_contact_free_of_domains_where_it_acts_as_a_registrant(contact) diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 5ad6f75031..aaecfcf787 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -9,6 +9,8 @@ class ForceDeleteTest < ActionMailer::TestCase ActionMailer::Base.deliveries.clear @old_validation_type = Truemail.configure.default_validation_type ValidationEvent.destroy_all + + Truemail.configure.whitelisted_domains = ['email.com', 'internet2.ee'] end teardown do @@ -403,6 +405,8 @@ def test_schedules_force_delete_invalid_contact end def test_add_invalid_email_to_domain_status_notes + Contact.skip_callback(:save, :after, :remove_force_delete) + domain = domains(:airport) domain.update(valid_to: Time.zone.parse('2012-08-05'), statuses: %w[serverForceDelete serverRenewProhibited serverTransferProhibited], @@ -417,6 +421,8 @@ def test_add_invalid_email_to_domain_status_notes Truemail.configure.default_validation_type = :regex contact_first = domain.admin_contacts.first + + contact_first.update_attribute(:email_history, 'john@inbox.test') contact_first.update_attribute(:email, email) @@ -461,6 +467,8 @@ def test_remove_invalid_email_from_domain_status_notes end def test_domain_should_have_several_bounced_emails + Contact.skip_callback(:save, :after, :validate_email_by_regex_and_mx) + @domain.update(valid_to: Time.zone.parse('2012-08-05')) assert_not @domain.force_delete_scheduled? travel_to Time.zone.parse('2010-07-05') diff --git a/test/models/validation_event_test.rb b/test/models/validation_event_test.rb index 86f13885f3..1e9afb01d2 100644 --- a/test/models/validation_event_test.rb +++ b/test/models/validation_event_test.rb @@ -36,6 +36,7 @@ def test_fd_didnt_set_if_mx_interation_less_then_value assert_not @domain.force_delete_scheduled? travel_to Time.zone.parse('2010-07-05') + Contact.skip_callback(:save, :after, :validate_email_by_regex_and_mx) email = 'email@somestrangedomain12345.ee' contact = @domain.admin_contacts.first contact.update_attribute(:email, email) diff --git a/test/tasks/emails/verify_email_task_test.rb b/test/tasks/emails/verify_email_task_test.rb index e7540cb354..c1471962cc 100644 --- a/test/tasks/emails/verify_email_task_test.rb +++ b/test/tasks/emails/verify_email_task_test.rb @@ -54,13 +54,14 @@ def test_should_not_affect_successfully_verified_emails end def test_should_verify_contact_email_which_was_not_verified + assert_equal ValidationEvent.count, 0 - + run_task - + assert_equal ValidationEvent.count, Contact.count - 1 assert_equal Contact.count, 9 - + assert_difference 'Contact.count', 1 do create_valid_contact end