import unittest from fastapi.testclient import TestClient import main from db import connect, create class TestIngredientsParseApiV2(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self): self.conn = await connect(":memory:") await create(self.conn) async def override_get_db(): try: yield self.conn finally: pass main.app.dependency_overrides[main.get_db] = override_get_db self.client = TestClient(main.app) async def asyncTearDown(self): await self.conn.close() main.app.dependency_overrides.clear() def test_parse_multiple_ingredients(self): params = { "ingredients": [ "14oz milk powder", "2 cups flour", "1 tsp salt", "egg", # defaults to 1 Items ] } r = self.client.get("/api/v1/recipes/ingredients/parse", params=params) assert r.status_code == 200, r.text arr = r.json() assert isinstance(arr, list) assert len(arr) == 4 # Basic shape checks for item in arr: assert "name" in item and isinstance(item["name"], str) assert "line" in item and isinstance(item["line"], str) assert "quantity" in item assert "unit" in item and isinstance(item["unit"], str) # Quantity should be a positive number assert float(item["quantity"]) > 0 # The original sentence should round-trip into line assert len(item["line"]) >= len(item["name"]) >= 1 # Spot checks for unit/quantity normalization # 14oz milk powder oz = arr[0] assert float(oz["quantity"]) == 14.0 assert oz["unit"] == "Ounce" assert "milk" in oz["name"].lower() cups = arr[1] assert float(cups["quantity"]) == 2.0 assert cups["unit"] == "Cup" assert cups["name"].lower() == "flour" tsp = arr[2] assert float(tsp["quantity"]) == 1.0 assert tsp["unit"] == "Teaspoon" assert tsp["name"].lower() == "salt" egg = arr[3] assert float(egg["quantity"]) == 1.0 assert egg["unit"] == "Items" assert egg["name"].lower() == "egg"