From 9722f4a27b3fe9952044f6225e2d9b9343671812 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Sun, 16 Aug 2026 23:42:54 +0200 Subject: [PATCH] Tests + docs: onboarding/foyer Cypress coverage, specs updates (step 6/6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - apps/web/cypress/e2e/onboarding.cy.ts — parcours complet (rempli et entièrement skippé) signup → 3 étapes → home, mêmes conventions cy.intercept que le reste. - apps/web/cypress/e2e/household.cy.ts — /foyer : préremplissage, et sauvegarde indépendante de chacune des 3 sections. - specs/frontend-architecture.md : nouvelle section "Parcours profil — foyer, régime, allergènes" (diagramme mermaid, les deux bugs de state trouvés en testant dans le navigateur), arborescence et namespaces i18n à jour. - README.md : nouvelle section "Parcours profil — foyer, régime, allergènes", section sidebar mise à jour (Foyer & profil n'est plus un stub). Cypress lui-même ne peut pas tourner en local dans ce sandbox (voir la note existante dans le README) — vérifié via `tsc --noEmit` sur les specs + parcours manuel complet dans le navigateur (les deux à travers les 5 commits précédents de cette feature). Clôt la feature profil/foyer/régime/allergènes (6 commits, cette PR) : seed+référence -> endpoints foyer/profil -> composants partagés -> wizard d'inscription -> page /foyer -> ce commit. --- README.md | 53 +++++++++-- apps/web/cypress/e2e/household.cy.ts | 94 +++++++++++++++++++ apps/web/cypress/e2e/onboarding.cy.ts | 129 ++++++++++++++++++++++++++ specs/frontend-architecture.md | 92 +++++++++++++++--- 4 files changed, 346 insertions(+), 22 deletions(-) create mode 100644 apps/web/cypress/e2e/household.cy.ts create mode 100644 apps/web/cypress/e2e/onboarding.cy.ts diff --git a/README.md b/README.md index bb2f2a8..3bff53d 100644 --- a/README.md +++ b/README.md @@ -258,17 +258,54 @@ Une fois connecté, l'utilisateur atterrit sur `src/layouts/AppLayout.tsx` — s `` pour la route active — montée une seule fois comme route parente de tout l'espace authentifié (`App.tsx`), pas dupliquée par page. `src/pages/HomePage.tsx` (routée sur `/`) affiche le planning de la semaine du foyer (`GET /planning/current`, -voir plus haut) avec ses états chargement/erreur/vide/rempli ; `Recettes`, `Liste de -courses` et `Foyer & profil` n'ont pas encore de backend dédié et rendent pour -l'instant le même composant `ComingSoonPage`. Détail complet (pourquoi une seule -route parente, pourquoi un composant stub partagé) : +voir plus haut) avec ses états chargement/erreur/vide/rempli ; `Recettes` et `Liste de +courses` n'ont pas encore de backend dédié et rendent pour l'instant le même +composant `ComingSoonPage` — `Foyer & profil` (`src/pages/HouseholdPage.tsx`), lui, +est une vraie page (voir section suivante). Détail complet (pourquoi une seule route +parente, pourquoi un composant stub partagé) : [specs/frontend-architecture.md](specs/frontend-architecture.md#applayout--sidebar-commune-à-lespace-connecté). +## Parcours profil — foyer, régime, allergènes (apps/web) + +- `src/features/profile/` — `HouseNameField`, `DietSelect`, `AllergySelect` : champs + contrôlés et "dumb" (reçoivent leurs données en props, ne fetchent rien + eux-mêmes), partagés par les deux surfaces ci-dessous. `AllergySelect` utilise une + grille de cases à cocher dans un `
`/`` plutôt qu'un + `` — bien plus repérable/tapable, notamment sur + mobile (voir la note Capacitor plus haut). + +### Deux bugs de state trouvés en testant dans le navigateur + +1. **Course entre `navigate()` et `RedirectIfAuthenticated`** — voir la note sur + `RedirectIfAuthenticated` plus haut. `SignupPage` doit maintenant rediriger vers + `/onboarding/foyer`, pas `/`, ce qui a rendu visible une course de state + auparavant invisible. +2. **`user.dietId` périmé sur `/foyer`** — `HouseholdPage` initialisait le régime + affiché depuis `useAuth().user.dietId`, un instantané d'`AuthContext` jamais + rafraîchi après une modification faite directement via `apiClient` (qui ne + touche pas le contexte). Une navigation SPA aller-retour sans rechargement + complet ré-affichait donc l'ancienne valeur après une sauvegarde. Fix : + `HouseholdPage` fetch son propre profil frais (`apiClient.me()`) au montage + plutôt que de dépendre du contexte, et `AuthContext.refreshUser()` (nouvelle + méthode, re-fetch `GET /auth/me`) est appelée après une sauvegarde réussie du + régime — pour que le reste de l'app (pas seulement cette page) reste cohérent. --- @@ -146,7 +208,9 @@ JSON, jamais codé en dur dans un composant. namespace : `errors.*` (voir [error-handling.md](./error-handling.md)), `auth.login.*` / `auth.signup.*`, `layout.*` (nav de la sidebar, salutation, déconnexion — `AppLayout`), `home.*` (planning), `recipes.*` / `shoppingList.*` - / `household.*` (copie des pages stub, voir `ComingSoonPage` plus haut). + (copie des pages stub, voir `ComingSoonPage` plus haut), `onboarding.*` (wizard + d'inscription) et `household.*` (titre + `form.*`, champs partagés par le wizard + et `/foyer`). - Dans un composant : `const { t } = useTranslation(); t("auth.login.title")`. - Ajouter une langue : créer `locales//translation.json` avec les mêmes clés, ajouter `resources.` dans `i18n/i18n.ts` — aucun composant à toucher.