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%
3.3 KB · 87 lines python
Raw Blame History
1# ==============================================================================2# Author: Simon-Pierre Boucher <contact@spboucher.ai>3# File:   tests/test_skip.py4# Desc:   Connecteur SkipTheDishes (enrichissement livraison) — décodage5#         __NEXT_DATA__, téléphone dans les disclaimers, locationDetails6#         « Ville, PROV, POSTAL, CAN », menu en cents -> dollars, croisement7#         CONSERVATEUR verify_partner (rejet hors-QC, téléphone ou8#         postal+civique seulement).9# ==============================================================================10import json1112from restoka.connectors.skip import (build_menu, decode_next_data,13                                     parse_location_details, partner_payload,14                                     partner_phone, verify_partner)1516PARTNER = {17    "name": "Chez Test",18    "location": "123 Rue Principale",19    "locationDetails": "Montréal, QC, H2X 1Y4, CAN",20    "disclaimerModal": {"disclaimers": [21        {"text": "Pour toute question, appelez le (514) 555-1234."},22    ]},23}2425MENU_V2 = {"categories": [26    {"name": "Poutines", "menuItems": [27        {"name": "Classique", "description": "Frites, fromage, sauce",28         "subtotal": 1250},29        {"name": "Sans prix", "subtotal": 0},30    ]},31    {"name": "", "menuItems": [{"name": "Orphelin", "subtotal": 100}]},32]}333435def test_decode_next_data_et_payload():36    state = {"props": {"pageProps": {"partner": PARTNER, "menuV2": MENU_V2}}}37    html = ('<script id="__NEXT_DATA__" type="application/json">'38            + json.dumps(state) + "</script>")39    decoded = decode_next_data(html)40    partner, menu = partner_payload(decoded)41    assert partner["name"] == "Chez Test"42    assert menu["categories"]43    assert decode_next_data("<html></html>") is None444546def test_partner_phone_et_location_details():47    assert partner_phone(PARTNER) == "+15145551234"48    assert parse_location_details("Windsor, ON, N9E 1S3, CAN") \49        == ("Windsor", "ON", "N9E1S3")50    assert parse_location_details("n'importe quoi") == ("", "", "")515253def test_build_menu_cents_vers_dollars():54    m = build_menu(MENU_V2, "2026-08-25T00:00:00Z")55    assert m["price_context"] == "delivery" and m["price_source"] == "skip"56    assert len(m["sections"]) == 1                # section sans nom écartée57    items = m["sections"][0]["items"]58    assert items[0]["price"] == 12.50             # 1250 cents59    assert items[1]["price"] is None              # subtotal 0 -> prix inconnu60    assert build_menu({}, "x") is None616263def _row(**over):64    base = {"uid": "osm:1", "name": "Chez Test",65            "address": "123 Rue Principale", "city": "Montréal",66            "postal_code": "H2X 1Y4", "phone": "514-555-1234"}67    base.update(over)68    return base697071def test_verify_partner_telephone():72    assert verify_partner(_row(), PARTNER) == "telephone"737475def test_verify_partner_postal_civique():76    assert verify_partner(_row(phone=""), PARTNER) == "postal+civique"777879def test_verify_partner_rejets():80    # hors Québec : rejet immédiat même si le téléphone matche81    hors_qc = dict(PARTNER, locationDetails="Windsor, ON, N9E 1S3, CAN")82    assert verify_partner(_row(), hors_qc) == ""83    # ni téléphone ni postal+civique : rejet84    assert verify_partner(85        _row(phone="", postal_code="G1A 1A1", address="999 Autre Rue"),86        PARTNER) == ""87