Closed vdegove closed 1 month ago
on ne peut pas terminer par un refute dans le corps de la fonction, ça ne marche pas. Si il y en a, il faut les mettre en premier. Par contre toutes les assertions sont bien testées les unes après les autres (j’ai vérifié)
il y a une explication à ça, par curiosité ?
Je pense que l'on fera prochainement des changements sur les notifiers pour avoir une chaine subscription > contact > email template > notifications pour bien tracer le fait qu'on a envoyé quelque chose à un contact par le biais d'un abonnement.
Ah oui, tiens, à savoir : il y a une abstraction, Swoosh.Email.Recipient
qui permettrait de passer directement un DB.Contact
au notifier et à la création d’email : https://hexdocs.pm/swoosh/Swoosh.html#module-recipient
Je ferai une issue followup en mettant ça dedans.
on ne peut pas terminer par un refute dans le corps de la fonction, ça ne marche pas. Si il y en a, il faut les mettre en premier. Par contre toutes les assertions sont bien testées les unes après les autres (j’ai vérifié)
il y a une explication à ça, par curiosité ?
Parce que assert_email_sent(fun)
va faire un assert sur la fonction, donc vérifier que l’output de la dernière ligne est true. Donc chaque assertion de la fonction est bien jouée, mais en plus, il y a un assert englobant. Et bizarrement, de ce que je crois comprendre, l’output d’un refute
qui marche n’est pas true
mais false
.
Voir https://github.com/swoosh/swoosh/blob/v1.16.7/lib/swoosh/test_assertions.ex#L114
Et
iex > ExUnit.Assertions.refute 1 == 2
false
Good job 👏
Closes #3481
Cette PR :
Les avantages :
À savoir lors de la relecture :
Choix d’implémentation de Swoosh
deliver_many/2
que j’ai choisi de ne pas utiliser même si par endroit elle aurait été pertinente, car elle n’est pas implémentée dans tous les adaptateurs. On boucle donc sur dudeliver/2
Concernant les tests
Deux-trois broutilles vues et assez importantes à comprendre :
assert_emails_sent/1
(au pluriel) mais elle n’est faite que pour fonctionner avecdeliver_many/2
(vu plus haut). En cas de multiples mails envoyés avecdeliver/2
, il faut faire plusieurs assertions de suiteassert_email_sent/1
.assert_email_sent
marche sur le principe d’une file vidée au fur et à mesure. Si on veut s’assurer qu’il n’y a 3 emails envoyés, il faut faire suivre 3 appels àassert_email_sent/1
par un appel àassert_no_email_sent/0
. De même,assert_email_sent/1
ne veut pas dire que un seul email a été envoyé, si on veut vraiment s’en assurer, il faut mettreassert_no_email_sent/0
après. Je ne l’ai pas fait pour ne pas alourdir tous les tests, mais ça pourrait être le cas. En réalité, on devrait presque vérifier à la fin de tous les tests (donc mettre dans le helper général de tests) que aucun email additionnel non prévu ne part.En plus de la doc, c’est pas mal de lire le code des assertions de test, ainsi que les tests des assertions de test ;)
Choix de syntaxe des tests
On peut utiliser deux syntaxes possibles :
C’est à préférer lorsque c’est possible. Il y a un peu de magie derrière ce fonctionnement en keywords :
to: "deploiement@transport.data.gouv.fr"
alors que dans le Struct Swoosh.Email c’est en réalité des tuples à l’intérieur d’une liste :to: [{"Déploiement", "deploiement@transport.data.gouv.fr"}]
.text_body
ou lehtml_body
.Cependant, beaucoup de tests faisaient des assertions plus complexes sur le corps du mail, ce qui m’a forcé à utiliser la deuxième syntaxe :
Petite chose à savoir là dessus : on ne peut pas terminer par un
refute
dans le corps de la fonction, ça ne marche pas. Si il y en a, il faut les mettre en premier. Par contre toutes les assertions sont bien testées les unes après les autres (j’ai vérifié).On avait au début utilisé une syntaxe encore plus complexe, mais j’ai estimé que le pattern matching dans la fonction suffisait, j’ai donc retiré tout ce qui ressemblait à :
TODO list
Reste à faire :
À bouger dans une nouvelle issue :
email_view.ex
=> Issue de follow up : https://github.com/etalab/transport-site/issues/3951