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.0 KB · 64 lines python
Raw Blame History
1# ==============================================================================2# Author: Simon-Pierre Boucher <contact@spboucher.ai>3# File:   tests/test_identity.py4# Desc:   Tests de résolution d'identité & déduplication — cas multi-plateformes5#         + cas-pièges d'HOMONYMES à ne jamais fusionner (§12, §18)6# ==============================================================================7from creaka.dedup import dedupe, merge_creators, should_merge8from creaka.identity import account, merge_accounts9from creaka.schema import Creator101112def _creator(name, accounts, **kw):13    return Creator(source="test", external_id="", display_name=name,14                   platforms=accounts, **kw).finalize()151617def test_homonymes_jamais_fusionnes():18    """Deux personnes au même nom SANS compte partagé → deux fiches (§12.2)."""19    a = _creator("Alex Tremblay", [account("instagram", "alex.gaming", "listes_medias")])20    b = _creator("Alex Tremblay", [account("instagram", "alexcuisine", "listes_medias")])21    assert not should_merge(a, b)22    assert len(dedupe([a, b])) == 2232425def test_fusion_sur_compte_fort_partage():26    a = _creator("Nom Scène", [account("instagram", "nomscene", "listes_medias"),27                               account("youtube", "nomscene", "listes_medias")])28    b = _creator("Nom Scene", [account("instagram", "nomscene", "link_in_bio"),29                               account("twitch", "nomscene_tv", "link_in_bio")])30    assert should_merge(a, b)31    merged = dedupe([a, b])32    assert len(merged) == 133    keys = {acc.key for acc in merged[0].platforms}34    # union : on ne perd AUCUN lien vérifié35    assert keys == {"instagram:nomscene", "youtube:nomscene", "twitch:nomscene_tv"}363738def test_pas_de_fusion_sur_compte_faible():39    """Un compte partagé à confiance basse ne suffit pas (sous STRONG_THRESHOLD)."""40    a = _creator("Personne Un", [account("instagram", "commun", "mention"),41                                 account("youtube", "personneun", "listes_medias")])42    b = _creator("Personne Deux", [account("instagram", "commun", "mention"),43                                   account("tiktok", "personnedeux", "listes_medias")])44    assert not should_merge(a, b)454647def test_merge_accounts_meilleure_confiance():48    old = [account("instagram", "nom", "handle_match", followers=1000).finalize()]49    new = [account("instagram", "nom", "link_in_bio").finalize()]50    merged = merge_accounts(old, new)51    assert len(merged) == 152    assert merged[0].confidence == 0.95      # link_in_bio gagne53    assert merged[0].followers == 1000       # métrique conservée545556def test_merge_creators_regime_mineur_et_optout():57    a = _creator("Jeune Talent", [account("tiktok", "jeune", "listes_medias")],58                 region="Montréal", city="Montréal")59    b = _creator("Jeune Talent", [account("tiktok", "jeune", "link_in_bio")],60                 is_minor=True)61    merged = merge_creators(a, b)62    assert merged.is_minor is True63    assert merged.region is None and merged.city is None  # régime restreint §1564