Refactoring: Migrate email_process_customer_selection_based_on_sender_recipient_test to RSpec
This commit is contained in:
parent
f702b34891
commit
6393e398c1
3 changed files with 131 additions and 82 deletions
|
@ -85,7 +85,65 @@ RSpec.describe Channel::EmailParser, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'associating emails to tickets' do
|
describe 'creating new tickets' do
|
||||||
|
context 'when subject contains no ticket reference' do
|
||||||
|
let(:raw_mail) { <<~RAW.chomp }
|
||||||
|
From: foo@bar.com
|
||||||
|
To: baz@qux.net
|
||||||
|
Subject: Foo
|
||||||
|
|
||||||
|
Lorem ipsum dolor
|
||||||
|
RAW
|
||||||
|
|
||||||
|
it 'creates a ticket and article' do
|
||||||
|
expect { Channel::EmailParser.new.process({}, raw_mail) }
|
||||||
|
.to change { Ticket.count }.by(1)
|
||||||
|
.and change { Ticket::Article.count }.by_at_least(1) # triggers may cause additional articles to be created
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets #title to email subject' do
|
||||||
|
Channel::EmailParser.new.process({}, raw_mail)
|
||||||
|
|
||||||
|
expect(Ticket.last.title).to eq('Foo')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets #state to "new"' do
|
||||||
|
Channel::EmailParser.new.process({}, raw_mail)
|
||||||
|
|
||||||
|
expect(Ticket.last.state.name).to eq('new')
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when from address matches an existing agent' do
|
||||||
|
let!(:agent) { create(:agent_user, email: 'foo@bar.com') }
|
||||||
|
|
||||||
|
it 'sets article.sender to "Agent"' do
|
||||||
|
Channel::EmailParser.new.process({}, raw_mail)
|
||||||
|
|
||||||
|
expect(Ticket::Article.last.sender.name).to eq('Agent')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when from address matches an existing customer' do
|
||||||
|
let!(:customer) { create(:customer_user, email: 'foo@bar.com') }
|
||||||
|
|
||||||
|
it 'sets article.sender to "Customer"' do
|
||||||
|
Channel::EmailParser.new.process({}, raw_mail)
|
||||||
|
|
||||||
|
expect(Ticket.last.articles.first.sender.name).to eq('Customer')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when from address is unrecognized' do
|
||||||
|
it 'sets article.sender to "Customer"' do
|
||||||
|
Channel::EmailParser.new.process({}, raw_mail)
|
||||||
|
|
||||||
|
expect(Ticket.last.articles.first.sender.name).to eq('Customer')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'associating emails to existing tickets' do
|
||||||
let(:mail_file) { Rails.root.join('test', 'data', 'mail', 'mail001.box') }
|
let(:mail_file) { Rails.root.join('test', 'data', 'mail', 'mail001.box') }
|
||||||
let(:ticket_ref) { Setting.get('ticket_hook') + Setting.get('ticket_hook_divider') + ticket.number }
|
let(:ticket_ref) { Setting.get('ticket_hook') + Setting.get('ticket_hook_divider') + ticket.number }
|
||||||
let(:ticket) { create(:ticket) }
|
let(:ticket) { create(:ticket) }
|
||||||
|
@ -183,7 +241,40 @@ RSpec.describe Channel::EmailParser, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'sender/recipient address formatting' do
|
describe 'assigning ticket.customer' do
|
||||||
|
let(:agent) { create(:agent_user) }
|
||||||
|
let(:customer) { create(:customer_user) }
|
||||||
|
|
||||||
|
let(:raw_mail) { <<~RAW.chomp }
|
||||||
|
From: #{agent.email}
|
||||||
|
To: #{customer.email}
|
||||||
|
Subject: Foo
|
||||||
|
|
||||||
|
Lorem ipsum dolor
|
||||||
|
RAW
|
||||||
|
|
||||||
|
context 'when "postmaster_sender_is_agent_search_for_customer" setting is true (default)' do
|
||||||
|
it 'sets ticket.customer to user with To: email' do
|
||||||
|
expect { Channel::EmailParser.new.process({}, raw_mail) }
|
||||||
|
.to change { Ticket.count }.by(1)
|
||||||
|
|
||||||
|
expect(Ticket.last.customer).to eq(customer)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when "postmaster_sender_is_agent_search_for_customer" setting is false' do
|
||||||
|
before { Setting.set('postmaster_sender_is_agent_search_for_customer', false) }
|
||||||
|
|
||||||
|
it 'sets ticket.customer to user with To: email' do
|
||||||
|
expect { Channel::EmailParser.new.process({}, raw_mail) }
|
||||||
|
.to change { Ticket.count }.by(1)
|
||||||
|
|
||||||
|
expect(Ticket.last.customer).to eq(agent)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'formatting to/from addresses' do
|
||||||
# see https://github.com/zammad/zammad/issues/2198
|
# see https://github.com/zammad/zammad/issues/2198
|
||||||
context 'when sender address contains spaces (#2198)' do
|
context 'when sender address contains spaces (#2198)' do
|
||||||
let(:mail_file) { Rails.root.join('test', 'data', 'mail', 'mail071.box') }
|
let(:mail_file) { Rails.root.join('test', 'data', 'mail', 'mail071.box') }
|
||||||
|
|
|
@ -8,7 +8,9 @@ RSpec.describe Ticket::Article, type: :model do
|
||||||
it_behaves_like 'CanBeImported'
|
it_behaves_like 'CanBeImported'
|
||||||
it_behaves_like 'HasObjectManagerAttributesValidation'
|
it_behaves_like 'HasObjectManagerAttributesValidation'
|
||||||
|
|
||||||
describe 'Callbacks, Observers, & Async Transactions' do
|
subject(:article) { create(:ticket_article) }
|
||||||
|
|
||||||
|
describe 'Callbacks, Observers, & Async Transactions -' do
|
||||||
describe 'NULL byte handling (via ChecksAttributeValuesAndLength concern):' do
|
describe 'NULL byte handling (via ChecksAttributeValuesAndLength concern):' do
|
||||||
it 'removes them from #subject on creation, if necessary (postgres doesn’t like them)' do
|
it 'removes them from #subject on creation, if necessary (postgres doesn’t like them)' do
|
||||||
expect(create(:ticket_article, subject: "com test 1\u0000"))
|
expect(create(:ticket_article, subject: "com test 1\u0000"))
|
||||||
|
@ -21,6 +23,40 @@ RSpec.describe Ticket::Article, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'Setting of ticket.create_article_{sender,type}' do
|
||||||
|
let!(:ticket) { create(:ticket) }
|
||||||
|
|
||||||
|
context 'on creation' do
|
||||||
|
context 'of first article on a ticket' do
|
||||||
|
subject(:article) do
|
||||||
|
create(:ticket_article, ticket: ticket, sender_name: 'Agent', type_name: 'email')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets ticket sender/type attributes based on article sender/type' do
|
||||||
|
expect { article }
|
||||||
|
.to change { ticket.reload.create_article_sender&.name }.to('Agent')
|
||||||
|
.and change { ticket.reload.create_article_type&.name }.to('email')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'of subsequent articles on a ticket' do
|
||||||
|
let!(:first_article) do
|
||||||
|
create(:ticket_article, ticket: ticket, sender_name: 'Agent', type_name: 'email')
|
||||||
|
end
|
||||||
|
|
||||||
|
subject(:article) do
|
||||||
|
create(:ticket_article, ticket: ticket, sender_name: 'Customer', type_name: 'twitter status')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not modify ticket’s sender/type attributes' do
|
||||||
|
expect { article }
|
||||||
|
.to not_change { ticket.reload.create_article_sender.name }
|
||||||
|
.and not_change { ticket.reload.create_article_type.name }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'Cti::Log syncing:' do
|
describe 'Cti::Log syncing:' do
|
||||||
context 'with existing Log records' do
|
context 'with existing Log records' do
|
||||||
context 'for an incoming call from an unknown number' do
|
context 'for an incoming call from an unknown number' do
|
||||||
|
@ -44,7 +80,7 @@ RSpec.describe Ticket::Article, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Auto-setting of outgoing Twitter article attributes (via bj jobs):' do
|
describe 'Auto-setting of outgoing Twitter article attributes (via bg jobs):' do
|
||||||
subject!(:twitter_article) { create(:twitter_article, sender_name: 'Agent') }
|
subject!(:twitter_article) { create(:twitter_article, sender_name: 'Agent') }
|
||||||
let(:channel) { Channel.find(twitter_article.ticket.preferences[:channel_id]) }
|
let(:channel) { Channel.find(twitter_article.ticket.preferences[:channel_id]) }
|
||||||
|
|
||||||
|
|
|
@ -1,78 +0,0 @@
|
||||||
require 'test_helper'
|
|
||||||
|
|
||||||
class EmailProcessCustomerSelectionBasedOnSenderRecipient < ActiveSupport::TestCase
|
|
||||||
|
|
||||||
setup do
|
|
||||||
groups = Group.all
|
|
||||||
roles = Role.where(name: 'Agent')
|
|
||||||
@agent1 = User.create_or_update(
|
|
||||||
login: 'user-customer-selection-agent1@example.com',
|
|
||||||
firstname: 'UserOutOfOffice',
|
|
||||||
lastname: 'Agent1',
|
|
||||||
email: 'user-customer-selection-agent1@example.com',
|
|
||||||
password: 'agentpw',
|
|
||||||
active: true,
|
|
||||||
roles: roles,
|
|
||||||
groups: groups,
|
|
||||||
updated_by_id: 1,
|
|
||||||
created_by_id: 1,
|
|
||||||
)
|
|
||||||
roles = Role.where(name: 'Customer')
|
|
||||||
@customer1 = User.create_or_update(
|
|
||||||
login: 'user-customer-selection-customer1@example.com',
|
|
||||||
firstname: 'UserOutOfOffice',
|
|
||||||
lastname: 'customer1',
|
|
||||||
email: 'user-customer-selection-customer1@example.com',
|
|
||||||
password: 'customerpw',
|
|
||||||
active: true,
|
|
||||||
roles: roles,
|
|
||||||
updated_by_id: 1,
|
|
||||||
created_by_id: 1,
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
test 'customer need to be customer' do
|
|
||||||
|
|
||||||
email_raw_string = "From: #{@agent1.email}
|
|
||||||
To: #{@customer1.email}
|
|
||||||
Subject: test
|
|
||||||
|
|
||||||
Some Text"
|
|
||||||
|
|
||||||
ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
|
|
||||||
ticket = Ticket.find(ticket_p.id)
|
|
||||||
article = Ticket::Article.find(article_p.id)
|
|
||||||
assert_equal('test', ticket.title)
|
|
||||||
assert_equal('new', ticket.state.name)
|
|
||||||
assert_equal('Agent', ticket.create_article_sender.name)
|
|
||||||
assert_equal('Agent', article.sender.name)
|
|
||||||
assert_equal(@customer1.email, ticket.customer.email)
|
|
||||||
assert_equal(@customer1.firstname, ticket.customer.firstname)
|
|
||||||
assert_equal(@customer1.lastname, ticket.customer.lastname)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
test 'agent need to be customer' do
|
|
||||||
|
|
||||||
Setting.set('postmaster_sender_is_agent_search_for_customer', false)
|
|
||||||
|
|
||||||
email_raw_string = "From: #{@agent1.email}
|
|
||||||
To: #{@customer1.email}
|
|
||||||
Subject: test
|
|
||||||
|
|
||||||
Some Text"
|
|
||||||
|
|
||||||
ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
|
|
||||||
ticket = Ticket.find(ticket_p.id)
|
|
||||||
article = Ticket::Article.find(article_p.id)
|
|
||||||
assert_equal('test', ticket.title)
|
|
||||||
assert_equal('new', ticket.state.name)
|
|
||||||
assert_equal('Agent', ticket.create_article_sender.name)
|
|
||||||
assert_equal('Agent', article.sender.name)
|
|
||||||
assert_equal(@agent1.email, ticket.customer.email)
|
|
||||||
assert_equal(@agent1.firstname, ticket.customer.firstname)
|
|
||||||
assert_equal(@agent1.lastname, ticket.customer.lastname)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
Loading…
Reference in a new issue