Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 98.9%
Python 0.6%
1# -----------------------------------------------------------------------------2# Lou-Ka — Agrégateur de logements à louer (province de Québec)3# Auteur : Simon-Pierre Boucher — contact@spboucher.ai4# test_search.py : /api/search — la recherche unifiée liste + carte.5# Règle d'or : total == len(points), quelles que soient les contraintes.6# -----------------------------------------------------------------------------7import pytest8from fastapi.testclient import TestClient91011@pytest.fixture(scope="module")12def client():13 from louka import web14 return TestClient(web.app)151617def _get(client, **params):18 r = client.get("/api/search", params=params)19 assert r.status_code == 200, r.text20 return r.json()212223def test_regle_dor_total_egale_points(client):24 d = _get(client, page_size=5)25 assert d["total"] == len(d["points"])26 assert len(d["listings"]) <= 527 # points triés comme la liste : le 1er point est la 1re annonce28 if d["listings"]:29 assert d["points"][0][0] == d["listings"][0]["uid"]303132def test_bbox_restreint_et_conserve_egalite(client):33 tout = _get(client, page_size=1)34 zone = _get(client, bbox="-71.45,46.70,-71.10,46.92", page_size=1)35 assert zone["total"] <= tout["total"]36 assert zone["total"] == len(zone["points"])37 for _uid, lng, lat, _p, _v in zone["points"]:38 assert -71.45 <= lng <= -71.10 and 46.70 <= lat <= 46.92394041def test_polygone_sous_ensemble_de_son_emprise(client):42 poly = "-71.24,46.80;-71.20,46.82;-71.24,46.83"43 dedans = _get(client, poly=poly, page_size=1)44 emprise = _get(client, bbox="-71.24,46.80,-71.20,46.83", page_size=1)45 assert dedans["total"] == len(dedans["points"])46 assert dedans["total"] <= emprise["total"]474849def test_polygone_invalide(client):50 r = client.get("/api/search", params={"poly": "abc"})51 assert r.status_code == 40052 r = client.get("/api/search", params={"poly": "-71,46;-71.2,46.2"})53 assert r.status_code == 400 # 2 sommets545556def test_tris(client):57 asc = _get(client, sort="prix", page_size=10,58 bbox="-71.45,46.70,-71.10,46.92")59 prix = [p[3] for p in asc["points"] if p[3] is not None]60 assert prix == sorted(prix)61 desc = _get(client, sort="prix_desc", page_size=10,62 bbox="-71.45,46.70,-71.10,46.92")63 prix_d = [p[3] for p in desc["points"] if p[3] is not None]64 assert prix_d == sorted(prix_d, reverse=True)656667def test_tri_inconnu(client):68 r = client.get("/api/search", params={"sort": "alea"})69 assert r.status_code == 400707172def test_page_ramenee_dans_les_bornes(client):73 d = _get(client, page=99999, page_size=50,74 bbox="-71.45,46.70,-71.10,46.92")75 assert d["page"] == max(1, -(-d["total"] // 50))767778def test_include_liste_sans_points(client):79 d = _get(client, include="liste", page_size=5)80 assert d["points"] is None81 assert d["total"] > 0 or d["listings"] == []828384def test_filtre_deal_et_verdicts(client):85 d = _get(client, deal="sous", page_size=5)86 assert d["total"] == len(d["points"])87 assert all(p[4] == "s" for p in d["points"])88