expiration: fix the mailer arguments

The mailers expect serializable arguments, but were given
ActiveRecord::Relation objects instead. This made the mailers throw an
exception.

But how was that possible ? This code is tested, and the tests were
green.

Well, the specs spy on the mailer implementation, in order to check that
the mailers methods were properly called. Fair enough.

But if the specs mock the mailer code (instead of calling the original
implementation), we may not notice that the original implementation
rejects our method parameters.

Here this is the case: once we actually call the original implementation
the tests start to fail, because some arguments are not converted from
an ActiveRecord::Relation to a serializable array.

This is fixed by ensuring that the mailer code is executed (and doesn't
throw an exception).
This commit is contained in:
Pierre de La Morinerie 2020-05-18 16:24:08 +02:00
parent 1b07631336
commit 9f1407b6d7
2 changed files with 10 additions and 10 deletions

View file

@ -117,14 +117,14 @@ class ExpiredDossiersDeletionService
.group_by(&:user) .group_by(&:user)
.each do |(user, dossiers)| .each do |(user, dossiers)|
DossierMailer.notify_automatic_deletion_to_user( DossierMailer.notify_automatic_deletion_to_user(
DeletedDossier.where(dossier_id: dossiers.map(&:id)), DeletedDossier.where(dossier_id: dossiers.map(&:id)).to_a,
user.email user.email
).deliver_later ).deliver_later
end end
self.group_by_fonctionnaire_email(dossiers_to_remove).each do |(email, dossiers)| self.group_by_fonctionnaire_email(dossiers_to_remove).each do |(email, dossiers)|
DossierMailer.notify_automatic_deletion_to_administration( DossierMailer.notify_automatic_deletion_to_administration(
DeletedDossier.where(dossier_id: dossiers.map(&:id)), DeletedDossier.where(dossier_id: dossiers.map(&:id)).to_a,
email email
).deliver_later ).deliver_later

View file

@ -19,8 +19,8 @@ describe ExpiredDossiersDeletionService do
let!(:valid_brouillon) { create(:dossier, procedure: procedure, created_at: date_not_expired) } let!(:valid_brouillon) { create(:dossier, procedure: procedure, created_at: date_not_expired) }
before do before do
allow(DossierMailer).to receive(:notify_brouillon_near_deletion).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_brouillon_near_deletion).and_call_original
allow(DossierMailer).to receive(:notify_brouillon_deletion).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_brouillon_deletion).and_call_original
ExpiredDossiersDeletionService.process_expired_dossiers_brouillon ExpiredDossiersDeletionService.process_expired_dossiers_brouillon
end end
@ -207,8 +207,8 @@ describe ExpiredDossiersDeletionService do
after { Timecop.return } after { Timecop.return }
before do before do
allow(DossierMailer).to receive(:notify_automatic_deletion_to_user).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_automatic_deletion_to_user).and_call_original
allow(DossierMailer).to receive(:notify_automatic_deletion_to_administration).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_automatic_deletion_to_administration).and_call_original
end end
context 'with a single dossier' do context 'with a single dossier' do
@ -275,8 +275,8 @@ describe ExpiredDossiersDeletionService do
after { Timecop.return } after { Timecop.return }
before do before do
allow(DossierMailer).to receive(:notify_near_deletion_to_user).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_near_deletion_to_user).and_call_original
allow(DossierMailer).to receive(:notify_near_deletion_to_administration).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_near_deletion_to_administration).and_call_original
end end
context 'with a single dossier' do context 'with a single dossier' do
@ -344,8 +344,8 @@ describe ExpiredDossiersDeletionService do
after { Timecop.return } after { Timecop.return }
before do before do
allow(DossierMailer).to receive(:notify_automatic_deletion_to_user).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_automatic_deletion_to_user).and_call_original
allow(DossierMailer).to receive(:notify_automatic_deletion_to_administration).and_return(double(deliver_later: nil)) allow(DossierMailer).to receive(:notify_automatic_deletion_to_administration).and_call_original
end end
context 'with a single dossier' do context 'with a single dossier' do