1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- require 'rails_helper'
- RSpec.describe Ticket::Article::EnqueueCommunicateEmailJob, performs_jobs: true do
- before { allow(Delayed::Job).to receive(:enqueue).and_call_original }
- let(:article) { create(:ticket_article, **(try(:factory_options) || {})) }
- let(:channel) do
- create(:email_channel, outbound: {
- 'adapter' => 'smtp',
- 'options' => {
- 'host' => '10.1.1.1',
- 'port' => 25,
- 'ssl' => true,
- 'ssl_verify' => true,
- 'user' => 'other@example.com',
- 'password' => 'somepass',
- 'authentication' => nil
- }
- })
- end
- shared_examples 'for no-op' do
- it 'is a no-op' do
- expect { article }.not_to have_enqueued_job(TicketArticleCommunicateEmailJob)
- end
- end
- shared_examples 'for success' do
- it 'enqueues the Email background job' do
- expect { article }.to have_enqueued_job(TicketArticleCommunicateEmailJob)
- end
- end
- shared_examples 'for failure' do
- it 'executes the enqueued Email background job that will time out', :aggregate_failures do
- stub_const('Channel::Driver::Smtp::DEFAULT_OPEN_TIMEOUT', 0.01)
- stub_const('Channel::Driver::Smtp::DEFAULT_READ_TIMEOUT', 0.01)
- expect { article.ticket.group.email_address.update(channel:) }.to have_enqueued_job(TicketArticleCommunicateEmailJob)
- expect(TicketArticleCommunicateEmailJob).to have_been_enqueued
- expect { perform_enqueued_jobs commit_transaction: true }.not_to raise_error
- expect(article.reload.preferences).to include(
- delivery_status: 'fail',
- delivery_status_message: "Can't use Channel::Driver::Smtp: #<Net::OpenTimeout: execution expired>",
- )
- expect(channel.reload).to have_attributes(
- status_out: 'error',
- last_log_out: '#<Net::OpenTimeout: execution expired>',
- )
- end
- end
- context 'when in Import Mode' do
- before { Setting.set('import_mode', true) }
- include_examples 'for no-op'
- end
- context 'when article is created during Channel::EmailParser#process', application_handle: 'scheduler.postmaster' do
- include_examples 'for no-op'
- end
- context 'when article is from a customer' do
- let(:factory_options) { { sender_name: 'Customer' } }
- include_examples 'for no-op'
- end
- context 'when article is an email' do
- let(:factory_options) { { sender_name: 'Agent', type_name: 'email' } }
- include_examples 'for success'
- end
- context 'when article is an email but cannot be sent' do
- let(:factory_options) { { sender_name: 'Agent', type_name: 'email' } }
- include_examples 'for failure'
- end
- end
|