Files
cookbook/scripts/test_shopping_enhancements.py

115 lines
5.2 KiB
Python

# -*- 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!")