email_helper_spec.rb 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe EmailHelper do
  4. describe '#mx_records', integration: true do
  5. context 'when checking for regular domains' do
  6. subject(:result) { described_class.mx_records(domain) }
  7. let(:domain) { 'zammad.com' }
  8. it { is_expected.to eq(['mx2.zammad.com']) }
  9. end
  10. end
  11. describe '#parse_email' do
  12. subject(:result) { described_class.parse_email(mail_address) }
  13. context 'when parsing a well formatted mail address' do
  14. let(:mail_address) { 'somebody@example.com' }
  15. let(:result) { [ 'somebody', 'example.com' ] }
  16. it { is_expected.to eq(result) }
  17. end
  18. context 'when parsing another well formatted mail address' do
  19. let(:mail_address) { 'somebody+test@example.com' }
  20. let(:result) { [ 'somebody+test', 'example.com' ] }
  21. it { is_expected.to eq(result) }
  22. end
  23. context 'when parsing an invalid mail address' do
  24. let(:mail_address) { 'somebody+testexample.com' }
  25. let(:result) { [ nil, nil ] }
  26. it { is_expected.to eq(result) }
  27. end
  28. end
  29. describe '#provider' do
  30. subject(:result) { described_class.provider(mail_address, password) }
  31. context 'when checking for gmail' do
  32. let(:mail_address) { 'linus@kernel.org' }
  33. let(:password) { 'some_pw' }
  34. context 'when inbound' do
  35. let(:ssl_options) { { key: 'ssl', value: true } }
  36. let(:expected_result_inbound) { provider_setting('imap', 993, mail_address, password, ssl_options) }
  37. it 'contains correct inbound provider information' do
  38. expect(described_class.provider(mail_address, password)[:google_imap][:inbound]).to eq(expected_result_inbound)
  39. end
  40. end
  41. context 'when outbound' do
  42. let(:ssl_options) { { key: 'start_tls', value: true } }
  43. let(:expected_result_outbound) { provider_setting('smtp', 587, mail_address, password, ssl_options) }
  44. it 'contains correct outbound provider information' do
  45. expect(described_class.provider(mail_address, password)[:google_imap][:outbound]).to eq(expected_result_outbound)
  46. end
  47. end
  48. def provider_setting(adapter, port, user, password, ssl_options)
  49. {
  50. adapter: adapter,
  51. options: {
  52. host: "#{adapter}.gmail.com",
  53. port: port,
  54. user: user,
  55. password: password,
  56. ssl_options[:key].to_sym => ssl_options[:value],
  57. },
  58. }
  59. end
  60. end
  61. end
  62. describe '#provider_inbound_mx', integration: true do
  63. subject(:result) { described_class.provider_inbound_mx(user, email, password, mx_domains) }
  64. let(:email) { 'linus@zammad.com' }
  65. let(:password) { 'some_pw' }
  66. let(:parsed_email) { described_class.parse_email(email) }
  67. let(:user) { parsed_email.first }
  68. let(:domain) { parsed_email.last }
  69. let(:mx_domains) { described_class.mx_records(domain) }
  70. let(:expected_result) do
  71. [
  72. provider_inbound_mx_setting(mx_domains[0], 993, user, password),
  73. provider_inbound_mx_setting(mx_domains[0], 993, email, password),
  74. ]
  75. end
  76. def provider_inbound_mx_setting(host, port, user, password)
  77. {
  78. adapter: 'imap',
  79. options: {
  80. host: host,
  81. port: port,
  82. ssl: true,
  83. user: user,
  84. password: password,
  85. },
  86. }
  87. end
  88. it { is_expected.to eq(expected_result) }
  89. end
  90. describe '#provider_inbound_guess' do
  91. subject(:result) { described_class.provider_inbound_guess(user, email, password, domain) }
  92. let(:email) { 'linus@zammad.com' }
  93. let(:password) { 'some_pw' }
  94. let(:parsed_email) { described_class.parse_email(email) }
  95. let(:user) { parsed_email.first }
  96. let(:domain) { parsed_email.last }
  97. let(:expected_result) do
  98. [
  99. provider_inbound_guess_setting('imap', 'mail.zammad.com', 993, user, password),
  100. provider_inbound_guess_setting('imap', 'mail.zammad.com', 993, email, password),
  101. provider_inbound_guess_setting('imap', 'imap.zammad.com', 993, user, password),
  102. provider_inbound_guess_setting('imap', 'imap.zammad.com', 993, email, password),
  103. provider_inbound_guess_setting('pop3', 'mail.zammad.com', 995, user, password),
  104. provider_inbound_guess_setting('pop3', 'mail.zammad.com', 995, email, password),
  105. provider_inbound_guess_setting('pop3', 'pop.zammad.com', 995, user, password),
  106. provider_inbound_guess_setting('pop3', 'pop.zammad.com', 995, email, password),
  107. provider_inbound_guess_setting('pop3', 'pop3.zammad.com', 995, user, password),
  108. provider_inbound_guess_setting('pop3', 'pop3.zammad.com', 995, email, password),
  109. ]
  110. end
  111. def provider_inbound_guess_setting(adapter, host, port, user, password)
  112. {
  113. adapter: adapter,
  114. options: {
  115. host: host,
  116. port: port,
  117. ssl: true,
  118. user: user,
  119. password: password,
  120. }
  121. }
  122. end
  123. it { is_expected.to eq(expected_result) }
  124. end
  125. describe '#provider_outbound_mx', integration: true do
  126. subject(:result) { described_class.provider_outbound_mx(user, email, password, mx_domains) }
  127. let(:email) { 'linus@zammad.com' }
  128. let(:password) { 'some_pw' }
  129. let(:parsed_email) { described_class.parse_email(email) }
  130. let(:user) { parsed_email.first }
  131. let(:domain) { parsed_email.last }
  132. let(:mx_domains) { described_class.mx_records(domain) }
  133. let(:expected_result) do
  134. [
  135. provider_outbound_mx_setting(mx_domains[0], 465, true, user, password),
  136. provider_outbound_mx_setting(mx_domains[0], 465, true, email, password),
  137. provider_outbound_mx_setting(mx_domains[0], 587, nil, user, password),
  138. provider_outbound_mx_setting(mx_domains[0], 587, nil, email, password),
  139. provider_outbound_mx_setting(mx_domains[0], 25, true, user, password),
  140. provider_outbound_mx_setting(mx_domains[0], 25, true, email, password),
  141. ]
  142. end
  143. def provider_outbound_mx_setting(host, port, with_ssl, user, password)
  144. options = {
  145. host: host,
  146. port: port,
  147. user: user,
  148. password: password,
  149. }
  150. if with_ssl.present?
  151. options[:start_tls] = with_ssl
  152. end
  153. {
  154. adapter: 'smtp',
  155. options: options,
  156. }
  157. end
  158. it { is_expected.to eq(expected_result) }
  159. end
  160. describe '#provider_outbound_guess' do
  161. subject(:result) { described_class.provider_outbound_guess(user, email, password, domain) }
  162. let(:email) { 'linus@zammad.com' }
  163. let(:password) { 'some_pw' }
  164. let(:parsed_email) { described_class.parse_email(email) }
  165. let(:user) { parsed_email.first }
  166. let(:domain) { parsed_email.last }
  167. let(:expected_result) do
  168. [
  169. provider_outbound_guess_setting('mail.zammad.com', 465, user, password),
  170. provider_outbound_guess_setting('mail.zammad.com', 465, email, password),
  171. provider_outbound_guess_setting('smtp.zammad.com', 465, user, password),
  172. provider_outbound_guess_setting('smtp.zammad.com', 465, email, password),
  173. provider_outbound_guess_setting('mail.zammad.com', 587, user, password),
  174. provider_outbound_guess_setting('mail.zammad.com', 587, email, password),
  175. provider_outbound_guess_setting('smtp.zammad.com', 587, user, password),
  176. provider_outbound_guess_setting('smtp.zammad.com', 587, email, password),
  177. provider_outbound_guess_setting('mail.zammad.com', 25, user, password),
  178. provider_outbound_guess_setting('mail.zammad.com', 25, email, password),
  179. provider_outbound_guess_setting('smtp.zammad.com', 25, user, password),
  180. provider_outbound_guess_setting('smtp.zammad.com', 25, email, password),
  181. ]
  182. end
  183. def provider_outbound_guess_setting(host, port, user, password)
  184. {
  185. adapter: 'smtp',
  186. options: {
  187. host: host,
  188. port: port,
  189. start_tls: true,
  190. user: user,
  191. password: password,
  192. }
  193. }
  194. end
  195. it { is_expected.to eq(expected_result) }
  196. end
  197. end