email_address_validation_spec.rb 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe EmailAddressValidation do
  4. shared_examples 'email address validity' do |valid:, check_mx:|
  5. let(:email_address_validation) { described_class.new(email_address) }
  6. it 'reports given email address' do
  7. expect(email_address_validation.email_address).to eq(email_address)
  8. expect(email_address_validation.to_s).to eq(email_address)
  9. end
  10. it "reports email address as #{valid ? 'valid' : 'invalid'}" do
  11. expect(email_address_validation.valid?(check_mx: check_mx)).to be(valid)
  12. end
  13. end
  14. shared_examples 'email address validity exception' do |check_mx:, error_message: ''|
  15. let(:email_address_validation) { described_class.new(email_address) }
  16. it 'raises invalid email address error' do
  17. expect { email_address_validation.valid!(check_mx: check_mx) }.to raise_error(EmailAddressValidation::InvalidEmailAddressError, "The email address is invalid: #{error_message}")
  18. end
  19. end
  20. describe 'Email address' do
  21. describe 'with MX record' do
  22. let(:email_address) { 'greetings@zammad.org' }
  23. include_examples 'email address validity', valid: true, check_mx: true
  24. end
  25. describe 'without MX record' do
  26. let(:email_address) { 'someone@this-is-probably-a-non-existent-domain.com.example' }
  27. include_examples 'email address validity', valid: true, check_mx: false
  28. end
  29. describe 'with unicode characters' do
  30. let(:email_address) { 'ąžuolas@paštas.com' }
  31. include_examples 'email address validity', valid: true, check_mx: false
  32. end
  33. describe 'with special characters' do
  34. let(:email_address) { '"a+ddress="@example.com' }
  35. include_examples 'email address validity', valid: true, check_mx: false
  36. end
  37. describe 'with short legacy gmail address' do
  38. let(:email_address) { 'you@gmail.com' }
  39. include_examples 'email address validity', valid: true, check_mx: false
  40. end
  41. describe 'when very long local part' do
  42. let(:email_address) { 'd+aorgprcb5rboeldeti12rh-4fs92usdgsdzkw1xfppexrzd_efcxum1rxchmhjlplidc99k0141zduz2rmsvi2boiep-8b3-xh1dtbdvqjqn7lhguq6zh4nza8jmc2pv3thujtjatgtk@docs.google.com' }
  43. include_examples 'email address validity', valid: true, check_mx: false
  44. end
  45. describe 'when mailbox part is below the limit' do
  46. let(:email_address) { 'verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere.verylonglocalparthere@domain.tld' }
  47. include_examples 'email address validity', valid: true, check_mx: false
  48. end
  49. describe 'when mailbox part is above the limit' do
  50. let(:email_address) { 'trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere.trulyverylonglocalparthere@domain.tld' }
  51. include_examples 'email address validity', valid: false, check_mx: false
  52. include_examples 'email address validity exception', error_message: 'Mailbox name too long', check_mx: false
  53. end
  54. describe 'when max length' do
  55. let(:email_address) { 'trulyverylongpastasdomainnamehere.trulyverylongpastasdomain@trulyverylongpastasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpastasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpastasdomainnameheredoublethatloremipsumname.com' }
  56. include_examples 'email address validity', valid: true, check_mx: false
  57. end
  58. describe 'when over max length' do
  59. let(:email_address) { 'trulyverylongpastasdomainnamehere.trulyverylongpastasdomainnamee@trulyverylongpastasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpastasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpastasdomainnameheredoublethatloremipsumname.com' }
  60. include_examples 'email address validity', valid: false, check_mx: false
  61. include_examples 'email address validity exception', error_message: 'Address too long', check_mx: false
  62. end
  63. describe 'when max length with unicode characters' do
  64. let(:email_address) { 'trulyverylongpaštasdomainnamehere.trulyverylongpaštasdomain@trulyverylongpaštasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpaštasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpaštasdomainnameheredob.com' }
  65. include_examples 'email address validity', valid: true, check_mx: false
  66. end
  67. describe 'when local non-localhost email' do
  68. let(:email_address) { 'test@localhost' }
  69. include_examples 'email address validity', valid: true, check_mx: false
  70. end
  71. describe 'without dot in domain' do
  72. let(:email_address) { 'greetings@localhost' }
  73. include_examples 'email address validity', valid: true, check_mx: false
  74. end
  75. describe 'without domain' do
  76. let(:email_address) { 'zammad' }
  77. include_examples 'email address validity', valid: false, check_mx: false
  78. include_examples 'email address validity exception', error_message: 'Invalid Domain Name', check_mx: false
  79. end
  80. describe 'when too long' do
  81. let(:email_address) { 'trulyverylongpastasdomainnamehere.trulyverylongpastasdomainnamee@trulyverylongpastasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpastasdomainnameheredoublethatloremipsumnamecodena.trulyverylongpastasdomainnameheredoublethatloremipsumnametoolong.com' }
  82. include_examples 'email address validity', valid: false, check_mx: false
  83. include_examples 'email address validity exception', error_message: 'Address too long', check_mx: false
  84. end
  85. describe 'with invalid domain format' do
  86. let(:email_address) { 'greetings@example..com' }
  87. include_examples 'email address validity', valid: false, check_mx: false
  88. include_examples 'email address validity exception', error_message: 'Invalid Domain Name', check_mx: false
  89. end
  90. describe 'which is empty' do
  91. let(:email_address) { '' }
  92. include_examples 'email address validity', valid: false, check_mx: false
  93. include_examples 'email address validity exception', error_message: 'Mailbox name too short', check_mx: false
  94. end
  95. describe 'which starts with +' do
  96. let(:email_address) { '+123@example.org' }
  97. include_examples 'email address validity', valid: true, check_mx: false
  98. end
  99. end
  100. end