Lebensmittel oder Rezept wählbar; gemappte Zutaten werden übernommen, offene erscheinen in der Liste. Dazu Fettgehalt-Suche, EPA-Stoffe, Rezept-CRUD und Wechsel bestehender Zuordnungen. Co-authored-by: Cursor <cursoragent@cursor.com>
58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
from decimal import Decimal
|
|
from uuid import uuid4
|
|
|
|
from data_layer.food_knowledge import (
|
|
BUNDLE_FORMAT,
|
|
_jsonable,
|
|
parse_food_knowledge_bundle,
|
|
portable_mapping,
|
|
)
|
|
|
|
|
|
def test_parse_rejects_unknown_format():
|
|
try:
|
|
parse_food_knowledge_bundle({"format": "other", "version": 1})
|
|
except ValueError as e:
|
|
assert "Mitai-Zuordnungsdatei" in str(e)
|
|
else:
|
|
raise AssertionError("expected ValueError")
|
|
|
|
|
|
def test_parse_accepts_bundle():
|
|
data = parse_food_knowledge_bundle({
|
|
"format": BUNDLE_FORMAT,
|
|
"version": 1,
|
|
"mappings": [],
|
|
"recipes": [],
|
|
})
|
|
assert data["version"] == 1
|
|
|
|
|
|
def test_portable_mapping_drops_ids():
|
|
row = portable_mapping({
|
|
"id": 99,
|
|
"food_id": "uuid-here",
|
|
"source_system": "fddb",
|
|
"source_name_raw": "Haferflocken, Großblatt",
|
|
"source_name_normalized": "haferflocken großblatt",
|
|
"bls_code": "C131000",
|
|
"food_name_de": "Hafer roh",
|
|
"catalog_kind": "official_bls",
|
|
"external_key": None,
|
|
})
|
|
assert "id" not in row
|
|
assert "food_id" not in row
|
|
assert row["bls_code"] == "C131000"
|
|
assert row["source_name_raw"] == "Haferflocken, Großblatt"
|
|
|
|
|
|
def test_jsonable_export_types():
|
|
payload = _jsonable({
|
|
"grams": Decimal("1.50"),
|
|
"id": uuid4(),
|
|
"nested": [Decimal("2")],
|
|
})
|
|
assert isinstance(payload["grams"], float)
|
|
assert isinstance(payload["id"], str)
|
|
assert payload["nested"] == [2.0]
|