SPB Git forge

spb/resto-ka

Public

Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)

52commits 1branches 0releases
11.6 MBsize
maindefault branch
19 days agolast push
Python 69.3% TypeScript 16.7% CSS 7.9% JavaScript 4.7% HTML 1.4%
2.1 KB · 54 lines python
Raw Blame History
1# ==============================================================================2# Author: Simon-Pierre Boucher <contact@spboucher.ai>3# File:   tests/test_menullm.py4# Desc:   Validation aval des menus structurés par LLM — la barre de qualité5#         est STRICTE : jamais de menu douteux en base (prix implausibles6#         neutralisés, volume minimal, ratio de prix minimal).7# ==============================================================================8from restoka.menullm import validate91011def _raw(items, is_menu=True):12    return {"is_menu": is_menu,13            "sections": [{"name": "Plats", "items": items}]}141516def test_menu_valide():17    out = validate(_raw([{"name": f"Plat {i}", "price": 10.0 + i}18                         for i in range(6)]))19    assert out and len(out["sections"][0]["items"]) == 620    assert out["sections"][0]["items"][0]["price"] == 10.021    assert out["sections"][0]["items"][0]["currency"] == "CAD"222324def test_pas_un_menu():25    assert validate(_raw([{"name": "Plat", "price": 10.0}], is_menu=False)) is None26    assert validate(None) is None272829def test_trop_peu_de_prix():30    # 4 plats avec prix < minimum de 5 -> rejeté31    assert validate(_raw([{"name": f"P{i}", "price": 12.0} for i in range(4)])) is None323334def test_ratio_de_prix_insuffisant():35    items = ([{"name": f"P{i}", "price": 12.0} for i in range(5)]36             + [{"name": f"S{i}", "price": None} for i in range(10)])37    assert validate(_raw(items)) is None       # 5/15 = 33 % < 40 %383940def test_prix_implausible_neutralise():41    items = ([{"name": f"P{i}", "price": 12.0} for i in range(5)]42             + [{"name": "Erreur OCR", "price": 12345.0}])43    out = validate(_raw(items))44    assert out is not None45    bad = next(i for i in out["sections"][0]["items"] if i["name"] == "Erreur OCR")46    assert bad["price"] is None                # jamais un prix aberrant en base474849def test_nom_trop_long_ecarte():50    items = ([{"name": f"P{i}", "price": 12.0} for i in range(5)]51             + [{"name": "x" * 300, "price": 9.0}])52    out = validate(_raw(items))53    assert all(len(i["name"]) <= 120 for i in out["sections"][0]["items"])54