GET /shopping-list?date= (shopping-list.service.ts/.routes.ts) somme les ingrédients de chaque recette planifiée sur la semaine, mis à l'échelle par les portions de chaque créneau (PlanningItem.portions / Recipe.portions), regroupés par paire (ingredientId, unitId) — jamais null contrairement à GET /planning, une semaine vide redescend en items: []. Côté web, ShoppingListPage rend cette liste groupée par rayon (même IngredientCategory que IngredientPicker), triée alphabétiquement en français à l'intérieur d'un rayon (shopping-list.ts, logique pure extraite du composant). WeekNavigator (flèches + calendrier) est extrait de PlanningPage vers features/planning/ pour être partagé entre les deux pages ; ses libellés migrent de planning.* vers common.weekNav.*/ common.calendar.*/common.days.*, plus génériques pour une page qui n'est plus seulement le planning. ComingSoonPage retiré (plus aucun appelant, Liste de courses avait le dernier stub restant). Tests : Mocha (agrégation, mise à l'échelle par portions, unités non fusionnées) + Cucumber (shopping-list.feature : liste vide, groupement/tri, navigation de semaine) + mise à jour de layout.cy.ts/planning-page.cy.ts pour le nouveau rendu. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
32 lines
1.6 KiB
Gherkin
32 lines
1.6 KiB
Gherkin
Feature: Shopping list
|
|
As a signed-in user
|
|
I want to see every ingredient needed for this week's planned recipes, already summed
|
|
So that I know what to buy without recomputing it myself
|
|
|
|
Background:
|
|
Given I am signed in as "Alice" "Martin"
|
|
And today is frozen at "2026-08-17T09:00:00.000Z"
|
|
|
|
Scenario: Nothing planned this week shows the empty message, not an error
|
|
Given the shopping list for "2026-08-17" is empty
|
|
When I visit "/liste-de-courses"
|
|
Then I should see "Aucun ingrédient à acheter pour cette semaine — ajoutez des recettes à votre planning."
|
|
|
|
Scenario: Ingredients are grouped by aisle, in canonical order, each with its summed quantity
|
|
Given the shopping list for "2026-08-17" contains:
|
|
| ingredientKey | icon | category | quantity | unitKey |
|
|
| egg | EGG | dairyAndCheese | 6 | piece |
|
|
| tomato | VEGETABLE | freshProduce | 400 | gram |
|
|
When I visit "/liste-de-courses"
|
|
Then the shopping list group "Produits frais" should appear before "Crémerie & fromage"
|
|
And the shopping list should show "Tomate" at quantity "400 g"
|
|
And the shopping list should show "Oeuf" at quantity "6 unité"
|
|
|
|
Scenario: Navigating to another week fetches and shows that week's own list
|
|
Given the shopping list for "2026-08-17" is empty
|
|
And the shopping list for "2026-08-24" contains:
|
|
| ingredientKey | icon | category | quantity | unitKey |
|
|
| onion | VEGETABLE | freshProduce | 1 | kilogram |
|
|
When I visit "/liste-de-courses"
|
|
And I click the next week arrow
|
|
Then the shopping list should show "Oignon" at quantity "1 kg"
|