Merge pull request #840 from sgmap/fix_email_to_wrong_recipient
[Fix #839] Send notification email in async to avoid sending same ema…
This commit is contained in:
commit
38c226a659
4 changed files with 46 additions and 29 deletions
|
@ -1,7 +1,12 @@
|
||||||
class NotificationMailer < ApplicationMailer
|
class NotificationMailer < ApplicationMailer
|
||||||
default to: Proc.new { @user.email }
|
default to: Proc.new { @user.email }
|
||||||
|
|
||||||
after_action :create_commentaire_for_notification, only: :send_notification
|
after_action :create_commentaire_for_notification, only: [:send_notification, :send_dossier_received]
|
||||||
|
|
||||||
|
def send_dossier_received(dossier_id)
|
||||||
|
dossier = Dossier.find(dossier_id)
|
||||||
|
send_notification(dossier, dossier.procedure.received_mail_template)
|
||||||
|
end
|
||||||
|
|
||||||
def send_notification(dossier, mail_template, attestation = nil)
|
def send_notification(dossier, mail_template, attestation = nil)
|
||||||
vars_mailer(dossier)
|
vars_mailer(dossier)
|
||||||
|
|
|
@ -75,7 +75,7 @@ class Dossier < ActiveRecord::Base
|
||||||
|
|
||||||
after_save :build_default_champs, if: Proc.new { procedure_id_changed? }
|
after_save :build_default_champs, if: Proc.new { procedure_id_changed? }
|
||||||
after_save :build_default_individual, if: Proc.new { procedure.for_individual? }
|
after_save :build_default_individual, if: Proc.new { procedure.for_individual? }
|
||||||
after_save :send_notification_email
|
after_save :send_dossier_received
|
||||||
|
|
||||||
validates :user, presence: true
|
validates :user, presence: true
|
||||||
|
|
||||||
|
@ -375,9 +375,9 @@ class Dossier < ActiveRecord::Base
|
||||||
value.nil? || value.kind_of?(Time) ? value : value.to_s
|
value.nil? || value.kind_of?(Time) ? value : value.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_notification_email
|
def send_dossier_received
|
||||||
if state_changed? && EN_INSTRUCTION.include?(state)
|
if state_changed? && EN_INSTRUCTION.include?(state)
|
||||||
NotificationMailer.send_notification(self, procedure.received_mail_template).deliver_now!
|
NotificationMailer.send_dossier_received(id).deliver_later
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,17 +1,30 @@
|
||||||
require "spec_helper"
|
require "spec_helper"
|
||||||
|
|
||||||
RSpec.describe NotificationMailer, type: :mailer do
|
RSpec.describe NotificationMailer, type: :mailer do
|
||||||
|
shared_examples_for "create a commentaire not notified" do
|
||||||
|
it do
|
||||||
|
expect { subject.deliver_now }.to change { Commentaire.count }.by(1)
|
||||||
|
expect { subject.deliver_now }.to_not change { Notification.count }
|
||||||
|
|
||||||
|
subject.deliver_now
|
||||||
|
commentaire = Commentaire.last
|
||||||
|
expect(commentaire.body).to include(email_template.object_for_dossier(dossier), email_template.body_for_dossier(dossier))
|
||||||
|
expect(commentaire.dossier).to eq(dossier)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:user) { create(:user) }
|
||||||
|
let(:dossier) { create(:dossier, user: user) }
|
||||||
|
|
||||||
describe '.send_notification' do
|
describe '.send_notification' do
|
||||||
let(:user) { create(:user) }
|
let(:email_template) { instance_double('email_template', object_for_dossier: 'object', body_for_dossier: 'body') }
|
||||||
let(:dossier) { create(:dossier, user: user) }
|
|
||||||
let(:email) { instance_double('email', object_for_dossier: 'object', body_for_dossier: 'body') }
|
|
||||||
let(:attestation) { nil }
|
let(:attestation) { nil }
|
||||||
let(:notifications_count_before) { Notification.count }
|
let(:notifications_count_before) { Notification.count }
|
||||||
|
|
||||||
subject { described_class.send_notification(dossier, email, attestation) }
|
subject { described_class.send_notification(dossier, email_template, attestation) }
|
||||||
|
|
||||||
it { expect(subject.subject).to eq(email.object_for_dossier) }
|
it { expect(subject.subject).to eq(email_template.object_for_dossier) }
|
||||||
it { expect(subject.body).to eq(email.body_for_dossier) }
|
it { expect(subject.body).to eq(email_template.body_for_dossier) }
|
||||||
it { expect(subject.attachments['attestation.pdf']).to eq(nil) }
|
it { expect(subject.attachments['attestation.pdf']).to eq(nil) }
|
||||||
|
|
||||||
context 'when an attestation is provided' do
|
context 'when an attestation is provided' do
|
||||||
|
@ -25,23 +38,26 @@ RSpec.describe NotificationMailer, type: :mailer do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "creates a commentaire, which is not notified" do
|
it_behaves_like "create a commentaire not notified"
|
||||||
described_class.send_notification(dossier, email).deliver_now
|
end
|
||||||
|
|
||||||
commentaire = Commentaire.last
|
describe '.send_dossier_received' do
|
||||||
notifications_count_after = Notification.count
|
subject { described_class.send_dossier_received(dossier.id) }
|
||||||
|
let(:email_template) { create(:received_mail) }
|
||||||
|
|
||||||
expect(commentaire.dossier).to eq(dossier)
|
before do
|
||||||
expect(commentaire.email).to eq("contact@tps.apientreprise.fr")
|
dossier.procedure.received_mail = email_template
|
||||||
expect(commentaire.body).to eq("[object]<br><br>body")
|
|
||||||
expect(notifications_count_before).to eq(notifications_count_after)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it do
|
||||||
|
expect(subject.subject).to eq(email_template.object)
|
||||||
|
expect(subject.body).to eq(email_template.body)
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "create a commentaire not notified"
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".new_answer" do
|
describe ".new_answer" do
|
||||||
let(:user) { create(:user) }
|
|
||||||
let(:dossier) { create(:dossier, user: user) }
|
|
||||||
|
|
||||||
subject(:subject) { described_class.new_answer(dossier) }
|
subject(:subject) { described_class.new_answer(dossier) }
|
||||||
|
|
||||||
it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') }
|
it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') }
|
||||||
|
|
|
@ -766,26 +766,22 @@ describe Dossier do
|
||||||
it { is_expected.to include(dossier4)}
|
it { is_expected.to include(dossier4)}
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#send_notification_email" do
|
describe "#send_dossier_received" do
|
||||||
let(:procedure) { create(:procedure) }
|
let(:procedure) { create(:procedure) }
|
||||||
let(:dossier) { create(:dossier, procedure: procedure, state: :initiated) }
|
let(:dossier) { create(:dossier, procedure: procedure, state: :initiated) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
ActionMailer::Base.deliveries.clear
|
allow(NotificationMailer).to receive(:send_dossier_received).and_return(double(deliver_later: nil))
|
||||||
end
|
end
|
||||||
|
|
||||||
it "sends an email when the dossier becomes received" do
|
it "sends an email when the dossier becomes received" do
|
||||||
dossier.received!
|
dossier.received!
|
||||||
|
expect(NotificationMailer).to have_received(:send_dossier_received).with(dossier.id)
|
||||||
mail = ActionMailer::Base.deliveries.last
|
|
||||||
|
|
||||||
expect(mail.subject).to eq("Votre dossier TPS nº #{dossier.id} va être instruit")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not an email when the dossier becomes closed" do
|
it "does not an email when the dossier becomes closed" do
|
||||||
dossier.closed!
|
dossier.closed!
|
||||||
|
expect(NotificationMailer).to_not have_received(:send_dossier_received)
|
||||||
expect(ActionMailer::Base.deliveries.size).to eq(0)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue