internetee-registry/test/interactions/email_check_test.rb
oleghasjanov f866b549b5 # Improve email validation regex pattern and add comprehensive tests
This commit updates the email validation pattern in Truemail configuration to better handle various email format edge cases. The changes include:
Refine email regex pattern in config/initializers/truemail.rb to properly validate:
RFC compliant local parts with allowed special characters
Proper domain name formatting
Prevention of consecutive dots in both local part and domain
Leading and trailing dots in local part
Add comprehensive test cases in test/interactions/email_check_test.rb to verify:
Valid email formats like standard addresses, underscore usage, and dot-atom formats
Invalid email formats including consecutive dots, leading/trailing dots, and invalid characters
These changes ensure our email validation is more RFC-compliant while still being strict enough to catch common errors. The test suite now explicitly validates both positive and negative test cases for email format validation.
2025-03-10 14:24:02 +02:00

141 lines
4.5 KiB
Ruby

require 'test_helper'
class EmailCheckTest < ActiveSupport::TestCase
setup do
WebMock.disable_net_connect!
@contact = contacts(:john)
end
def test_validates_regex_email_format
valid_emails = [
'user@domain.com',
'user_@domain.com',
'user.name@domain.com',
'hello.world@example.com',
'_user.email@domain.com',
'__user.email@domain.com',
]
valid_emails.each_with_index do |email, index|
assert Actions::EmailCheck.new(email: email, validation_eventable: @contact, check_level: 'regex').call
end
invalid_emails = [
'user..name@domain.com',
'.user@domain.com',
'user.@domain.com',
'us"er@domain.com',
'user@domain..com'
]
invalid_emails.each do |email|
refute Actions::EmailCheck.new(email: email, validation_eventable: @contact, check_level: 'regex').call
end
end
def test_invalid_email_in_mx_level_with_a_and_aaaa_records
Spy.on_instance_method(Actions::EmailCheck, :check_email).and_return(trumail_result)
Spy.on_instance_method(Actions::AAndAaaaEmailValidation, :call).and_return([true])
Actions::EmailCheck.new(email: @contact.email,
validation_eventable: @contact,
check_level: 'mx').call
assert_equal @contact.validation_events.count, 1
assert @contact.validation_events.last.success
end
def test_invalid_email_in_mx_level_with_empty_a_and_aaaa_records
Spy.on_instance_method(Actions::EmailCheck, :check_email).and_return(trumail_result)
Spy.on_instance_method(Actions::AAndAaaaEmailValidation, :call).and_return([])
Actions::EmailCheck.new(email: @contact.email,
validation_eventable: @contact,
check_level: 'mx').call
assert_equal @contact.validation_events.count, 1
refute @contact.validation_events.last.success
end
def test_should_remove_invalid_validation_records_if_there_count_more_than_three
Spy.on_instance_method(Actions::EmailCheck, :check_email).and_return(trumail_result)
Spy.on_instance_method(Actions::AAndAaaaEmailValidation, :call).and_return([])
action = Actions::EmailCheck.new(email: @contact.email,
validation_eventable: @contact,
check_level: 'mx')
3.times { action.call }
assert_equal @contact.validation_events.count, 3
refute @contact.validation_events.last.success
3.times { action.call }
assert_equal @contact.validation_events.count, 3
refute @contact.validation_events.last.success
end
def test_should_remove_valid_validation_record_if_there_count_more_than_one
Spy.on_instance_method(Actions::EmailCheck, :check_email).and_return(trumail_result)
Spy.on_instance_method(Actions::AAndAaaaEmailValidation, :call).and_return([true])
action = Actions::EmailCheck.new(email: @contact.email,
validation_eventable: @contact,
check_level: 'mx')
3.times { action.call }
assert_equal @contact.validation_events.count, 1
assert @contact.validation_events.last.success
end
def test_should_remove_old_record_if_validation_pass_the_limit
action = Actions::EmailCheck.new(email: @contact.email,
validation_eventable: @contact,
check_level: 'mx')
action.stub :check_email, trumail_result do
4.times do
action.call
end
end
assert_equal @contact.validation_events.count, 3
end
def test_should_remove_old_record_if_multiple_contacts_has_the_same_email
contact_two = contacts(:william)
contact_two.update(email: @contact.email)
contact_two.reload
action = Actions::EmailCheck.new(email: @contact.email,
validation_eventable: @contact,
check_level: 'mx')
action.stub :check_email, trumail_result do
4.times do
action.call
end
end
assert_equal @contact.validation_events.count, 3
assert_equal contact_two.validation_events.count, 3
end
def test_should_test_email_with_punnycode
email = "info@xn--energiathus-mfb.ee"
result = Actions::SimpleMailValidator.run(email: email, level: :mx)
assert result
end
private
def trumail_result
OpenStruct.new(success: false,
email: @contact.email,
domain: 'box.tests',
errors: { mx: 'target host(s) not found' })
end
end