fix(recipes): rend StepDescription tolérant à un techSteps absent #62

Merged
kyuno merged 1 commit from claude/practical-swartz-648594 into main 2026-09-06 09:24:30 +02:00
Owner

Contexte

Trouvé pendant un run autonome de traitement des tickets planned — sans rapport avec ce travail, ce fichier n'a pas été touché.

StepDescription faisait useState(techSteps) puis liveTechSteps.flatMap(...). Quand la prop techSteps arrivait undefined, .flatMap levait TypeError: Cannot read properties of undefined (reading 'flatMap'), remontée par Cypress comme une erreur applicative non capturée qui faisait échouer le test.

Observé de façon intermittente sur le scénario recipe-form.feature « Preloads an existing recipe's ingredients when editing » : après enregistrement, RecipeFormPage navigue vers /recettes/:id, dont le détail (RecipesPage → RecipeDetailPanel → StepDescription) se rendait parfois avant que techSteps ne soit peuplé. Le run CI précédent sur le même code passait les 29 specs — c'est bien une course au rendu / au chargement.

Correctif

  • StepDescription.tsx : techSteps devient optionnel et liveTechSteps retombe sur [] (dans le useState et le useEffect de resync), pour que tous les consommateurs (.flatMap pour temperatures, splitDescriptionSegments, findTechStepForTemperature, lookup activeStepTechStep) aient toujours un vrai tableau — même posture « tolérer la donnée manquante, ne pas planter » que le reste du composant. Les vrais appelants (RecipeDetailPanel depuis RecipeView / RecipeImportDraftView) passent toujours un tableau défini ; le type reste honnête, la prop optionnelle documente juste que le composant sait s'en passer.
  • cypress/e2e/recipe-form.ts : le mock de la recette 7 envoyait une étape sans techSteps, contrairement au vrai StepView (packages/shared) et à tous les autres mocks de la suite — corrigé en techSteps: [].
  • cypress/e2e/recipes.cy.ts : nouveau test de non-régression déterministe — un payload d'étape sans techSteps doit rendre la description en texte brut. Vérifié qu'il échoue bien (flatMap sur undefined) sans le correctif du composant, et passe avec.

Vérifications (locales)

  • pnpm lint (Biome) ✓, tsc -b (apps/web) ✓
  • recipe-form.feature (5/5) + recipes.cy.ts (11/11) — 3 runs consécutifs propres

🤖 Generated with Claude Code

## Contexte Trouvé pendant un run autonome de traitement des tickets `planned` — sans rapport avec ce travail, ce fichier n'a pas été touché. `StepDescription` faisait `useState(techSteps)` puis `liveTechSteps.flatMap(...)`. Quand la prop `techSteps` arrivait `undefined`, `.flatMap` levait `TypeError: Cannot read properties of undefined (reading 'flatMap')`, remontée par Cypress comme une erreur applicative non capturée qui faisait échouer le test. Observé de façon **intermittente** sur le scénario `recipe-form.feature` « Preloads an existing recipe's ingredients when editing » : après enregistrement, `RecipeFormPage` navigue vers `/recettes/:id`, dont le détail (`RecipesPage` → `RecipeDetailPanel` → `StepDescription`) se rendait parfois avant que `techSteps` ne soit peuplé. Le run CI précédent sur le même code passait les 29 specs — c'est bien une course au rendu / au chargement. ## Correctif - **`StepDescription.tsx`** : `techSteps` devient optionnel et `liveTechSteps` retombe sur `[]` (dans le `useState` et le `useEffect` de resync), pour que tous les consommateurs (`.flatMap` pour `temperatures`, `splitDescriptionSegments`, `findTechStepForTemperature`, lookup `activeStepTechStep`) aient toujours un vrai tableau — même posture « tolérer la donnée manquante, ne pas planter » que le reste du composant. Les vrais appelants (`RecipeDetailPanel` depuis `RecipeView` / `RecipeImportDraftView`) passent toujours un tableau défini ; le type reste honnête, la prop optionnelle documente juste que le composant sait s'en passer. - **`cypress/e2e/recipe-form.ts`** : le mock de la recette 7 envoyait une étape sans `techSteps`, contrairement au vrai `StepView` (`packages/shared`) et à tous les autres mocks de la suite — corrigé en `techSteps: []`. - **`cypress/e2e/recipes.cy.ts`** : nouveau test de non-régression déterministe — un payload d'étape sans `techSteps` doit rendre la description en texte brut. Vérifié qu'il échoue bien (`flatMap` sur `undefined`) sans le correctif du composant, et passe avec. ## Vérifications (locales) - `pnpm lint` (Biome) ✓, `tsc -b` (apps/web) ✓ - `recipe-form.feature` (5/5) + `recipes.cy.ts` (11/11) — 3 runs consécutifs propres 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 09:07:33 +02:00
fix(recipes): rend StepDescription tolérant à un techSteps absent
All checks were successful
CI / lint (push) Successful in 4m3s
CI / build (push) Successful in 4m36s
CI / intent-service-test (push) Successful in 5m53s
CI / e2e (push) Successful in 8m56s
CI / test (push) Successful in 18m54s
8e55f3d3f9
StepDescription faisait `useState(techSteps)` puis `liveTechSteps.flatMap(...)` :
quand la prop `techSteps` arrivait `undefined`, `.flatMap` levait
`TypeError: Cannot read properties of undefined (reading 'flatMap')`, remontée
par Cypress comme une erreur applicative non capturée. Observé de façon
intermittente sur le parcours « modifier une recette » : après enregistrement,
`RecipeFormPage` navigue vers `/recettes/:id`, dont le détail se rendait parfois
avant que `techSteps` ne soit peuplé.

- `StepDescription` : `techSteps` devient optionnel et `liveTechSteps` retombe
  sur `[]` (dans le `useState` et le `useEffect` de resync), pour que tous les
  consommateurs (`.flatMap`, `splitDescriptionSegments`,
  `findTechStepForTemperature`, lookup `activeStepTechStep`) aient toujours un
  vrai tableau — même posture « tolérer la donnée manquante, ne pas planter »
  que le reste du composant.
- `recipe-form.ts` : le mock de la recette 7 envoyait une étape sans `techSteps`,
  contrairement au vrai `StepView` et à tous les autres mocks de la suite —
  corrigé en `techSteps: []`.
- `recipes.cy.ts` : nouveau test de non-régression déterministe — un payload
  d'étape sans `techSteps` doit rendre la description en texte brut. Vérifié
  qu'il échoue bien (`flatMap` undefined) sans le correctif du composant.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit ab1cf421d9 into main 2026-09-06 09:24:30 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#62
No description provided.