# ============================================================================== # Author: Simon-Pierre Boucher # File: tests/test_identity.py # Desc: Tests de résolution d'identité & déduplication — cas multi-plateformes # + cas-pièges d'HOMONYMES à ne jamais fusionner (§12, §18) # ============================================================================== from creaka.dedup import dedupe, merge_creators, should_merge from creaka.identity import account, merge_accounts from creaka.schema import Creator def _creator(name, accounts, **kw): return Creator(source="test", external_id="", display_name=name, platforms=accounts, **kw).finalize() def test_homonymes_jamais_fusionnes(): """Deux personnes au même nom SANS compte partagé → deux fiches (§12.2).""" a = _creator("Alex Tremblay", [account("instagram", "alex.gaming", "listes_medias")]) b = _creator("Alex Tremblay", [account("instagram", "alexcuisine", "listes_medias")]) assert not should_merge(a, b) assert len(dedupe([a, b])) == 2 def test_fusion_sur_compte_fort_partage(): a = _creator("Nom Scène", [account("instagram", "nomscene", "listes_medias"), account("youtube", "nomscene", "listes_medias")]) b = _creator("Nom Scene", [account("instagram", "nomscene", "link_in_bio"), account("twitch", "nomscene_tv", "link_in_bio")]) assert should_merge(a, b) merged = dedupe([a, b]) assert len(merged) == 1 keys = {acc.key for acc in merged[0].platforms} # union : on ne perd AUCUN lien vérifié assert keys == {"instagram:nomscene", "youtube:nomscene", "twitch:nomscene_tv"} def test_pas_de_fusion_sur_compte_faible(): """Un compte partagé à confiance basse ne suffit pas (sous STRONG_THRESHOLD).""" a = _creator("Personne Un", [account("instagram", "commun", "mention"), account("youtube", "personneun", "listes_medias")]) b = _creator("Personne Deux", [account("instagram", "commun", "mention"), account("tiktok", "personnedeux", "listes_medias")]) assert not should_merge(a, b) def test_merge_accounts_meilleure_confiance(): old = [account("instagram", "nom", "handle_match", followers=1000).finalize()] new = [account("instagram", "nom", "link_in_bio").finalize()] merged = merge_accounts(old, new) assert len(merged) == 1 assert merged[0].confidence == 0.95 # link_in_bio gagne assert merged[0].followers == 1000 # métrique conservée def test_merge_creators_regime_mineur_et_optout(): a = _creator("Jeune Talent", [account("tiktok", "jeune", "listes_medias")], region="Montréal", city="Montréal") b = _creator("Jeune Talent", [account("tiktok", "jeune", "link_in_bio")], is_minor=True) merged = merge_creators(a, b) assert merged.is_minor is True assert merged.region is None and merged.city is None # régime restreint §15