# ============================================================================== # Author: Simon-Pierre Boucher # File: tests/test_normalize.py # Desc: Tests de la couche de normalisation (dates, prix, catégories, régions) # ============================================================================== from __future__ import annotations from sortika.normalize import (clean_city, clean_text, map_categories, parse_date_iso, parse_latlng, parse_price) from sortika.regions import region_from_city, region_from_tourist from sortika.schema import Event def test_parse_date_iso(): assert parse_date_iso("2026-09-11T00:00:00") == "2026-09-11" assert parse_date_iso("2026-09-11") == "2026-09-11" assert parse_date_iso("") is None assert parse_date_iso("demain") is None assert parse_date_iso("0001-99-99") is None def test_parse_price(): assert parse_price("Gratuit") == (True, None, "Gratuit") assert parse_price("Entrée libre") == (True, None, "Entrée libre") free, amt, _ = parse_price("Adulte 25 $, enfant 12,50 $") assert free is False and amt == 12.50 assert parse_price("Payant")[0] is False assert parse_price("")[0] is None def test_map_categories(): assert map_categories(["Festival"]) == ["festival"] assert map_categories(["Manifestation sportive"]) == ["sport"] assert map_categories(["Chanson", "Sports et plein air"]) == ["musique", "sport"] assert map_categories(["Conseil et comité"]) == ["communautaire"] assert map_categories(["Zzz-inconnu"]) == ["autre"] assert map_categories([]) == ["autre"] def test_regions(): assert region_from_tourist("Cantons-de-l'Est") == "Estrie" assert region_from_tourist("Charlevoix") == "Capitale-Nationale" assert region_from_tourist("Québec") == "Capitale-Nationale" assert region_from_city("Lévis") == "Chaudière-Appalaches" assert region_from_city("Gatineau") == "Outaouais" assert region_from_city("Ville-Inconnue") == "" def test_clean(): assert clean_city("Montréal (Québec)") == "Montréal" assert clean_text("a b c") == "a b c" def test_parse_latlng(): assert parse_latlng("45.5", "-73.5") == (45.5, -73.5) assert parse_latlng("0", "0") == (None, None) assert parse_latlng(None, None) == (None, None) def test_event_finalize_and_dedup(): a = Event(source="sitq", external_id="X1", url="https://a", title=" Festival d'été ", city="Québec (Québec)", tourist_region="Québec", raw_categories=["Festival"], start_date="2026-07-01T00:00:00", price_label="Gratuit").finalize() b = Event(source="montreal", external_id="Y2", url="https://b", title="Festival d'été", city="Québec", start_date="2026-07-01").finalize() assert a.title == "Festival d'été" assert a.region == "Capitale-Nationale" assert a.categories == ["festival"] assert a.is_free is True assert a.end_date == "2026-07-01" assert a.dedup_key() == b.dedup_key()