Créa·Ka — annuaire public cross-plateforme des créateurs de contenu québécois (crea-ka.com)
Python 73.6%
HTML 13.2%
TypeScript 6%
JavaScript 4.5%
CSS 1.7%
Dockerfile 0.6%
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