etalab / transport-site

Rendre disponible, valoriser et améliorer les données transports
https://transport.data.gouv.fr
184 stars 28 forks source link

Migration de tous les mails à Swoosh #3913

Closed vdegove closed 1 month ago

vdegove commented 2 months ago

Closes #3481

Cette PR :

Les avantages :

À savoir lors de la relecture :

Choix d’implémentation de Swoosh

Concernant les tests

Deux-trois broutilles vues et assez importantes à comprendre :

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 :

assert_email_sent(
  from: …
  to: "deploiement@transport.data.gouv.fr"
  body: ~r/truc/
)

C’est à préférer lorsque c’est possible. Il y a un peu de magie derrière ce fonctionnement en keywords :

Cependant, beaucoup de tests faisaient des assertions plus complexes sur le corps du mail, ce qui m’a forcé à utiliser la deuxième syntaxe :

assert_email_sent(fn Swoosh.Email{
  from: {"transport.datagouv.fr", "contact@transport.data.gouv.fr"},
  to: …
  html_body: html
} -> 
  assert html =~ ~r/regex1/
  assert html =~ ~r/regex2/
end)

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 à :

assert_email_sent(fn Swoosh.Email{} = sent -> 
  assert sent = Swoosh.Email{
    from: {"transport.datagouv.fr", "contact@transport.data.gouv.fr"},
    to: …
    html_body: html
}
  assert html =~ …
end)

TODO list

Reste à faire :

À bouger dans une nouvelle issue :

=> Issue de follow up : https://github.com/etalab/transport-site/issues/3951

AntoineAugusti commented 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é ?

vdegove commented 1 month ago

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
ptitfred commented 1 month ago

Good job 👏