Apparence
Couverture automatisée
Ce que les suites de tests vérifient à chaque construction. Ce qui est ici n'a pas besoin d'être rejoué à la main : c'est le seul usage de ce document.
Il est généré depuis les suites elles-mêmes, jamais tenu à jour à la main : un test supprimé disparaît d'ici à la génération suivante, et ne peut donc pas continuer à rassurer.
Interface — Playwright
Les scénarios end-to-end, joués sur le bundle de production dans un navigateur.
Ce qu'ils ne prouvent pas : ils tournent sans backend. Les appels d'API sont interceptés et remplacés par des réponses figées. Ils démontrent donc que l'interface se comporte correctement face aux données et aux droits que l'API lui annonce — pas que l'API les produit ni qu'elle les applique. Cette seconde moitié est couverte par pytest, plus bas, et reste à vérifier de bout en bout à la main sur les parcours sensibles.
Les scénarios dont le titre commence par « mobile » sont joués en 390 × 844 ; les autres en largeur bureau.
e2e/equipes.spec.ts
Exemptée de recette manuelle — voir l’index.
| Groupe | Ce qui est vérifié |
|---|---|
| équipes — sélecteur d’établissement(s) | le pôle groupe les établissements sans planter ni les dupliquer |
e2e/fiche-salarie.spec.ts
Recette manuelle : Fiche salarié.
| Groupe | Ce qui est vérifié |
|---|---|
| fiche salarié — bandeau et rail | le bandeau résume le salarié et ses trois chiffres |
| fiche salarié — bandeau et rail | sans matricule paie, le bandeau porte « Non synchronisée paie » |
| fiche salarié — bandeau et rail | avec son matricule, la fiche ne porte aucun marqueur provisoire |
| fiche salarié — bandeau et rail | un intérimaire sans matricule porte « Intérim », pas « Non synchronisée paie » |
| fiche salarié — bandeau et rail | le rail ouvre chaque volet par son adresse |
| fiche salarié — Informations | les champs de la paie sont en lecture seule, le reste est éditable par RH |
| fiche salarié — Informations | un rôle manager lit la fiche sans pouvoir l’enregistrer |
| fiche salarié — Informations | le justificatif d’honorabilité part bien en multipart |
| fiche salarié — Contrat | affiche les trois blocs, cadenas compris |
| fiche salarié — Contrat | les dimanches ne sont demandés que sur un contrat non annualisé |
| fiche salarié — Contrat | un rôle manager voit le contrat sans pouvoir le modifier |
| fiche salarié — Famille & social | par défaut, un enfant n’expose que son âge |
| fiche salarié — Famille & social | RH voit le détail et peut l’éditer |
| fiche salarié — Urgence et Lieux de travail | un Manager n1 édite les personnes à prévenir bien qu’il ne soit pas staff |
| fiche salarié — Urgence et Lieux de travail | sans la capacité, les mêmes contacts sont en lecture seule |
| fiche salarié — Urgence et Lieux de travail | un Manager n1 édite les lieux de travail ; le principal et l’établissement de paie restent en lecture seule |
| fiche salarié — Urgence et Lieux de travail | sans la capacité, les rattachements ne sont que des étiquettes |
| fiche salarié — Compteurs | les figures sont lisibles par tous, éditables par le seul staff |
| fiche salarié — Compteurs | un rôle manager voit les compteurs sans bouton Éditer |
| fiche salarié — mobile | le rail passe au-dessus du volet et la page ne déborde pas |
| fiche salarié — mobile | le volet reste éditable et sa barre d’actions atteignable |
e2e/gallery.spec.ts
Exemptée de recette manuelle — voir l’index.
| Groupe | Ce qui est vérifié |
|---|---|
| galerie du design system | rend toutes les sections sans erreur console |
| galerie du design system | le tableau piloté filtre sur la recherche insensible aux accents |
| galerie du design system | mobile : les tableaux défilent au lieu d’écraser leurs colonnes |
e2e/impersonate.spec.ts
Recette manuelle : Connexion.
| Groupe | Ce qui est vérifié |
|---|---|
| assumer une identité | un token dans l’URL ouvre le portail |
| assumer une identité | sans token, retour à la connexion |
| assumer une identité | rendu sur mobile |
e2e/login.spec.ts
Recette manuelle : Connexion.
| Groupe | Ce qui est vérifié |
|---|---|
| connexion | affiche la carte de connexion |
| connexion | une connexion réussie ouvre le portail |
| connexion | des identifiants invalides affichent une erreur |
| connexion | rendu et connexion sur mobile |
e2e/nouvel-utilisateur.spec.ts
Recette manuelle : Annuaire Utilisateurs.
| Groupe | Ce qui est vérifié |
|---|---|
| nouvel utilisateur — création | crée un salarié sans matricule et mène à sa fiche |
| nouvel utilisateur — création | un matricule déjà connu part tel quel |
| nouvel utilisateur — création | ne propose que les types de contrat actifs |
| nouvel utilisateur — création | le bouton reste désactivé tant qu’un champ obligatoire manque |
| nouvel utilisateur — création | un refus de l’API est affiché sans quitter la page |
| nouvel utilisateur — le type de contrat décide du formulaire | choisir Intérim réduit le dossier à ce qu’une mission demande |
| nouvel utilisateur — le type de contrat décide du formulaire | un intérim part sans établissement de paie |
| nouvel utilisateur — le type de contrat décide du formulaire | un intérim sans date de fin ne peut pas être créé |
| nouvel utilisateur — le type de contrat décide du formulaire | un champ saisi avant de basculer sur Intérim ne part pas |
| nouvel utilisateur — le dossier complet d’un salarié | l’ETP et les heures mensuelles suivent les heures hebdomadaires |
| nouvel utilisateur — le dossier complet d’un salarié | les dimanches ne sont demandés que hors annualisation |
| nouvel utilisateur — le dossier complet d’un salarié | le régime de temps et la période d’essai partent avec la création |
| nouvel utilisateur — le dossier complet d’un salarié | le statut aidant et ses personnes aidées partent avec la création |
| nouvel utilisateur — le dossier complet d’un salarié | joindre le justificatif d’honorabilité fait partir un multipart |
| nouvel utilisateur — accès | un profil sans le droit ne voit pas le bouton |
| nouvel utilisateur — accès | avec le droit, le bouton de l’annuaire ouvre le formulaire |
| nouvel utilisateur — accès | un Salarié n’atteint pas la page, même par son adresse |
| nouvel utilisateur — mobile | le formulaire tient sur un téléphone et crée le salarié |
e2e/password-reset.spec.ts
Recette manuelle : Mot de passe oublié.
| Groupe | Ce qui est vérifié |
|---|---|
| mot de passe oublié | le lien depuis /login mène à la demande de réinitialisation |
| mot de passe oublié | une demande affiche une confirmation neutre |
| mot de passe oublié | un lien valide permet de choisir un nouveau mot de passe |
| mot de passe oublié | deux mots de passe différents sont refusés côté client |
| mot de passe oublié | un lien invalide/expiré affiche une erreur |
| mot de passe oublié | un lien sans uid/token oriente vers une nouvelle demande |
| mot de passe oublié | rendu sur mobile |
e2e/planning-wizard.spec.ts
Recette manuelle : Bibliothèque ▸ Trames — assistant de planification.
| Groupe | Ce qui est vérifié |
|---|---|
| planning — wizard | « Enregistrer et créer un planning » ouvre le wizard sur l’étape Date |
| planning — wizard | l’équipe par défaut pré-remplit le roster, non coché |
| planning — wizard | cocher un établissement met à jour la liste en direct |
| planning — wizard | ajouter un salarié par recherche l’intègre au roster |
| planning — wizard | chercher un nom qui ne correspond à personne affiche « Aucun résultat » |
| planning — wizard | la recherche de salarié fonctionne aussi par nom d’utilisateur |
| planning — wizard | les équipes hors du périmètre du manager n’apparaissent jamais dans « Équipe » |
| planning — wizard | la pagination limite le roster à 10 salariés et tourne les pages |
| planning — wizard | valider envoie une affectation par salarié coché et revient à la bibliothèque |
| planning — wizard | « ‹ Retour » referme le wizard sans planifier personne |
| planning — wizard | mobile : le wizard défile au lieu de déborder de la page |
e2e/planning.spec.ts
Recette manuelle : Planning manager.
| Groupe | Ce qui est vérifié |
|---|---|
| planning manager | le planning a son URL et le menu y conduit |
| planning manager | affiche la grille salariés × jours |
| planning manager | le bouton « Légende » ouvre un panneau à droite |
| planning manager | le bouton flottant ouvre le menu d’actions |
| planning manager | navigue d’une période à l’autre |
| planning manager | passe en vue mois, plus dense et cumulée |
| planning manager | la grille défile dans sa boîte au lieu de pousser la page |
| planning manager | un jour férié est grisé comme un week-end |
| planning manager | chaque unité se termine par une ligne « Poste à pourvoir » |
| planning manager | le clic sur « Poste à pourvoir » ouvre l’affectation |
| planning manager | filtre les salariés par établissement |
| planning manager | une bande d’équipe se replie et se déplie |
| planning manager | une journée coupée affiche deux postes dans la même case |
| planning manager | deux postes de même code gardent chacun ses horaires |
| planning manager | le total dépassant 44 h est signalé |
| planning manager | « Exporter » est un menu déroulant |
| planning manager | le panneau d’alertes liste les infractions CCN-66 |
| planning manager | le clic sur un poste ouvre le détail à droite |
| planning manager | « Modifier le poste » ouvre le formulaire, « Retour » revient au détail |
| planning manager | choisir un poste dans la bibliothèque remplit les créneaux et l’écart |
| planning manager | un poste saisi à la main se cumule créneau par créneau |
| planning manager | « Enregistrer » n’écrit rien tant qu’aucun créneau n’est complet |
| planning manager | « Enregistrer » crée la modulation de la journée |
| planning manager | un poste choisi dans la bibliothèque part avec sa clé |
| planning manager | une journée déjà modulée corrige sa modulation |
| planning manager | « Enregistrer » reste inerte pendant l’envoi |
| planning manager | un refus du serveur reste affiché dans le panneau |
| planning manager | « Retour » garde la saisie du formulaire |
| planning manager | une personne d’astreinte porte un téléphone sur sa ligne |
| planning manager | le clic sur un nom ouvre le panneau de l’utilisateur |
| planning manager | le panneau passe de l’utilisateur au poste sans mélanger les deux |
| planning manager | un jour d’absence détaille un statut, pas des horaires |
| planning manager | filtre les salariés par équipe |
| planning manager | la ligne d’un salarié apparaît dans chacune de ses équipes |
| planning manager | filtrer sur une équipe ne laisse qu’une des deux lignes |
| planning manager | rend la grille sans erreur console |
| planning manager | mobile : la grille ne fait pas déborder la page |
e2e/portal-routing.spec.ts
Recette manuelle : Portail.
| Groupe | Ce qui est vérifié |
|---|---|
| portail — routes | « Utilisateurs » ouvre /utilisateurs |
| portail — routes | un onglet de fiche salarié est une adresse à part entière |
| portail — routes | une fiche sans onglet, ou avec un onglet inconnu, retombe sur Informations |
| portail — routes | mobile : la fiche salarié reste accessible par son adresse |
| portail — cloisonnement de l’espace manager | un salarié n’a ni sélecteur d’espace ni navigation manager |
| portail — cloisonnement de l’espace manager | un salarié saisissant /utilisateurs est renvoyé sur le portail |
| portail — cloisonnement de l’espace manager | un salarié saisissant une fiche salarié est renvoyé sur le portail |
| portail — cloisonnement de l’espace manager | mobile : un salarié n’a pas non plus de navigation manager |
e2e/postes.spec.ts
Recette manuelle : Bibliothèque Postes.
| Groupe | Ce qui est vérifié |
|---|---|
| bibliothèque — postes | liste les postes de la bibliothèque |
| bibliothèque — postes | le filtre catégorie restreint la liste |
| bibliothèque — postes | la pagination limite le tableau à 10 lignes et tourne les pages |
| bibliothèque — postes | créer un poste de catégorie Nuit — le trou du mockup |
| bibliothèque — postes | éditer un poste met à jour la ligne |
| bibliothèque — postes | dupliquer un poste ouvre la création pré-remplie |
| bibliothèque — postes | supprimer un poste demande une confirmation |
| bibliothèque — postes | mobile : le tableau défile au lieu de déborder de la page |
e2e/sidebar.spec.ts
Recette manuelle : Portail.
| Groupe | Ce qui est vérifié |
|---|---|
| portail — navigation | affiche la navigation manager par défaut |
| portail — navigation | bascule vers « Mon espace » et change la navigation |
| portail — navigation | replie la sidebar en rail sur bureau |
| portail — navigation | ouvre le tiroir via le burger sur mobile |
| portail — navigation | mobile : ni sélecteur de rôle ni avatar dans la topbar |
| portail — navigation | mobile : le pied du tiroir se limite à la puce utilisateur |
| portail — navigation | mobile : presser la puce utilisateur referme le tiroir |
e2e/topbar-menus.spec.ts
Recette manuelle : Portail.
| Groupe | Ce qui est vérifié |
|---|---|
| topbar — menus déroulants (bureau) | la cloche ouvre la liste des notifications |
| topbar — menus déroulants (bureau) | « Tout marquer comme lu » retire le compteur de non-lues |
| topbar — menus déroulants (bureau) | l'avatar ouvre le menu de compte |
e2e/trames.spec.ts
Recette manuelle : Bibliothèque ▸ Trames.
| Groupe | Ce qui est vérifié |
|---|---|
| bibliothèque — trames | liste les trames de la bibliothèque |
| bibliothèque — trames | créer une trame en choisissant un poste existant |
| bibliothèque — trames | changer uniquement la couleur d’une case déjà affectée la met à jour |
| bibliothèque — trames | entrer un poste manuellement l’assigne à la case |
| bibliothèque — trames | un horaire manuel non sauvegardé s’applique sans créer de poste |
| bibliothèque — trames | poser un repos hebdomadaire sur une case |
| bibliothèque — trames | ajouter une semaine, puis la supprimer |
| bibliothèque — trames | éditer une trame renomme la trame |
| bibliothèque — trames | supprimer une trame demande une confirmation |
| bibliothèque — trames | mobile : la grille défile au lieu de déborder de la page |
e2e/utilisateurs.spec.ts
Recette manuelle : Annuaire Utilisateurs.
| Groupe | Ce qui est vérifié |
|---|---|
| utilisateurs — annuaire | compte les effectifs par famille de contrat |
| utilisateurs — annuaire | liste les salariés avec leur contrat et leur ETP |
| utilisateurs — annuaire | la recherche ignore la casse et les accents |
| utilisateurs — annuaire | le filtre établissement restreint la liste |
| utilisateurs — annuaire | un dossier sans matricule paie porte la pastille « Provisoire » |
| utilisateurs — annuaire | un intérimaire sans matricule n’est PAS provisoire |
| utilisateurs — annuaire | ouvrir une ligne mène à la fiche du salarié |
| utilisateurs — annuaire | mobile : le tableau défile au lieu de déborder de la page |
Serveur — pytest
Les tests du backend, exécutés contre une vraie base jetable, migrations comprises.
Le décompte porte sur les fonctions de test. Certaines sont paramétrées et produisent plusieurs cas à l'exécution : le total affiché par pytest est donc un peu supérieur à celui de ce tableau.
| Module | Fonctions | Ce qui est couvert |
|---|---|---|
backend/tests/test_admin_mfa.py | 13 | MFA du back-office : enrôlement TOTP, codes de secours, réinitialisation et révocation des sessions |
backend/tests/test_audit.py | 22 | Piste d’audit des écritures API : acteur, objet ciblé, différences, accès et rétention |
backend/tests/test_auth.py | 17 | Connexion JWT, endpoint /me/, compte de démonstration et bouton « Assumer l'identité » |
backend/tests/test_contract_types.py | 14 | Référentiel paramétrable des types de contrat et de leurs familles |
backend/tests/test_counters.py | 34 | Compteurs de congés, compte épargne-temps et annualisation : calculs et seuils d'alerte |
backend/tests/test_data_imports.py | 20 | Parsing, idempotence, audit et import transactionnel des exports CEGI |
backend/tests/test_devtools_seeds.py | 3 | Commandes de peuplement du dev : leur enchaînement, leur idempotence et ce qu'elles écrivent |
backend/tests/test_dump_docs_admin_facts.py | 15 | Introspection du back-office : écrans, colonnes, filtres, sous-listes et droits |
backend/tests/test_dump_docs_facts.py | 11 | Introspection qui alimente la documentation générée : modèles, champs, relations |
backend/tests/test_dump_docs_route_facts.py | 12 | Introspection des routes de l'API : chemins, verbes autorisés et permissions exigées |
backend/tests/test_dump_docs_schedule_facts.py | 6 | Introspection de l'ordonnancement Celery : tâches planifiées, horaires et fuseau |
backend/tests/test_employee.py | 162 | Fiche salarié : champs, contrats, enfants à charge et masquage selon les droits |
backend/tests/test_establishment.py | 60 | Référentiel organisationnel : sites, pôles, établissements, services, codes de paye |
backend/tests/test_health.py | 2 | Sonde de santé utilisée par Docker et par le proxy |
backend/tests/test_holidays.py | 32 | Référentiel des jours fériés et sa synchronisation nocturne depuis api.gouv.fr |
backend/tests/test_password_reset.py | 7 | Parcours de réinitialisation du mot de passe, de la demande au nouveau mot de passe |
backend/tests/test_planning.py | 18 | Rattachement d'une trame à un salarié réel, daté : clôture de l'ancienne affectation et versionnage de la trame éditée |
backend/tests/test_planning_calendar.py | 47 | Calendrier du planning : résolution d'une journée depuis le cycle de la trame, bandeaux d'équipe, astreintes et alertes CCN-66 |
backend/tests/test_planning_override.py | 28 | Modulation d'un poste : une journée écrite à la main prend le pas sur la trame, journée coupée comprise, et les alertes CCN-66 la comptent à la place de la journée théorique |
backend/tests/test_postes.py | 27 | Bibliothèque de postes : durée nette, franchissement de minuit et cloisonnement par compte |
backend/tests/test_roles.py | 26 | Rôles datés par établissement et contrôle d'accès qui en découle |
backend/tests/test_trames.py | 35 | Bibliothèque personnelle de cycles de travail d'un manager : cases assignées à un poste ou à un repos |
Total : 611 fonctions de test.