|
@@ -0,0 +1,270 @@
|
|
|
+# encoding: utf-8
|
|
|
+require 'test_helper'
|
|
|
+
|
|
|
+class EmailDeliverTest < ActiveSupport::TestCase
|
|
|
+ test 'basic check' do
|
|
|
+
|
|
|
+ if !ENV['MAIL_SERVER']
|
|
|
+ raise "Need MAIL_SERVER as ENV variable like export MAIL_SERVER='mx.example.com'"
|
|
|
+ end
|
|
|
+ if !ENV['MAIL_SERVER_ACCOUNT']
|
|
|
+ raise "Need MAIL_SERVER_ACCOUNT as ENV variable like export MAIL_SERVER_ACCOUNT='user:somepass'"
|
|
|
+ end
|
|
|
+ server_login = ENV['MAIL_SERVER_ACCOUNT'].split(':')[0]
|
|
|
+ server_password = ENV['MAIL_SERVER_ACCOUNT'].split(':')[1]
|
|
|
+
|
|
|
+ email_address = EmailAddress.create(
|
|
|
+ realname: 'me Helpdesk',
|
|
|
+ email: "me#{rand(999_999_999)}@example.com",
|
|
|
+ updated_by_id: 1,
|
|
|
+ created_by_id: 1,
|
|
|
+ )
|
|
|
+
|
|
|
+ group = Group.create_or_update(
|
|
|
+ name: 'DeliverTest',
|
|
|
+ email_address_id: email_address.id,
|
|
|
+ updated_by_id: 1,
|
|
|
+ created_by_id: 1,
|
|
|
+ )
|
|
|
+
|
|
|
+ channel = Channel.create(
|
|
|
+ area: 'Email::Account',
|
|
|
+ group_id: group.id,
|
|
|
+ options: {
|
|
|
+ inbound: {
|
|
|
+ adapter: 'imap',
|
|
|
+ options: {
|
|
|
+ host: 'mx1.example.com',
|
|
|
+ user: 'example',
|
|
|
+ password: 'some_pw',
|
|
|
+ ssl: true,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ outbound: {
|
|
|
+ adapter: 'sendmail'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ active: true,
|
|
|
+ updated_by_id: 1,
|
|
|
+ created_by_id: 1,
|
|
|
+ )
|
|
|
+
|
|
|
+ email_address.channel_id = channel.id
|
|
|
+ email_address.save
|
|
|
+
|
|
|
+ ticket1 = Ticket.create(
|
|
|
+ title: 'some delivery test',
|
|
|
+ group: group,
|
|
|
+ customer_id: 2,
|
|
|
+ state: Ticket::State.lookup(name: 'new'),
|
|
|
+ priority: Ticket::Priority.lookup(name: '2 normal'),
|
|
|
+ updated_by_id: 1,
|
|
|
+ created_by_id: 1,
|
|
|
+ )
|
|
|
+ assert(ticket1, 'ticket created')
|
|
|
+
|
|
|
+ article1 = Ticket::Article.create(
|
|
|
+ ticket_id: ticket1.id,
|
|
|
+ to: 'some_recipient@example_not_existing_what_ever.com',
|
|
|
+ subject: 'some subject',
|
|
|
+ message_id: 'some@id',
|
|
|
+ body: 'some message delivery test',
|
|
|
+ internal: false,
|
|
|
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
|
|
|
+ type: Ticket::Article::Type.find_by(name: 'email'),
|
|
|
+ updated_by_id: 1,
|
|
|
+ created_by_id: 1,
|
|
|
+ )
|
|
|
+
|
|
|
+ assert_equal(nil, article1.preferences['delivery_retry'])
|
|
|
+ assert_equal(nil, article1.preferences['delivery_status'])
|
|
|
+ assert_equal(nil, article1.preferences['delivery_status_date'])
|
|
|
+ assert_equal(nil, article1.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ result = Observer::Ticket::Article::CommunicateEmail::BackgroundJob.new(article1.id)
|
|
|
+ assert(result.perform)
|
|
|
+
|
|
|
+ article1_lookup = Ticket::Article.find(article1.id)
|
|
|
+ assert_equal(1, article1_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('success', article1_lookup.preferences['delivery_status'])
|
|
|
+ assert(article1_lookup.preferences['delivery_status_date'])
|
|
|
+ assert_equal(nil, article1_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ # send with invalid smtp settings
|
|
|
+ channel.update_attributes(
|
|
|
+ options: {
|
|
|
+ inbound: {
|
|
|
+ adapter: 'imap',
|
|
|
+ options: {
|
|
|
+ host: 'mx1.example.com',
|
|
|
+ user: 'example',
|
|
|
+ password: 'some_pw',
|
|
|
+ ssl: true,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ outbound: {
|
|
|
+ adapter: 'smtp',
|
|
|
+ options: {
|
|
|
+ host: 'mx1.example.com',
|
|
|
+ port: 25,
|
|
|
+ start_tls: true,
|
|
|
+ user: 'not_existing',
|
|
|
+ password: 'not_existing',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ )
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
+ result = Observer::Ticket::Article::CommunicateEmail::BackgroundJob.new(article1.id)
|
|
|
+ assert_not(result.perform)
|
|
|
+ }
|
|
|
+ article1_lookup = Ticket::Article.find(article1.id)
|
|
|
+ assert_equal(2, article1_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article1_lookup.preferences['delivery_status'])
|
|
|
+ assert(article1_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article1_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ # send with correct smtp settings
|
|
|
+ channel.update_attributes(
|
|
|
+ options: {
|
|
|
+ inbound: {
|
|
|
+ adapter: 'imap',
|
|
|
+ options: {
|
|
|
+ host: 'mx1.example.com',
|
|
|
+ user: 'example',
|
|
|
+ password: 'some_pw',
|
|
|
+ ssl: true,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ outbound: {
|
|
|
+ adapter: 'smtp',
|
|
|
+ options: {
|
|
|
+ host: ENV['MAIL_SERVER'],
|
|
|
+ port: 25,
|
|
|
+ start_tls: true,
|
|
|
+ user: server_login,
|
|
|
+ password: server_password,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ )
|
|
|
+
|
|
|
+ result = Observer::Ticket::Article::CommunicateEmail::BackgroundJob.new(article1.id)
|
|
|
+ assert(result.perform)
|
|
|
+ article1_lookup = Ticket::Article.find(article1.id)
|
|
|
+ assert_equal(3, article1_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('success', article1_lookup.preferences['delivery_status'])
|
|
|
+ assert(article1_lookup.preferences['delivery_status_date'])
|
|
|
+ assert_nil(article1_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ # check retry jobs
|
|
|
+ # remove background jobs
|
|
|
+ Delayed::Job.destroy_all
|
|
|
+
|
|
|
+ # send with invalid smtp settings
|
|
|
+ channel.update_attributes(
|
|
|
+ options: {
|
|
|
+ inbound: {
|
|
|
+ adapter: 'imap',
|
|
|
+ options: {
|
|
|
+ host: 'mx1.example.com',
|
|
|
+ user: 'example',
|
|
|
+ password: 'some_pw',
|
|
|
+ ssl: true,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ outbound: {
|
|
|
+ adapter: 'smtp',
|
|
|
+ options: {
|
|
|
+ host: 'mx1.example.com',
|
|
|
+ port: 25,
|
|
|
+ start_tls: true,
|
|
|
+ user: 'not_existing',
|
|
|
+ password: 'not_existing',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ )
|
|
|
+
|
|
|
+ # remove background jobs
|
|
|
+ Delayed::Job.destroy_all
|
|
|
+
|
|
|
+ article2 = Ticket::Article.create(
|
|
|
+ ticket_id: ticket1.id,
|
|
|
+ to: 'some_recipient@example_not_existing_what_ever.com',
|
|
|
+ subject: 'some subject2',
|
|
|
+ message_id: 'some@id',
|
|
|
+ body: 'some message delivery test2',
|
|
|
+ internal: false,
|
|
|
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
|
|
|
+ type: Ticket::Article::Type.find_by(name: 'email'),
|
|
|
+ updated_by_id: 1,
|
|
|
+ created_by_id: 1,
|
|
|
+ )
|
|
|
+
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
+ Scheduler.worker(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ article2_lookup = Ticket::Article.find(article2.id)
|
|
|
+ assert_equal(2, ticket1.articles.count)
|
|
|
+ assert_equal(1, article2_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article2_lookup.preferences['delivery_status'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ Scheduler.worker(true)
|
|
|
+
|
|
|
+ article2_lookup = Ticket::Article.find(article2.id)
|
|
|
+ assert_equal(2, ticket1.articles.count)
|
|
|
+ assert_equal(1, article2_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article2_lookup.preferences['delivery_status'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ sleep 6
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
+ Scheduler.worker(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ article2_lookup = Ticket::Article.find(article2.id)
|
|
|
+ assert_equal(2, ticket1.articles.count)
|
|
|
+ assert_equal(2, article2_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article2_lookup.preferences['delivery_status'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ Scheduler.worker(true)
|
|
|
+ article2_lookup = Ticket::Article.find(article2.id)
|
|
|
+ assert_equal(2, ticket1.articles.count)
|
|
|
+ assert_equal(2, article2_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article2_lookup.preferences['delivery_status'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ sleep 11
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
+ Scheduler.worker(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ article2_lookup = Ticket::Article.find(article2.id)
|
|
|
+ assert_equal(2, ticket1.articles.count)
|
|
|
+ assert_equal(3, article2_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article2_lookup.preferences['delivery_status'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ sleep 16
|
|
|
+ Scheduler.worker(true)
|
|
|
+
|
|
|
+ article2_lookup = Ticket::Article.find(article2.id)
|
|
|
+ assert_equal(3, ticket1.articles.count)
|
|
|
+ assert_equal('System', ticket1.articles.last.sender.name)
|
|
|
+ assert_equal(4, article2_lookup.preferences['delivery_retry'])
|
|
|
+ assert_equal('fail', article2_lookup.preferences['delivery_status'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_date'])
|
|
|
+ assert(article2_lookup.preferences['delivery_status_message'])
|
|
|
+
|
|
|
+ end
|
|
|
+
|
|
|
+end
|