f9b0427751
* feat: added support mailbox to handle email channel (#140) Added a new mailbox called 'SupportMailbox' to handle all the incoming emails other than reply emails. An email channel will have a support email and forward email associated with it. So we filter for the right email inbox based on the support email of that inbox and route this to this mailbox. This mailbox finds the account, inbox, contact (create a new one if it does not exist) and creates a conversation and adds the email content as the first message in the conversation. Other minor things handled in this commit: * renamed the procs for routing emails in application mailbox * renamed ConversationMailbox to ReplyMailbox * Added a fallback content in MailPresenter * Added a record saving (bang) versions of enabling and disabling features in Featurable module * added new factory for the email channel refs: #140
64 lines
2.5 KiB
Ruby
64 lines
2.5 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe SupportMailbox, type: :mailbox do
|
|
include ActionMailbox::TestHelper
|
|
|
|
describe 'add mail as a new ticket in the email inbox' do
|
|
let(:account) { create(:account) }
|
|
let!(:channel_email) { create(:channel_email, account: account) }
|
|
let(:support_mail) { create_inbound_email_from_fixture('support.eml') }
|
|
let(:described_subject) { described_class.receive support_mail }
|
|
let(:serialized_attributes) { %w[text_content html_content number_of_attachments subject date to from in_reply_to cc bcc message_id] }
|
|
let(:conversation) { Conversation.where(inbox_id: channel_email.inbox).last }
|
|
|
|
before do
|
|
# this email is hardcoded in the support.eml, that's why we are updating this
|
|
channel_email.email = 'care@example.com'
|
|
channel_email.save
|
|
end
|
|
|
|
describe 'covers basic ticket creation' do
|
|
before do
|
|
described_subject
|
|
end
|
|
|
|
it 'create the conversation in the inbox of the email channel' do
|
|
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
|
expect(conversation.additional_attributes['source']).to eq('email')
|
|
expect(conversation.contact.email).to eq(support_mail.mail.from.first)
|
|
end
|
|
|
|
it 'create a new contact as the sender of the email' do
|
|
expect(conversation.messages.last.sender.email).to eq(support_mail.mail.from.first)
|
|
end
|
|
|
|
it 'add the mail content as new message on the conversation' do
|
|
expect(conversation.messages.last.content).to eq("Let's talk about these images:")
|
|
end
|
|
|
|
it 'add the attachments' do
|
|
expect(conversation.messages.last.attachments.count).to eq(2)
|
|
end
|
|
|
|
it 'have proper content_attributes with details of email' do
|
|
expect(conversation.messages.last.content_attributes[:email].keys).to eq(serialized_attributes)
|
|
end
|
|
|
|
it 'set proper content_type' do
|
|
expect(conversation.messages.last.content_type).to eq('incoming_email')
|
|
end
|
|
end
|
|
|
|
describe 'handle inbox contacts' do
|
|
let(:contact) { create(:contact, account: account, email: support_mail.mail.from.first) }
|
|
let(:contact_inbox) { create(:contact_inbox, inbox: channel_email.inbox, contact: contact) }
|
|
|
|
it 'does not create new contact if that contact exists in the inbox' do
|
|
# making sure we have a contact already present
|
|
expect(contact_inbox.contact.email).to eq(support_mail.mail.from.first)
|
|
described_subject
|
|
expect(conversation.messages.last.sender.id).to eq(contact.id)
|
|
end
|
|
end
|
|
end
|
|
end
|