Apparence
Mot de passe oublié
Le parcours de réinitialisation : demander un lien depuis l'écran de connexion, choisir un nouveau mot de passe, et ce qui se passe quand le lien ne vaut plus.
Prérequis communs : make seed-demo. Le lien de réinitialisation part par courriel ; en développement il s'affiche dans les journaux du backend (make logs), rien n'est réellement envoyé.
1. Demander un lien de réinitialisation
Tickets : — · Rôle : n'importe lequel · Prérequis : make seed-demo
Critères d'acceptation
- Le courriel comporte une version HTML aux couleurs de l'APAJH et un repli texte complet.
- Le lien de réinitialisation et sa durée de validité d'une heure apparaissent dans les deux versions.
Depuis
/login, cliquez sur Mot de passe oublié ?.✅ Résultat attendu : l'écran Mot de passe oublié s'ouvre, avec le champ Adresse email et le bouton Envoyer le lien.
Saisissez l'adresse du compte de démonstration et validez.
✅ Résultat attendu : l'écran Email envoyé confirme l'envoi par une phrase commençant par « Si un compte… ».
Dans les journaux du backend, repérez le courriel envoyé.
✅ Résultat attendu : le message contient un corps texte lisible et une alternative HTML avec le logo APAJH. Les deux versions présentent le même lien de réinitialisation et précisent qu'il est valable une heure.
Recommencez avec une adresse qui n'existe pas.
✅ Résultat attendu : exactement la même confirmation. C'est intentionnel — une réponse différente permettrait de savoir quelles adresses ont un compte.
Couverture automatique : e2e/password-reset.spec.ts → « le lien depuis /login mène à la demande de réinitialisation » et « une demande affiche une confirmation neutre ». Côté serveur, backend/tests/test_password_reset.py.
2. Choisir un nouveau mot de passe
Tickets : — · Rôle : n'importe lequel · Prérequis : un lien obtenu au scénario 1
Récupérez le lien dans les journaux du backend et ouvrez-le.
✅ Résultat attendu : les champs Nouveau mot de passe et Confirmer le mot de passe s'affichent, avec le bouton Réinitialiser.
Saisissez deux mots de passe différents et validez.
✅ Résultat attendu : un message signale qu'ils ne correspondent pas. Rien n'est envoyé au serveur.
Saisissez deux fois le même mot de passe et validez.
✅ Résultat attendu : l'écran Mot de passe modifié s'affiche, avec le bouton Aller à la connexion. Le nouveau mot de passe permet de se connecter ; l'ancien ne fonctionne plus.
Couverture automatique : e2e/password-reset.spec.ts → « un lien valide permet de choisir un nouveau mot de passe » et « deux mots de passe différents sont refusés côté client ».
3. Se heurter à un lien invalide ou expiré
Tickets : — · Rôle : n'importe lequel · Prérequis : aucun
Ouvrez un lien de réinitialisation déjà consommé, ou dont vous avez modifié un caractère du jeton.
✅ Résultat attendu : l'écran Lien invalide s'affiche, avec la mention « invalide ou expiré » et le lien Demander un nouveau lien.
Ouvrez
/reset-passwordsans aucun paramètre dans l'adresse.✅ Résultat attendu : l'écran oriente vers une nouvelle demande plutôt que d'afficher un formulaire inutilisable.
Couverture automatique : e2e/password-reset.spec.ts → « un lien invalide/expiré affiche une erreur » et « un lien sans uid/token oriente vers une nouvelle demande ».
4. Vérifier le rendu sur téléphone
Tickets : — · Rôle : n'importe lequel · Prérequis : aucun
En 390 × 844, ouvrez
/forgot-password.✅ Résultat attendu : le formulaire occupe la largeur, reste entièrement lisible, et la page ne défile pas horizontalement.
Couverture automatique : e2e/password-reset.spec.ts → « rendu sur mobile ».
Points d'attention
- Le lien contient un identifiant et un jeton. Il vaut pour un seul usage : une seconde ouverture affiche Lien invalide, ce qui est le comportement voulu et non un bug à signaler.
- L'adresse du lien envoyé est construite à partir de l'origine déclarée dans
.env. Sur un environnement où elle est mal renseignée, le courriel part avec un lien qui ne mène nulle part — vérifiez-la avant de conclure à une panne. - En local, le lien affiché dans les journaux (
make logs) est décodé, copiable tel quel (apps.common.email.ReadableConsoleEmailBackend). Avant APAJH-227, le backend console de Django imprimait le courriel brut : un accent dans le corps (il y en a toujours un, le texte est en français) force un encodagequoted-printablequi coupe le lien sur deux lignes et échappe chaque=en=3D— copié tel quel, il donne unuid/tokencassés et un Lien invalide immédiat, sans rapport avec une expiration ou une double utilisation.
5. Utiliser une invitation ou une réinitialisation administrative
Tickets : — · Rôle : salarié · Prérequis : email professionnel renseigné, invitation ou réinitialisation préparée depuis le back-office.
Ouvrez le lien du mail sur ordinateur, puis rejouez sur téléphone.
Saisissez et confirmez le nouveau mot de passe. Vérifiez qu'une confirmation différente et un mot de passe trop faible sont refusés.
Enregistrez, puis choisissez Aller à la connexion et connectez-vous avec l'identifiant communiqué dans le mail.
✅ Le mot de passe est utilisable. Le lien consommé est refusé ; un lien invalide ou expiré est également refusé. Mot de passe oublié reste disponible.
L'attente dans la file ne consomme pas la validité du lien : il est préparé au moment de l'envoi. Une réinitialisation administrative n'invalide pas le mot de passe existant avant l'utilisation du lien. Elle vise l'email professionnel, qui peut être différent de l'adresse utilisée par Mot de passe oublié. Le mail donne la durée de validité du lien en heures ou en minutes.
Couverture automatique : e2e/password-reset.spec.ts → « un lien valide permet de choisir un nouveau mot de passe » et « définit le mot de passe depuis une invitation sur mobile ». backend/tests/test_account_invitations.py couvre le token tardif, son utilisation et la connexion réelle par l'API.