# -*- coding: utf-8 -*- import sys import os # Project root sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import app.ingredients as ing import app.database as db def test_ingredient_cleaning_and_keys(): print("--- 1. Testing clean_ingredient_name & get_ingredient_key ---") assert ing.clean_ingredient_name("Karotten (in Scheiben)") == "Karotten" assert ing.clean_ingredient_name("• Eier (Größe M)") == "Eier" assert ing.clean_ingredient_name("Zwiebeln, fein gewürfelt") == "Zwiebeln" assert ing.clean_ingredient_name("frische Kresse") == "Frische Kresse" assert ing.get_ingredient_key("Karotten") == "karotte" assert ing.get_ingredient_key("Möhren") == "karotte" assert ing.get_ingredient_key("Karotten (in Scheiben geschnitten)") == "karotte" assert ing.get_ingredient_key("Zwiebeln") == "zwiebel" assert ing.get_ingredient_key("Zwiebel") == "zwiebel" assert ing.get_ingredient_key("Knoblauchzehen") == "knoblauch" assert ing.get_ingredient_key("Eier") == "ei" assert ing.get_ingredient_key("Äpfel") == "apfel" assert ing.get_ingredient_key("Apfel") == "apfel" print("[OK] Cleaning & keys test passed!") def test_amount_addition(): print("--- 2. Testing add_ingredient_amounts ---") # Weights amt, u = ing.add_ingredient_amounts("500", "g", "300", "g") assert amt == "800" and u == "g", f"Got {amt} {u}" amt, u = ing.add_ingredient_amounts("500", "g", "1", "kg") assert amt == "1,5" and u == "kg", f"Got {amt} {u}" # Volumes amt, u = ing.add_ingredient_amounts("200", "ml", "800", "ml") assert amt == "1" and u == "l", f"Got {amt} {u}" # Spoons amt, u = ing.add_ingredient_amounts("2", "EL", "3", "EL") assert amt == "5" and u == "EL", f"Got {amt} {u}" # Pieces / No unit amt, u = ing.add_ingredient_amounts("2", "", "3", "") assert amt == "5" and u == "", f"Got {amt} {u}" # Plural units amt, u = ing.add_ingredient_amounts("1", "Dose", "2", "Dosen") assert amt == "3" and u == "Dosen", f"Got {amt} {u}" amt, u = ing.add_ingredient_amounts("1", "Zehe", "2", "Zehen") assert amt == "3" and u == "Zehen", f"Got {amt} {u}" # Incompatible amt, u = ing.add_ingredient_amounts("1", "Bund", "500", "g") assert "1 Bund" in amt and "500 g" in amt and u == "", f"Got {amt} {u}" print("[OK] Amount additions test passed!") def test_category_guessing(): print("--- 3. Testing guess_category_for_ingredient ---") assert db.guess_category_for_ingredient("Kresse") == "Obst & Gemüse" assert db.guess_category_for_ingredient("1 Kästchen Kresse") == "Obst & Gemüse" assert db.guess_category_for_ingredient("Edamame (TK)") == "Tiefkühl" or db.guess_category_for_ingredient("Edamame") == "Obst & Gemüse" assert db.guess_category_for_ingredient("Edamame") == "Obst & Gemüse" assert db.guess_category_for_ingredient("Bergkäse (gerieben)") == "Kühlregal & Käse" assert db.guess_category_for_ingredient("Tofu") == "Kühlregal & Käse" assert db.guess_category_for_ingredient("Ahornsirup") == "Vorrat & Nudeln" assert db.guess_category_for_ingredient("Toffifee") == "Vorrat & Nudeln" assert db.guess_category_for_ingredient("Olivenöl") == "Gewürze & Öle" assert db.guess_category_for_ingredient("Möhren") == "Obst & Gemüse" print("[OK] Category guessing test passed!") def test_db_aggregation_and_sources(): print("--- 4. Testing DB aggregation & sources merging ---") # Clean previous test entries db.execute_query("DELETE FROM shopping_list WHERE item_name LIKE ?", ("Test-%",), fetch="none", commit=True) batch = [ {"item_name": "Test-Karotten (in Scheiben)", "amount": "400", "unit": "g", "source": "Rezept A"}, {"item_name": "Test-Karotten", "amount": "600", "unit": "g", "source": "Rezept B"}, ] count = db.add_shopping_items_bulk(batch) rows = db.execute_query("SELECT * FROM shopping_list WHERE item_name = 'Test-Karotten'", fetch="all") assert len(rows) == 1, f"Expected 1 aggregated row, got {len(rows)}" row = rows[0] assert row["amount"] == "1" and row["unit"] == "kg", f"Expected 1 kg, got {row['amount']} {row['unit']}" assert "Rezept A" in row["source"] and "Rezept B" in row["source"], f"Sources not merged: {row['source']}" assert row["category"] == "Obst & Gemüse", f"Expected Obst & Gemüse, got {row['category']}" # Clean up db.execute_query("DELETE FROM shopping_list WHERE item_name LIKE ?", ("Test-%",), fetch="none", commit=True) print("[OK] DB aggregation test passed!") def test_learning_categories(): print("--- 5. Testing category learning & override ---") db.save_ingredient_category_mapping("Test-Superfood", "Tiefkühl") guessed = db.guess_category_for_ingredient("Test-Superfood") assert guessed == "Tiefkühl", f"Expected Tiefkühl, got {guessed}" # Clean up db.execute_query("DELETE FROM ingredient_category_mappings WHERE ingredient_name = ?", ("test-superfood",), fetch="none", commit=True) print("[OK] Category learning test passed!") if __name__ == "__main__": test_ingredient_cleaning_and_keys() test_amount_addition() test_category_guessing() test_db_aggregation_and_sources() test_learning_categories() print("\nALL TESTS PASSED SUCCESSFULLY!")