batchCooking/apps/api/test
Nicolas d0900ad7fd feat(recipes): surligne les tech steps détectés dans les étapes, avec tooltip
Expose côté UI ce que tech-step-matcher.ts détecte déjà à la sauvegarde
(Step.techSteps) mais qui restait backend-only : dans le panneau détail
d'une recette, les mots exacts ayant déclenché une technique sont
surlignés, avec un tooltip (survol/focus clavier) donnant son nom.

- tech-step-matcher.ts : matchTechStepSpans(description, mappings) expose
  désormais {techStepId, start, end} en plus de la simple séquence d'ids
  (déjà calculé en interne, jusqu'ici jeté). matchTechSteps devient un
  wrapper fin dessus — aucun changement à ses ~12 tests existants ni à
  recipe-translation.ts.
- StepTechStep gagne start/end (nullable, pas de backfill — même leçon que
  l'incident de migration ingredient_unit_catalog : NOT NULL sans défaut
  sur une table déjà peuplée casse le déploiement). Une ligne pré-existante
  sans span est simplement omise de la réponse API plutôt que de fuiter un
  null, jusqu'à ce que la recette soit resauvegardée.
- recipe.service.ts : createRecipe/updateRecipe persistent start/end ;
  StepView expose techSteps: { techStep: {id,key}, start, end }[]. Le
  recalcul complet à chaque édition (ajout/modif/suppression d'étape) était
  déjà garanti par le delete-then-recreate existant d'updateRecipe — testé
  explicitement (nouveau test "recomputes techniques from scratch...").
- Frontend : StepDescription.tsx (découpe le texte via
  highlight-tech-steps.ts, pur et testé) remplace le <p> brut dans
  RecipeDetailPanel. Nouveau Tooltip.tsx (composants/ui, CSS pur, aucune
  lib externe — même esprit que Dialog.tsx) : un <button> (focusable
  nativement, pas de tabIndex sur un <mark> non interactif) affiche le nom
  de la technique (catalog.techSteps.<key>) au survol/focus.

Tests : matchTechStepSpans (spans corrects, chevauchement résolu),
recipe.test.ts (forme API + recalcul complet sur modif/ajout/suppression
d'étape, avec vérification que les anciennes lignes StepTechStep sont bien
supprimées), splitDescriptionByTechSteps (tri, bornes invalides ignorées,
chevauchement résiduel ignoré), scénario Cypress recipes.feature
(surlignage + tooltip au focus).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 14:46:15 +02:00
..
auth.test.ts Tests API: couverture Mocha + Cucumber pour le foyer et la suppression de compte (step 4/8) 2026-08-17 10:40:23 +02:00
health.test.ts Scaffold generic pnpm monorepo (api + web + shared) (#1) 2026-08-16 10:55:13 +02:00
house.test.ts feat(recipes): première source concrète (TheMealDB) + icône de source 2026-08-20 11:16:13 +02:00
ingredient-matcher.test.ts feat(recipes): matching anglais pour les tech steps et les ingrédients 2026-08-20 13:10:00 +02:00
json-ld-recipe.test.ts feat(recipes): source générique JSON-LD (schema.org/Recipe) 2026-08-20 12:17:49 +02:00
planning.test.ts feat(recipes): ajouter le nombre de portions couvertes par une recette 2026-08-19 21:44:01 +02:00
preferences.test.ts API: module preferences — GET/PATCH /preferences (step 2/4) 2026-08-17 15:55:45 +02:00
profile.test.ts refactor(catalog): authoring 100% anglais — uid camelCase, plus de français dans le code 2026-08-19 20:40:55 +02:00
recipe-source-sync.test.ts feat(recipes): première source concrète (TheMealDB) + icône de source 2026-08-20 11:16:13 +02:00
recipe-source.test.ts feat(recipes): première source concrète (TheMealDB) + icône de source 2026-08-20 11:16:13 +02:00
recipe-translation.test.ts feat(recipes): matching anglais pour les tech steps et les ingrédients 2026-08-20 13:10:00 +02:00
recipe.test.ts feat(recipes): surligne les tech steps détectés dans les étapes, avec tooltip 2026-08-20 14:46:15 +02:00
reference.test.ts feat(recipes): matching anglais pour les tech steps et les ingrédients 2026-08-20 13:10:00 +02:00
sources-index.test.ts feat(recipes): source générique JSON-LD (schema.org/Recipe) 2026-08-20 12:17:49 +02:00
tech-step-matcher.test.ts feat(recipes): surligne les tech steps détectés dans les étapes, avec tooltip 2026-08-20 14:46:15 +02:00
the-meal-db.test.ts feat(recipes): première source concrète (TheMealDB) + icône de source 2026-08-20 11:16:13 +02:00