271 lines
8.5 KiB
Ruby
271 lines
8.5 KiB
Ruby
|
# 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
|