email_helper_test.rb 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. require 'test_helper'
  2. class EmailHelperTest < ActiveSupport::TestCase
  3. test 'a mx_records' do
  4. domain = 'znuny.com'
  5. mx_domains = EmailHelper.mx_records(domain)
  6. assert_equal('arber.znuny.com', mx_domains[0])
  7. end
  8. test 'a email parser test' do
  9. user, domain = EmailHelper.parse_email('somebody@example.com')
  10. assert_equal('somebody', user)
  11. assert_equal('example.com', domain)
  12. user, domain = EmailHelper.parse_email('somebody+test@example.com')
  13. assert_equal('somebody+test', user)
  14. assert_equal('example.com', domain)
  15. user, domain = EmailHelper.parse_email('somebody+testexample.com')
  16. assert_not(user)
  17. assert_not(domain)
  18. end
  19. test 'provider test' do
  20. email = 'linus@kernel.org'
  21. password = 'some_pw'
  22. map = EmailHelper.provider(email, password)
  23. assert_equal('imap', map[:google_imap][:inbound][:adapter])
  24. assert_equal('imap.gmail.com', map[:google_imap][:inbound][:options][:host])
  25. assert_equal(993, map[:google_imap][:inbound][:options][:port])
  26. assert_equal(email, map[:google_imap][:inbound][:options][:user])
  27. assert_equal(password, map[:google_imap][:inbound][:options][:password])
  28. assert_equal('smtp', map[:google_imap][:outbound][:adapter])
  29. assert_equal('smtp.gmail.com', map[:google_imap][:outbound][:options][:host])
  30. assert_equal(25, map[:google_imap][:outbound][:options][:port])
  31. assert_equal(true, map[:google_imap][:outbound][:options][:start_tls])
  32. assert_equal(email, map[:google_imap][:outbound][:options][:user])
  33. assert_equal(password, map[:google_imap][:outbound][:options][:password])
  34. end
  35. test 'provider_inbound_mx' do
  36. email = 'linus@znuny.com'
  37. password = 'some_pw'
  38. user, domain = EmailHelper.parse_email(email)
  39. mx_domains = EmailHelper.mx_records(domain)
  40. map = EmailHelper.provider_inbound_mx(user, email, password, mx_domains)
  41. assert_equal('imap', map[0][:adapter])
  42. assert_equal('arber.znuny.com', map[0][:options][:host])
  43. assert_equal(993, map[0][:options][:port])
  44. assert_equal(user, map[0][:options][:user])
  45. assert_equal(password, map[0][:options][:password])
  46. assert_equal('imap', map[1][:adapter])
  47. assert_equal('arber.znuny.com', map[1][:options][:host])
  48. assert_equal(993, map[1][:options][:port])
  49. assert_equal(email, map[1][:options][:user])
  50. assert_equal(password, map[1][:options][:password])
  51. end
  52. test 'provider_inbound_guess' do
  53. email = 'linus@znuny.com'
  54. password = 'some_pw'
  55. user, domain = EmailHelper.parse_email(email)
  56. map = EmailHelper.provider_inbound_guess(user, email, password, domain)
  57. assert_equal('imap', map[0][:adapter])
  58. assert_equal('mail.znuny.com', map[0][:options][:host])
  59. assert_equal(993, map[0][:options][:port])
  60. assert_equal(user, map[0][:options][:user])
  61. assert_equal(password, map[0][:options][:password])
  62. assert_equal('imap', map[1][:adapter])
  63. assert_equal('mail.znuny.com', map[1][:options][:host])
  64. assert_equal(993, map[1][:options][:port])
  65. assert_equal(email, map[1][:options][:user])
  66. assert_equal(password, map[1][:options][:password])
  67. end
  68. test 'provider_outbound_mx' do
  69. email = 'linus@znuny.com'
  70. password = 'some_pw'
  71. user, domain = EmailHelper.parse_email(email)
  72. mx_domains = EmailHelper.mx_records(domain)
  73. map = EmailHelper.provider_outbound_mx(user, email, password, mx_domains)
  74. assert_equal('smtp', map[0][:adapter])
  75. assert_equal('arber.znuny.com', map[0][:options][:host])
  76. assert_equal(25, map[0][:options][:port])
  77. assert_equal(true, map[0][:options][:start_tls])
  78. assert_equal(user, map[0][:options][:user])
  79. assert_equal(password, map[0][:options][:password])
  80. assert_equal('smtp', map[1][:adapter])
  81. assert_equal('arber.znuny.com', map[1][:options][:host])
  82. assert_equal(25, map[1][:options][:port])
  83. assert_equal(true, map[1][:options][:start_tls])
  84. assert_equal(email, map[1][:options][:user])
  85. assert_equal(password, map[1][:options][:password])
  86. end
  87. test 'provider_outbound_guess' do
  88. email = 'linus@znuny.com'
  89. password = 'some_pw'
  90. user, domain = EmailHelper.parse_email(email)
  91. map = EmailHelper.provider_outbound_guess(user, email, password, domain)
  92. assert_equal('smtp', map[0][:adapter])
  93. assert_equal('mail.znuny.com', map[0][:options][:host])
  94. assert_equal(25, map[0][:options][:port])
  95. assert_equal(true, map[0][:options][:start_tls])
  96. assert_equal(user, map[0][:options][:user])
  97. assert_equal(password, map[0][:options][:password])
  98. assert_equal('smtp', map[1][:adapter])
  99. assert_equal('mail.znuny.com', map[1][:options][:host])
  100. assert_equal(25, map[1][:options][:port])
  101. assert_equal(true, map[1][:options][:start_tls])
  102. assert_equal(email, map[1][:options][:user])
  103. assert_equal(password, map[1][:options][:password])
  104. end
  105. test 'z probe_inbound' do
  106. # invalid adapter
  107. result = EmailHelper::Probe.inbound(
  108. adapter: 'imap2',
  109. options: {
  110. host: 'not_existsing_host',
  111. port: 993,
  112. ssl: true,
  113. user: 'some@example.com',
  114. password: 'password',
  115. }
  116. )
  117. assert_equal('failed', result[:result])
  118. # network issues
  119. result = EmailHelper::Probe.inbound(
  120. adapter: 'imap',
  121. options: {
  122. host: 'not_existsing_host',
  123. port: 993,
  124. ssl: true,
  125. user: 'some@example.com',
  126. password: 'password',
  127. }
  128. )
  129. assert_equal('invalid', result[:result])
  130. assert_equal('Hostname not found!', result[:message_human])
  131. assert_equal('not_existsing_host', result[:settings][:options][:host])
  132. result = EmailHelper::Probe.inbound(
  133. adapter: 'imap',
  134. options: {
  135. host: 'www.znuny.com',
  136. port: 993,
  137. ssl: true,
  138. user: 'some@example.com',
  139. password: 'password',
  140. }
  141. )
  142. assert_equal('invalid', result[:result])
  143. assert_equal('Connection refused!', result[:message_human])
  144. assert_equal('www.znuny.com', result[:settings][:options][:host])
  145. result = EmailHelper::Probe.inbound(
  146. adapter: 'imap',
  147. options: {
  148. host: '172.42.42.42',
  149. port: 993,
  150. ssl: true,
  151. user: 'some@example.com',
  152. password: 'password',
  153. }
  154. )
  155. assert_equal('invalid', result[:result])
  156. assert_match(/Host not reachable|No route to host/, result[:message_human])
  157. assert_equal('172.42.42.42', result[:settings][:options][:host])
  158. # gmail
  159. result = EmailHelper::Probe.inbound(
  160. adapter: 'imap',
  161. options: {
  162. host: 'imap.gmail.com',
  163. port: 993,
  164. ssl: true,
  165. user: 'some@example.com',
  166. password: 'password',
  167. }
  168. )
  169. assert_equal('invalid', result[:result])
  170. assert_match(/Authentication failed, username incorrect|Authentication failed, invalid credentials/, result[:message_human])
  171. assert_equal('imap.gmail.com', result[:settings][:options][:host])
  172. result = EmailHelper::Probe.inbound(
  173. adapter: 'imap',
  174. options: {
  175. host: 'imap.gmail.com',
  176. port: 993,
  177. ssl: true,
  178. user: 'frank.tailor05@googlemail.com',
  179. password: 'password',
  180. }
  181. )
  182. assert_equal('invalid', result[:result])
  183. # if we have to many failed logins, we need to handle another error message
  184. if result[:message_human].present?
  185. assert_match(/Authentication failed, username incorrect|Authentication failed, invalid credentials/, result[:message_human])
  186. else
  187. assert_match(/Web login required/, result[:message])
  188. end
  189. assert_equal('imap.gmail.com', result[:settings][:options][:host])
  190. # dovecot
  191. result = EmailHelper::Probe.inbound(
  192. adapter: 'imap',
  193. options: {
  194. host: 'arber.znuny.com',
  195. port: 993,
  196. ssl: true,
  197. user: 'some@example.com',
  198. password: 'password',
  199. }
  200. )
  201. assert_equal('invalid', result[:result])
  202. assert_equal('Authentication failed!', result[:message_human])
  203. assert_equal('arber.znuny.com', result[:settings][:options][:host])
  204. # realtest - test I
  205. if !ENV['EMAILHELPER_MAILBOX_1']
  206. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  207. end
  208. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  209. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  210. user, domain = EmailHelper.parse_email(mailbox_user)
  211. result = EmailHelper::Probe.inbound(
  212. adapter: 'imap',
  213. options: {
  214. host: 'arber.znuny.com',
  215. port: 993,
  216. ssl: true,
  217. user: user,
  218. password: mailbox_password,
  219. }
  220. )
  221. assert_equal('ok', result[:result])
  222. end
  223. test 'z probe_outbound' do
  224. # invalid adapter
  225. result = EmailHelper::Probe.outbound(
  226. {
  227. adapter: 'smtp2',
  228. options: {
  229. host: 'not_existsing_host',
  230. port: 25,
  231. start_tls: true,
  232. user: 'some@example.com',
  233. password: 'password',
  234. },
  235. },
  236. 'some@example.com',
  237. )
  238. assert_equal('failed', result[:result])
  239. # network issues
  240. result = EmailHelper::Probe.outbound(
  241. {
  242. adapter: 'smtp',
  243. options: {
  244. host: 'not_existsing_host',
  245. port: 25,
  246. start_tls: true,
  247. user: 'some@example.com',
  248. password: 'password',
  249. }
  250. },
  251. 'some@example.com',
  252. )
  253. assert_equal('invalid', result[:result])
  254. assert_equal('Hostname not found!', result[:message_human])
  255. assert_equal('not_existsing_host', result[:settings][:options][:host])
  256. result = EmailHelper::Probe.outbound(
  257. {
  258. adapter: 'smtp',
  259. options: {
  260. host: 'www.znuny.com',
  261. port: 26,
  262. start_tls: true,
  263. user: 'some@example.com',
  264. password: 'password',
  265. }
  266. },
  267. 'some@example.com',
  268. )
  269. assert_equal('invalid', result[:result])
  270. assert_equal('Connection refused!', result[:message_human])
  271. assert_equal('www.znuny.com', result[:settings][:options][:host])
  272. result = EmailHelper::Probe.outbound(
  273. {
  274. adapter: 'smtp',
  275. options: {
  276. host: '172.42.42.42',
  277. port: 25,
  278. start_tls: true,
  279. user: 'some@example.com',
  280. password: 'password',
  281. }
  282. },
  283. 'some@example.com',
  284. )
  285. assert_equal('invalid', result[:result])
  286. assert_match(/Host not reachable|No route to host/, result[:message_human])
  287. assert_equal('172.42.42.42', result[:settings][:options][:host])
  288. # gmail
  289. result = EmailHelper::Probe.outbound(
  290. {
  291. adapter: 'smtp',
  292. options: {
  293. host: 'smtp.gmail.com',
  294. port: 25,
  295. start_tls: true,
  296. user: 'some@example.com',
  297. password: 'password',
  298. }
  299. },
  300. 'some@example.com',
  301. )
  302. assert_equal('invalid', result[:result])
  303. assert_equal('Authentication failed!', result[:message_human])
  304. assert_equal('smtp.gmail.com', result[:settings][:options][:host])
  305. result = EmailHelper::Probe.outbound(
  306. {
  307. adapter: 'smtp',
  308. options: {
  309. host: 'smtp.gmail.com',
  310. port: 25,
  311. start_tls: true,
  312. user: 'frank.tailor05@googlemail.com',
  313. password: 'password',
  314. }
  315. },
  316. 'some@example.com',
  317. )
  318. assert_equal('invalid', result[:result])
  319. # if we have to many failed logins, we need to handle another error message
  320. if result[:message_human].present?
  321. assert_equal('Authentication failed!', result[:message_human])
  322. else
  323. assert_match(/Please log in with your web browser and then try again/, result[:message])
  324. end
  325. assert_equal('smtp.gmail.com', result[:settings][:options][:host])
  326. # dovecot
  327. result = EmailHelper::Probe.outbound(
  328. {
  329. adapter: 'smtp',
  330. options: {
  331. host: 'arber.znuny.com',
  332. port: 25,
  333. start_tls: true,
  334. user: 'some@example.com',
  335. password: 'password',
  336. }
  337. },
  338. 'some@example.com',
  339. )
  340. assert_equal('invalid', result[:result])
  341. assert_equal('Authentication failed!', result[:message_human])
  342. assert_equal('arber.znuny.com', result[:settings][:options][:host])
  343. # realtest - test I
  344. if !ENV['EMAILHELPER_MAILBOX_1']
  345. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  346. end
  347. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  348. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  349. user, domain = EmailHelper.parse_email(mailbox_user)
  350. result = EmailHelper::Probe.outbound(
  351. {
  352. adapter: 'smtp',
  353. options: {
  354. host: 'arber.znuny.com',
  355. port: 25,
  356. start_tls: true,
  357. user: user,
  358. password: mailbox_password,
  359. }
  360. },
  361. mailbox_user,
  362. )
  363. assert_equal('ok', result[:result])
  364. end
  365. test 'zz probe' do
  366. result = EmailHelper::Probe.full(
  367. email: 'invalid_format',
  368. password: 'somepass',
  369. )
  370. assert_equal('invalid', result[:result])
  371. assert_not(result[:setting])
  372. # realtest - test I, with imap
  373. if !ENV['EMAILHELPER_MAILBOX_1']
  374. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  375. end
  376. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  377. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  378. result = EmailHelper::Probe.full(
  379. email: mailbox_user,
  380. password: mailbox_password,
  381. )
  382. assert_equal('ok', result[:result])
  383. assert_equal('arber.znuny.com', result[:setting][:inbound][:options][:host])
  384. assert_equal('arber.znuny.com', result[:setting][:outbound][:options][:host])
  385. # realtest - test II, gmail with only pop3
  386. if !ENV['EMAILHELPER_MAILBOX_2']
  387. raise "Need EMAILHELPER_MAILBOX_2 as ENV variable like export EMAILHELPER_MAILBOX_2='hansb36621@gmail.com:somepass'"
  388. end
  389. mailbox_user = ENV['EMAILHELPER_MAILBOX_2'].split(':')[0]
  390. mailbox_password = ENV['EMAILHELPER_MAILBOX_2'].split(':')[1]
  391. result = EmailHelper::Probe.full(
  392. email: mailbox_user,
  393. password: mailbox_password,
  394. )
  395. assert_nil(result[:reason])
  396. assert_equal('ok', result[:result])
  397. assert_equal('pop.gmail.com', result[:setting][:inbound][:options][:host])
  398. assert_equal('smtp.gmail.com', result[:setting][:outbound][:options][:host])
  399. end
  400. test 'zz verify' do
  401. # realtest - test I, with imap
  402. if !ENV['EMAILHELPER_MAILBOX_1']
  403. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  404. end
  405. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  406. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  407. user, domain = EmailHelper.parse_email(mailbox_user)
  408. result = EmailHelper::Verify.email(
  409. inbound: {
  410. adapter: 'imap',
  411. options: {
  412. host: 'arber.znuny.com',
  413. port: 993,
  414. ssl: true,
  415. user: user,
  416. password: mailbox_password,
  417. },
  418. },
  419. outbound: {
  420. adapter: 'smtp',
  421. options: {
  422. host: 'arber.znuny.com',
  423. port: 25,
  424. start_tls: true,
  425. user: user,
  426. password: mailbox_password,
  427. },
  428. },
  429. sender: mailbox_user,
  430. )
  431. assert_equal('ok', result[:result])
  432. # realtest - test II, gmail with pop3
  433. if !ENV['EMAILHELPER_MAILBOX_2']
  434. raise "Need EMAILHELPER_MAILBOX_2 as ENV variable like export EMAILHELPER_MAILBOX_2='hansb36621@gmail.com:somepass'"
  435. end
  436. mailbox_user = ENV['EMAILHELPER_MAILBOX_2'].split(':')[0]
  437. mailbox_password = ENV['EMAILHELPER_MAILBOX_2'].split(':')[1]
  438. user, domain = EmailHelper.parse_email(mailbox_user)
  439. result = EmailHelper::Verify.email(
  440. inbound: {
  441. adapter: 'pop3',
  442. options: {
  443. host: 'pop.gmail.com',
  444. port: 995,
  445. ssl: true,
  446. user: mailbox_user,
  447. password: mailbox_password,
  448. },
  449. },
  450. outbound: {
  451. adapter: 'smtp',
  452. options: {
  453. host: 'smtp.gmail.com',
  454. port: 25,
  455. start_tls: true,
  456. user: mailbox_user,
  457. password: mailbox_password,
  458. },
  459. },
  460. sender: mailbox_user,
  461. )
  462. assert_equal('ok', result[:result])
  463. end
  464. end