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:
LeSim 2017-10-14 09:04:01 +02:00 committed by GitHub
commit 38c226a659
4 changed files with 46 additions and 29 deletions

View file

@ -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)

View file

@ -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

View file

@ -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.') }

View file

@ -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