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_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