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.3 KB · 77 lines python
Raw Blame History
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