# Test Ingredient Composition Endpoints ## 1. Add Compositions (Bulk) ```bash POST http://localhost:4000/api/v1/ingredients/{ingredient_id}/compositions Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZW1haWwiOiJhZG1pbkBnb2t1bmEuaWQiLCJyb2xlIjoiYWRtaW4iLCJvcmdhbml6YXRpb25faWQiOiIwMzIwNWQ4Zi0yYzA2LTQ1MTMtYTk1Mi0yMWQxMTA5Zjc4ZmYiLCJpc3MiOiJhcHNrZWwtcG9zIiwic3ViIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZXhwIjoxNzg1OTE0ODQ4LCJuYmYiOjE3NzcyNzQ4NDgsImlhdCI6MTc3NzI3NDg0OH0.prO4mU1zjVUZLgi5c8hj10A6ODETCMjnEP8wUQikZ30 Content-Type: application/json { "compositions": [ { "child_ingredient_id": "CHILD_INGREDIENT_UUID_1", "quantity": 2.5 }, { "child_ingredient_id": "CHILD_INGREDIENT_UUID_2", "quantity": 1.0 } ] } ``` **Expected Response:** ```json { "success": true, "data": { "parent_ingredient": { "id": "uuid", "name": "Semi-Finished Product", "cost": 15.50, "compositions": [...] }, "compositions": [ { "id": "COMPOSITION_ID_1", "child_ingredient_id": "...", "quantity": 2.5, "child_ingredient": {...}, "parent_ingredient": {...} } ] } } ``` ## 2. Update Composition ```bash PUT http://localhost:4000/api/v1/ingredients/compositions/{composition_id} Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZW1haWwiOiJhZG1pbkBnb2t1bmEuaWQiLCJyb2xlIjoiYWRtaW4iLCJvcmdhbml6YXRpb25faWQiOiIwMzIwNWQ4Zi0yYzA2LTQ1MTMtYTk1Mi0yMWQxMTA5Zjc4ZmYiLCJpc3MiOiJhcHNrZWwtcG9zIiwic3ViIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZXhwIjoxNzg1OTE0ODQ4LCJuYmYiOjE3NzcyNzQ4NDgsImlhdCI6MTc3NzI3NDg0OH0.prO4mU1zjVUZLgi5c8hj10A6ODETCMjnEP8wUQikZ30 Content-Type: application/json { "quantity": 3.5 } ``` **Expected Response:** ```json { "success": true, "data": { "id": "composition_id", "child_ingredient_id": "...", "quantity": 3.5, "child_ingredient": {...}, "parent_ingredient": { "id": "...", "cost": 18.75, "compositions": [...] } } } ``` ## 3. Delete Composition ```bash DELETE http://localhost:4000/api/v1/ingredients/compositions/{composition_id} Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZW1haWwiOiJhZG1pbkBnb2t1bmEuaWQiLCJyb2xlIjoiYWRtaW4iLCJvcmdhbml6YXRpb25faWQiOiIwMzIwNWQ4Zi0yYzA2LTQ1MTMtYTk1Mi0yMWQxMTA5Zjc4ZmYiLCJpc3MiOiJhcHNrZWwtcG9zIiwic3ViIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZXhwIjoxNzg1OTE0ODQ4LCJuYmYiOjE3NzcyNzQ4NDgsImlhdCI6MTc3NzI3NDg0OH0.prO4mU1zjVUZLgi5c8hj10A6ODETCMjnEP8wUQikZ30 ``` **Expected Response:** ```json { "success": true, "data": { "id": "parent_ingredient_id", "name": "Semi-Finished Product", "cost": 12.25, "compositions": [ // remaining compositions after deletion ] } } ``` ## Steps to Test: 1. **Get a semi-finished ingredient ID** (or create one first) 2. **Get child ingredient IDs** (raw ingredients to add as compositions) 3. **Add compositions** using the bulk endpoint 4. **Copy composition ID** from the response 5. **Update or Delete** using that composition ID ## cURL Commands: ### Delete Composition: ```bash curl --request DELETE \ --url 'http://localhost:4000/api/v1/ingredients/compositions/YOUR_COMPOSITION_ID_HERE' \ --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZW1haWwiOiJhZG1pbkBnb2t1bmEuaWQiLCJyb2xlIjoiYWRtaW4iLCJvcmdhbml6YXRpb25faWQiOiIwMzIwNWQ4Zi0yYzA2LTQ1MTMtYTk1Mi0yMWQxMTA5Zjc4ZmYiLCJpc3MiOiJhcHNrZWwtcG9zIiwic3ViIjoiNmM2ZDI0MjAtNzA0MS00ZWE5LWE3MjYtYTM0MDAxNGJiMjRkIiwiZXhwIjoxNzg1OTE0ODQ4LCJuYmYiOjE3NzcyNzQ4NDgsImlhdCI6MTc3NzI3NDg0OH0.prO4mU1zjVUZLgi5c8hj10A6ODETCMjnEP8wUQikZ30' ``` ## Notes: - Replace `{ingredient_id}` with actual parent ingredient UUID - Replace `{composition_id}` with actual composition UUID - Replace `CHILD_INGREDIENT_UUID_1` and `CHILD_INGREDIENT_UUID_2` with actual child ingredient UUIDs - Parent ingredient must have `is_semi_finished: true` - All responses now include the updated parent ingredient with recalculated cost