SPB Git forge

spb/crea-ka

Public

Créa·Ka — annuaire public cross-plateforme des créateurs de contenu québécois (crea-ka.com)

52commits 1branches 0releases
11.3 MBsize
maindefault branch
19 days agolast push
Python 73.6% HTML 13.2% TypeScript 6% JavaScript 4.5% CSS 1.7% Dockerfile 0.6%
3.5 KB · 83 lines python
Raw Blame History
1# ==============================================================================2# Author: Simon-Pierre Boucher <contact@spboucher.ai>3# File:   tests/test_normalize.py4# Desc:   Tests de normalisation — handles, URLs canoniques, niches, régions,5#         compteurs d'abonnés, taille d'audience6# ==============================================================================7from creaka.normalize import (8    audience_tier, canonical_url, clean_handle, map_niche, map_region,9    parse_count, platform_from_url,10)111213def test_clean_handle():14    assert clean_handle("@Enola.Bedard") == "enola.bedard"15    assert clean_handle("https://www.instagram.com/enola.bedard/") == "enola.bedard"16    assert clean_handle("  @Nom_Scene ") == "nom_scene"17    assert clean_handle(None) == ""181920def test_youtube_channel_id():21    # ID de chaîne : casse préservée + forme /channel/ (jamais @ucxxx minuscule)22    cid = "UCtH1VriJJmhYkGSbq_7Jhra"[:24]23    assert clean_handle(cid) == cid24    assert canonical_url("youtube", cid) == f"https://www.youtube.com/channel/{cid}"252627def test_canonical_url():28    assert canonical_url("instagram", "nom") == "https://www.instagram.com/nom/"29    assert canonical_url("tiktok", "@Nom") == "https://www.tiktok.com/@nom"30    assert canonical_url("substack", "infolettre") == "https://infolettre.substack.com"31    assert canonical_url("onlyfans", "nom") == "https://onlyfans.com/nom"32    # pas de forme canonique → repli sur l'URL source33    assert canonical_url("site-web", "x", fallback="https://exemple.com") == \34        "https://exemple.com"353637def test_platform_from_url():38    assert platform_from_url("https://www.tiktok.com/@nom") == ("tiktok", "nom")39    assert platform_from_url("https://twitter.com/nom") == ("x", "nom")40    assert platform_from_url("https://mono.substack.com") == ("substack", "mono")41    # pages génériques ≠ handles42    assert platform_from_url("https://www.instagram.com/p/abc123/") is None43    assert platform_from_url("https://www.youtube.com/watch?v=x") is None44    assert platform_from_url("https://exemple.com/page") is None454647def test_map_niche():48    assert map_niche("food") == "bouffe-resto"49    assert map_niche("Beauté") == "beaute"50    assert map_niche("fitness") == "sport-fitness"51    assert map_niche("entrepreneur") == "finance-affaires"52    assert map_niche("catégorie-inconnue") == "autre"535455def test_map_region_prudence():56    # « Québec » seul = la PROVINCE → jamais de région inférée (§7)57    assert map_region("Québec") == (None, None)58    assert map_region("Québec (ville)") == ("Capitale-Nationale", "Québec")59    assert map_region("Montréal, QC")[0] == "Montréal"60    assert map_region("Blainville, Québec")[0] == "Laurentides"61    assert map_region("Los Angeles (originaire du Québec)") == (None, None)62    assert map_region(None) == (None, None)636465def test_parse_count():66    assert parse_count("1,2 M") == 1_200_00067    assert parse_count("12.3k") == 12_30068    assert parse_count("4 567 abonnés") == 4_56769    assert parse_count("1,234,567") == 1_234_56770    assert parse_count(2600000) == 2_600_00071    assert parse_count(None) is None72    # un handle n'est JAMAIS un compteur (bug réel : « @chandrayoga-tw5bu » → 5 G)73    assert parse_count("@chandrayoga-tw5bu") is None74    assert parse_count("@nom123") is None757677def test_audience_tier():78    assert audience_tier(5_000) == "nano"79    assert audience_tier(50_000) == "micro"80    assert audience_tier(500_000) == "macro"81    assert audience_tier(2_000_000) == "mega"82    assert audience_tier(None) == "nano"83