# Trouve-KA — tests de canonicalisation d'URL # Author: Simon-Pierre Boucher # Contact: contact@spboucher.ai from trouveka.shared import canonicalize_url, display_url, extract_domain def test_removes_fragment_and_default_port(): assert canonicalize_url("https://quebec.ca:443/services#section") == "https://quebec.ca/services" assert canonicalize_url("http://quebec.ca:80/") == "http://quebec.ca/" def test_preserves_non_default_port(): assert canonicalize_url("http://example.qc.ca:8080/x") == "http://example.qc.ca:8080/x" def test_lowercases_host_but_preserves_path_case(): assert canonicalize_url("HTTPS://WWW.Quebec.CA/Services/PDF") == "https://www.quebec.ca/Services/PDF" def test_strips_tracking_params_only(): url = "https://ledevoir.com/a?utm_source=fb&fbclid=xyz&id=42&gclid=1" assert canonicalize_url(url) == "https://ledevoir.com/a?id=42" def test_preserves_unknown_params_and_order(): # Deux ressources distinctes ne doivent jamais fusionner : ordre préservé assert canonicalize_url("https://x.ca/p?b=2&a=1") == "https://x.ca/p?b=2&a=1" assert canonicalize_url("https://x.ca/p?a=1&b=2") == "https://x.ca/p?a=1&b=2" def test_rejects_non_http_schemes(): assert canonicalize_url("file:///etc/passwd") is None assert canonicalize_url("javascript:alert(1)") is None assert canonicalize_url("ftp://x.ca/f") is None def test_relative_resolution(): assert canonicalize_url("../b", base="https://x.ca/a/c/") == "https://x.ca/a/b" def test_collapses_duplicate_slashes(): assert canonicalize_url("https://x.ca//a///b") == "https://x.ca/a/b" def test_extract_domain_strips_www(): assert extract_domain("https://www.quebec.ca/services") == "quebec.ca" assert extract_domain("https://ici.radio-canada.ca/n") == "ici.radio-canada.ca" def test_display_url_breadcrumb(): crumb = display_url("https://www.quebec.ca/services/permis/conduire") assert crumb.startswith("quebec.ca › services › permis")