# ============================================================================== # Author: Simon-Pierre Boucher # File: tests/test_schema.py # Desc: Validation de schéma (§18) — rejet des comptes sans url/confidence, # agrégats (tier, portée, plateforme principale) # ============================================================================== import pytest from creaka.identity import account from creaka.schema import Creator, PlatformAccount def test_compte_sans_confidence_rejete(): with pytest.raises(ValueError): PlatformAccount(platform="instagram", handle="nom", url="x", confidence=None).finalize() def test_compte_sans_url_canonisable_rejete(): with pytest.raises(ValueError): PlatformAccount(platform="site-web", handle="nom", url="", confidence=0.9).finalize() def test_creator_sans_compte_valide_rejete(): with pytest.raises(ValueError): Creator(source="t", external_id="", display_name="Nom", platforms=[]).finalize() def test_agregats(): cr = Creator(source="t", external_id="", display_name="Nom Scène", platforms=[ account("instagram", "nom", "listes_medias", followers=250_000), account("tiktok", "nom", "listes_medias", followers=900_000), ]).finalize() assert cr.primary_platform == "tiktok" # plus grosse audience assert cr.total_reach == 1_150_000 assert cr.audience_tier == "macro" # basée sur la principale (900k) assert cr.external_id == "nom-scene" assert cr.languages == ["fr"] def test_dedup_intra_fiche_meilleure_confiance(): cr = Creator(source="t", external_id="", display_name="Nom", platforms=[ account("instagram", "nom", "handle_match", followers=100), account("instagram", "@NOM", "link_in_bio"), ]).finalize() assert len(cr.platforms) == 1 assert cr.platforms[0].confidence == 0.95 assert cr.platforms[0].followers == 100