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_ethics.py4# Desc: Contrôle éthique automatisé (§18) — aucune donnée privée en base,5# régime des mineurs, opt-out persistant et respecté6# ==============================================================================7import json89from creaka import db, ethics10from creaka.identity import account11from creaka.schema import Creator121314def _creator(name, accounts, **kw):15 return Creator(source="test", external_id="", display_name=name,16 platforms=accounts, **kw).finalize()171819def test_scrub_donnees_privees():20 cr = _creator("Nom Public", [account("instagram", "nompublic", "listes_medias")],21 bio="Rejoins-moi au 514 555-1234 ou perso@gmail.com, "22 "123, rue Exemple app. 4")23 ethics.scrub(cr)24 assert "514" not in cr.bio25 assert "@gmail" not in cr.bio26 assert "rue Exemple" not in cr.bio272829def test_courriel_perso_jamais_conserve():30 cr = _creator("Nom Public", [account("instagram", "nompublic", "listes_medias")],31 business_contact="perso@hotmail.com")32 ethics.scrub(cr)33 assert cr.business_contact is None34 cr2 = _creator("Nom Public", [account("instagram", "nompublic", "listes_medias")],35 business_contact="booking@agence-exemple.ca")36 ethics.scrub(cr2)37 assert cr2.business_contact == "booking@agence-exemple.ca" # pro affiché → OK383940def test_regime_mineur():41 cr = _creator("Jeune Créateur", [account("tiktok", "jeune", "listes_medias")],42 is_minor=True, region="Montréal", city="Montréal",43 business_contact="pro@agence.ca")44 ethics.scrub(cr)45 assert cr.business_contact is None46 assert cr.region is None and cr.city is None474849def test_optout_persistant_et_exclu(tmp_path, monkeypatch):50 monkeypatch.setattr(ethics, "OPTOUT_PATH", tmp_path / "optout.json")51 monkeypatch.setattr(ethics, "OPTOUT_REQUESTS_PATH", tmp_path / "req.jsonl")52 con = db.connect(tmp_path / "test.db")53 cr = _creator("Créatrice Retrait",54 [account("instagram", "retrait.exemple", "listes_medias")])55 db.sync_source(con, "test", [cr])56 assert db.search(con, q="retrait")["total"] == 157 # demande de retrait → masquée immédiatement58 ethics.add_optout(account="instagram:retrait.exemple", reason="test")59 assert db.apply_optout(con, account="instagram:retrait.exemple") == 160 assert db.search(con, q="retrait")["total"] == 061 # ré-agrégation future → JAMAIS réintégrée (liste de suppression, §15)62 cr2 = _creator("Créatrice Retrait",63 [account("instagram", "retrait.exemple", "link_in_bio")])64 stats = db.sync_source(con, "test", [cr2])65 assert stats["optout_skipped"] == 166 assert db.search(con, q="retrait")["total"] == 067 persisted = json.loads((tmp_path / "optout.json").read_text())68 assert "instagram:retrait.exemple" in persisted["accounts"]697071def test_mineurs_exclus_de_lannuaire_public(tmp_path):72 con = db.connect(tmp_path / "test2.db")73 cr = _creator("Jeune Vedette", [account("tiktok", "jeunevedette", "listes_medias")],74 is_minor=True)75 db.sync_source(con, "test", [cr])76 assert db.search(con)["total"] == 0 # prudence extrême §1577