Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)
Python 69.3%
TypeScript 16.7%
CSS 7.9%
JavaScript 4.7%
HTML 1.4%
1# ==============================================================================2# Author: Simon-Pierre Boucher <contact@spboucher.ai>3# File: tests/test_chownow.py4# Desc: Connecteur ChowNow (Palier 1, takeout) — parse_geo, build_options5# (graphe des modificateurs -> options §5.2), build_menu (size suffixé,6# doublons de sections écartés), prix réels non majorés.7# ==============================================================================8from restoka.connectors.chownow import build_menu, build_options, parse_geo91011def test_parse_geo():12 assert parse_geo("45.5017,-73.5673") == (45.5017, -73.5673)13 assert parse_geo("") == (None, None)14 assert parse_geo("n/a") == (None, None)151617def test_build_options_graphe_modificateurs():18 item = {"modifier_categories": [10, 99]} # 99 inconnu : ignoré19 mod_cats = {"10": {"name": "Format", "min_qty": 1, "modifiers": [1, 2, 3]}}20 mods = {"1": {"name": "10 pouces", "price": 0},21 "2": {"name": "14 pouces", "price": 6.0},22 "3": {"name": "", "price": 1.0}} # sans nom : écarté23 opts = build_options(item, mod_cats, mods)24 assert len(opts) == 125 assert opts[0]["group"] == "Format" and opts[0]["required"] is True26 assert opts[0]["choices"] == [27 {"name": "10 pouces", "price_delta": 0.0},28 {"name": "14 pouces", "price_delta": 6.0}]293031PAYLOAD = {32 "menu_categories": [33 {"name": "Pizzas", "items": [34 {"name": "Margherita", "description": "Tomate, basilic",35 "price": 16.5, "size": "Regular",36 "modifier_categories": [10]},37 {"name": "Végé", "price": 18.0, "size": "14 pouces"},38 ]},39 {"name": "Pizzas", "items": [{"name": "Dup", "price": 1.0}]},40 {"name": "", "items": [{"name": "Orphelin", "price": 2.0}]},41 ],42 "modifier_categories": [43 {"id": 10, "name": "Croûte", "min_qty": 0, "modifiers": [1]}],44 "modifiers": [{"id": 1, "name": "Sans gluten", "price": 3.0}],45}464748def test_build_menu():49 m = build_menu(PAYLOAD, "2026-08-25T00:00:00Z")50 assert m["price_context"] == "takeout" and m["price_source"] == "chownow"51 assert len(m["sections"]) == 1 # doublon + sans-nom écartés52 items = m["sections"][0]["items"]53 assert items[0]["name"] == "Margherita" # size Regular : pas suffixé54 assert items[0]["price"] == 16.5055 assert items[0]["options"][0]["group"] == "Croûte"56 assert items[0]["options"][0]["required"] is False57 assert items[1]["name"] == "Végé (14 pouces)" # size suffixé au nom58 assert build_menu({}, "x") is None59