Katalogsuche und Bestätigen blockieren die UI nicht mehr; offene Namen starten bei den aktuellen Tagebucheinträgen, alter Ballast bleibt unter Alle. Co-authored-by: Cursor <cursoragent@cursor.com>
66 lines
3.0 KiB
Python
66 lines
3.0 KiB
Python
from data_layer.food_suggest import collapse_key, score_name_match, suggest_batch, suggest_for_name
|
|
|
|
|
|
def test_collapse_treats_space_as_same():
|
|
assert collapse_key("Haferflocken") == collapse_key("Hafer Flocken")
|
|
|
|
|
|
def test_haferflocken_ranks_simple_name_first():
|
|
index = {
|
|
"foods": [],
|
|
"by_collapse": {},
|
|
"by_token": {},
|
|
"by_prefix": {},
|
|
"by_suffix": {},
|
|
}
|
|
simple = {"id": "1", "name_de": "Hafer Flocken", "name_en": "oat flakes", "bls_code": "C131111", "catalog_kind": "official_bls"}
|
|
dish = {"id": "2", "name_de": "Milch-Getreide-Brei, mit Haferflocken und Apfelsaft (geeignet für Beikost)", "name_en": "", "bls_code": "X", "catalog_kind": "official_bls"}
|
|
for food in (simple, dish):
|
|
food["_c"] = collapse_key(food["name_de"])
|
|
index["by_collapse"].setdefault(food["_c"], []).append(food)
|
|
index["by_prefix"].setdefault(food["_c"][:4], []).append(food)
|
|
index["by_suffix"].setdefault(food["_c"][-4:], []).append(food)
|
|
packed = suggest_for_name(index, "Haferflocken", limit=3)
|
|
assert packed["suggestions"][0]["name_de"] == "Hafer Flocken"
|
|
assert packed["suggestions"][0]["score"] >= score_name_match("Haferflocken", dish["name_de"])
|
|
|
|
|
|
def test_close_scores_are_ambiguous():
|
|
a = {"id": "1", "name_de": "Olivenöl nativ", "name_en": "", "bls_code": "A", "catalog_kind": "official_bls"}
|
|
b = {"id": "2", "name_de": "Olivenöl raffiniert", "name_en": "", "bls_code": "B", "catalog_kind": "official_bls"}
|
|
index = {"foods": [], "by_collapse": {}, "by_token": {}, "by_prefix": {}, "by_suffix": {}}
|
|
for food in (a, b):
|
|
food["_c"] = collapse_key(food["name_de"])
|
|
index["by_prefix"].setdefault(food["_c"][:4], []).append(food)
|
|
for tok in food["name_de"].lower().replace(",", "").split():
|
|
if len(tok) >= 2:
|
|
index["by_token"].setdefault(tok, []).append(food)
|
|
packed = suggest_for_name(index, "Olivenöl", limit=3)
|
|
assert packed["ambiguous"] is True
|
|
assert packed["suggestion_count"] >= 2
|
|
|
|
|
|
def test_large_prefix_bucket_keeps_exact_collapse():
|
|
index = {"foods": [], "by_collapse": {}, "by_token": {}, "by_prefix": {}, "by_suffix": {}}
|
|
target = {"id": "hit", "name_de": "Hafer Flocken", "name_en": "", "bls_code": "C", "catalog_kind": "official_bls"}
|
|
target["_c"] = collapse_key(target["name_de"])
|
|
index["by_collapse"][target["_c"]] = [target]
|
|
index["by_prefix"][target["_c"][:4]] = [target] + [
|
|
{"id": str(i), "name_de": f"Hafer Gericht {i}", "name_en": "", "_c": f"hafergericht{i}"}
|
|
for i in range(80)
|
|
]
|
|
packed = suggest_for_name(index, "Haferflocken", limit=3)
|
|
assert packed["suggestions"][0]["name_de"] == "Hafer Flocken"
|
|
|
|
|
|
def test_suggest_batch_dedupes_names():
|
|
class _Cur:
|
|
def execute(self, *args, **kwargs):
|
|
return None
|
|
def fetchall(self):
|
|
return []
|
|
|
|
out = suggest_batch(_Cur(), None, ["Haferflocken", "Haferflocken", ""], limit=2)
|
|
assert "Haferflocken" in out
|
|
assert out["Haferflocken"]["suggestions"] == []
|