mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-30 18:47:51 +00:00
The system did not detect the delivery errors earlier, resulting in some false positives. The user was not informed when an email failed to be delivered. While we do handle failure status in other channels, we were not able to capture the actual delivery status for the email channel. This pull request makes the following changes: - Updated the class EmailReplyWorker to use the deliver_now method instead of deliver_later. This change is made to raise any errors that may occur with the SMTP connection. The errors are then captured and sent to Sentry, and the email is marked as failed. Previously, we did not consider the case of retries in the email channel, so this feature is currently not functioning. So, I have disabled the retry option. We will address this in a follow-up ticket. - Downgraded the net-smtp gem to version 0.3.4. This change is made to avoid an argument error when using XOAUTH2. Fixes: https://linear.app/chatwoot/issue/CW-3032/argumenterror-wrong-authentication-type-xoauth2-argumenterror
59 lines
2.5 KiB
Ruby
59 lines
2.5 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe EmailReplyWorker, type: :worker do
|
|
let(:account) { create(:account) }
|
|
let(:channel) { create(:channel_email, account: account) }
|
|
let(:message) { create(:message, message_type: :outgoing, inbox: channel.inbox, account: account) }
|
|
let(:private_message) { create(:message, private: true, message_type: :outgoing, inbox: channel.inbox, account: account) }
|
|
let(:incoming_message) { create(:message, message_type: :incoming, inbox: channel.inbox, account: account) }
|
|
let(:template_message) { create(:message, message_type: :template, content_type: :input_csat, inbox: channel.inbox, account: account) }
|
|
let(:mailer) { double }
|
|
let(:mailer_action) { double }
|
|
|
|
describe '#perform' do
|
|
context 'when emails are successfully sent' do
|
|
before do
|
|
allow(ConversationReplyMailer).to receive(:with).and_return(mailer)
|
|
allow(mailer).to receive(:email_reply).and_return(mailer_action)
|
|
allow(mailer_action).to receive(:deliver_now).and_return(true)
|
|
end
|
|
|
|
it 'calls mailer action with message' do
|
|
described_class.new.perform(message.id)
|
|
expect(mailer).to have_received(:email_reply).with(message)
|
|
expect(mailer_action).to have_received(:deliver_now)
|
|
end
|
|
|
|
it 'does not call mailer action with a private message' do
|
|
described_class.new.perform(private_message.id)
|
|
expect(mailer).not_to have_received(:email_reply)
|
|
expect(mailer_action).not_to have_received(:deliver_now)
|
|
end
|
|
|
|
it 'calls mailer action with a CSAT message' do
|
|
described_class.new.perform(template_message.id)
|
|
expect(mailer).to have_received(:email_reply).with(template_message)
|
|
expect(mailer_action).to have_received(:deliver_now)
|
|
end
|
|
|
|
it 'does not call mailer action with an incoming message' do
|
|
described_class.new.perform(incoming_message.id)
|
|
expect(mailer).not_to have_received(:email_reply)
|
|
expect(mailer_action).not_to have_received(:deliver_now)
|
|
end
|
|
end
|
|
|
|
context 'when emails are not sent' do
|
|
before do
|
|
allow(ConversationReplyMailer).to receive(:with).and_return(mailer)
|
|
allow(mailer).to receive(:email_reply).and_return(mailer_action)
|
|
allow(mailer_action).to receive(:deliver_now).and_raise(ArgumentError)
|
|
end
|
|
|
|
it 'mark message as failed' do
|
|
expect { described_class.new.perform(message.id) }.to change { message.reload.status }.from('sent').to('failed')
|
|
end
|
|
end
|
|
end
|
|
end
|