# ============================================================================== # Author: Simon-Pierre Boucher # File: tests/test_permits.py # Desc: Enrichissement RACJ (permis d'alcool) — regroupement des lignes CSV # par établissement, croisement CONSERVATEUR avec les restaurants # (nom+lieu, adresse+nom, jamais de fusion hasardeuse) et écriture # de details.permis_alcool. Tout HORS LIGNE (aucun téléchargement). # ============================================================================== import json from restoka import permits from restoka import db as rdb from restoka.schema import Restaurant RECORDS = [ { # établissement 1 : deux lignes (salle + terrasse), deux permis "NoEtablissement": "22723", "RaisonSociale": "Chez Mamy", "Titulaire": "9312-5581 Québec Inc.", "Neq": "1170486295", "Adresse": "1999 Rue Sainte-Famille ", "CodeVille": "94068", "Ville": "Saguenay", "CodePostal": "G7X4X5", "RegAdmin": "02", "NoPermis": "100000067-1", "Categorie": "Restaurant pour vendre", "TypeLocal": "Autre", "Capacite": "80", }, { "NoEtablissement": "22723", "RaisonSociale": "Chez Mamy", "Titulaire": "9312-5581 Québec Inc.", "Neq": "1170486295", "Adresse": "1999 Rue Sainte-Famille ", "CodeVille": "94068", "Ville": "Saguenay", "CodePostal": "G7X4X5", "RegAdmin": "02", "NoPermis": "100000068-1", "Categorie": "Bar", "TypeLocal": "Terrasse", "Capacite": "40", }, { # établissement 2 : croisement par postal + civique + nom similaire "NoEtablissement": "31000", "RaisonSociale": "Resto-Bar Pizza Bella", "Titulaire": "Gestion Pizza Bella Inc.", "Neq": "", "Adresse": "300 Rue Principale", "CodeVille": "23027", "Ville": "Québec", "CodePostal": "G1K3Y2", "RegAdmin": "03", "NoPermis": "200000001-1", "Categorie": "Restaurant pour servir", "TypeLocal": "Autre", "Capacite": "120", }, { # piège : homonyme dans une AUTRE ville — ne doit RIEN croiser "NoEtablissement": "40000", "RaisonSociale": "Chez Mamy", "Titulaire": "8888-0000 Québec Inc.", "Neq": "", "Adresse": "714 Rang Ouest", "CodeVille": "11111", "Ville": "Saint-Jean-de-Dieu", "CodePostal": "G0L3M0", "RegAdmin": "01", "NoPermis": "300000001-1", "Categorie": "Bar", "TypeLocal": "Autre", "Capacite": "60", }, ] def _seed(con): restos = [ Restaurant(source="osm", external_id="node/1", name="Chez Mamy", address="1999 Rue Sainte-Famille", city="Saguenay", postal_code="G7X 4X5", lat=48.42, lng=-71.06), Restaurant(source="osm", external_id="node/2", name="Bella Pizza Resto", address="300 Rue Principale", city="Québec", postal_code="G1K 3Y2", lat=46.81, lng=-71.21), # piège : même nom mais autre ville (le permis 40000 ne doit pas venir ici) Restaurant(source="osm", external_id="node/3", name="Chez Mamy", address="12 Rue Untel", city="Gatineau", postal_code="J8X 1A1", lat=45.47, lng=-75.70), ] rdb.sync_source(con, "osm", [r.finalize() for r in restos]) def test_group_establishments(): ests = permits.group_establishments(RECORDS) assert len(ests) == 3 e = next(x for x in ests if x["no"] == "22723") assert e["categories"] == {"Restaurant pour vendre", "Bar"} assert e["capacite"] == 120 # 80 + 40 (salle + terrasse) assert len(e["permis"]) == 2 assert e["postal"] == "G7X4X5" def test_match_conservateur(con): _seed(con) stats = permits.match(con, permits.group_establishments(RECORDS)) assert stats["matched"] == 2 and stats["with_permit"] == 2 # nom+lieu -> le Chez Mamy de Saguenay, jamais celui de Gatineau d1 = json.loads(con.execute( "SELECT details FROM restaurants WHERE uid='osm:node/1'") .fetchone()["details"]) pa = d1["permis_alcool"] assert pa["categories"] == ["Bar", "Restaurant pour vendre"] assert pa["capacite"] == 120 and pa["nb_permis"] == 2 assert pa["matched_by"] == "nom+lieu" # adresse+nom (CP + civique + token « pizza/bella » partagé) d2 = json.loads(con.execute( "SELECT details FROM restaurants WHERE uid='osm:node/2'") .fetchone()["details"]) assert d2["permis_alcool"]["matched_by"] == "adresse+nom" assert d2["permis_alcool"]["categories"] == ["Restaurant pour servir"] # l'homonyme d'une autre ville n'est PAS épinglé sur le resto de Gatineau d3 = json.loads(con.execute( "SELECT details FROM restaurants WHERE uid='osm:node/3'") .fetchone()["details"] or "{}") assert "permis_alcool" not in d3