import datetime TODAY = datetime.date.today().isoformat() async def test_create_entry_returns_201(auth_client, diary, meal, entry_payload): response = await auth_client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json=entry_payload ) assert response.status_code == 201 async def test_create_entry_returns_correct_fields( auth_client, diary, meal, entry_payload, product ): response = await auth_client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json=entry_payload ) body = response.json() assert body["grams"] == entry_payload["grams"] assert body["product_id"] == product.id assert body["meal_id"] == meal.id assert "protein" in body assert "calories" in body async def test_create_entry_zero_grams_returns_422(auth_client, diary, meal, product): response = await auth_client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json={"grams": 0.0, "product_id": product.id}, ) assert response.status_code == 422 async def test_create_entry_negative_grams_returns_422( auth_client, diary, meal, product ): response = await auth_client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json={"grams": -10.0, "product_id": product.id}, ) assert response.status_code == 422 async def test_create_entry_increments_user_product_usage( auth_client, auth_ctx, diary, meal, entry_payload, product ): await auth_client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json=entry_payload ) await auth_client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json=entry_payload ) usage = await auth_ctx.repo.user_product_usage.get_by_user_and_product( auth_ctx.user.id, product.id ) assert usage.count == 2 async def test_create_entry_meal_not_found_returns_404( auth_client, diary, entry_payload ): response = await auth_client.post( f"/api/diary/{TODAY}/meal/99999/entry", json=entry_payload ) assert response.status_code == 404 async def test_create_entry_without_auth_returns_401( client, diary, meal, entry_payload ): response = await client.post( f"/api/diary/{TODAY}/meal/{meal.id}/entry", json=entry_payload ) assert response.status_code == 401 async def test_update_entry_returns_200(auth_client, diary, meal, entry): response = await auth_client.patch( f"/api/diary/{TODAY}/meal/{meal.id}/entry/{entry.id}", json={"grams": 200.0}, ) assert response.status_code == 200 async def test_update_entry_changes_grams(auth_client, diary, meal, entry): response = await auth_client.patch( f"/api/diary/{TODAY}/meal/{meal.id}/entry/{entry.id}", json={"grams": 200.0}, ) assert response.json()["grams"] == 200.0 async def test_update_entry_not_found_returns_404(auth_client, diary, meal): response = await auth_client.patch( f"/api/diary/{TODAY}/meal/{meal.id}/entry/99999", json={"grams": 200.0}, ) assert response.status_code == 404 async def test_delete_entry_returns_204(auth_client, diary, meal, entry): response = await auth_client.delete( f"/api/diary/{TODAY}/meal/{meal.id}/entry/{entry.id}" ) assert response.status_code == 204 async def test_delete_entry_without_auth_returns_401(client, diary, meal, entry): response = await client.delete( f"/api/diary/{TODAY}/meal/{meal.id}/entry/{entry.id}" ) assert response.status_code == 401