Feature: Recipe form — associating ingredients As a signed-in user I want to build a recipe by picking ingredients, quantities, and steps So that I can save a complete recipe in one form Background: Given I am signed in as "Alice" "Martin" And my household id is 1 And the ingredient and diet catalog is available Scenario: Adds an ingredient from the picker, fills its quantity/unit, and creates the recipe Given creating the recipe will succeed and return id 42 When I visit "/recettes/nouvelle" And I fill in the "recipe-name" field with "Salade de tomates" And I search the ingredient picker for "tomat" And I select the ingredient "Tomate" from the picker Then the ingredient "Tomate" should no longer be in the picker And the recipe should include the ingredient "Tomate" When I fill in the ingredient's quantity with "3" and unit "unité" And I add a step And I fill in the step description with "Couper les tomates." Then the "Enregistrer" button should not be disabled When I click the button "Enregistrer" Then the recipe creation request should have included name "Salade de tomates", portions 4, and ingredient 1 with quantity 3 and unitId 1 And the URL should include "/recettes/42" # Regression test for the exact bug reported: `crypto.randomUUID()` (used # to mint each ingredient/step draft's client-only React key) throws # outside a secure context — https, or literally the hostname `localhost` # — so a LAN IP during on-device testing or a Capacitor WebView's # `capacitor://` origin hit a black screen with "TypeError: # crypto.randomUUID is not a function" the instant an ingredient was # added. Cypress's own origin is secure, so this forces the same failure # by deleting `crypto.randomUUID` before the app boots — see # `apps/web/src/lib/client-key.ts`, which replaced it. Scenario: Still works when crypto.randomUUID is unavailable (insecure-context regression) When I visit the new recipe form without a secure random UUID And I fill in the "recipe-name" field with "Recette hors contexte sécurisé" And I select the ingredient "Tomate" from the picker And I select the ingredient "Oeuf" from the picker Then there should be 2 ingredient rows And the recipe should include the ingredient "Tomate" And the recipe should include the ingredient "Oeuf" When I add a step And I add a step Then there should be 2 step editor items Scenario: Excludes an already-selected ingredient from the picker, and removing it brings it back When I visit "/recettes/nouvelle" And I select the ingredient "Carotte" from the picker Then the ingredient "Carotte" should no longer be in the picker When I remove the ingredient "Carotte" from the recipe Then the ingredient "Carotte" should be visible in the picker And there should be 0 ingredient rows Scenario: Preloads an existing recipe's ingredients when editing, and lets you add another Given recipe 7 exists with an egg omelette And updating recipe 7 will succeed When I visit "/recettes/7/modifier" Then the recipe should include the ingredient "Oeuf" And the ingredient's quantity should be "3" When I select the ingredient "Tomate" from the picker Then there should be 2 ingredient rows When I fill in the last ingredient's quantity with "1" and unit "unité" And I click the button "Enregistrer" Then the recipe update request should have included these ingredients: | ingredientId | quantity | unitId | | 2 | 3 | 1 | | 1 | 1 | 1 |