Spaces:
Runtime error
Runtime error
File size: 3,950 Bytes
6e91d61 7cf23f7 6e91d61 7cf23f7 6e91d61 7cf23f7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | """
Tests de scripts/create_admin.py : un mot de passe refuse ne s'affiche jamais.
demarrer.sh lance ce script a chaque premier deploiement, avec ADMIN_PASSWORD
du .env de production. Un mot de passe hors politique (sans majuscule, par
exemple) faisait afficher l'erreur Pydantic entiere, valeur refusee comprise :
le mot de passe en clair dans le terminal et dans la sortie du deploiement.
Usage:
pytest tests/test_scripts/test_create_admin.py -v
"""
import asyncio
import sys
import pytest
from scripts import create_admin
REFUSE = "sansmajuscule123"
@pytest.fixture
def lancer(monkeypatch):
def _lancer(*arguments):
monkeypatch.setattr(sys, "argv", ["create_admin.py", *arguments])
return asyncio.run(create_admin.main())
return _lancer
def test_un_mot_de_passe_refuse_n_est_jamais_affiche(lancer, capsys):
code = lancer("--email", "admin@jurix.cm", "--password", REFUSE)
sortie = capsys.readouterr()
assert code == 1
assert REFUSE not in sortie.out + sortie.err
assert "password" in sortie.err
assert "uppercase" in sortie.err
def test_le_refus_precede_tout_acces_a_la_base(lancer, monkeypatch):
"""
La validation echoue avant d'ouvrir une session : rien n'est ecrit.
Les appels sont COMPTES : lever une erreur depuis la doublure ne prouvait
rien, le `except Exception` du script l'avalait et rendait le meme code 1.
"""
appels = []
def interdit(*args, **kwargs):
appels.append(1)
raise AssertionError("la base ne devait pas etre ouverte")
monkeypatch.setattr(create_admin, "AsyncSessionLocal", interdit)
assert lancer("--email", "admin@jurix.cm", "--password", REFUSE) == 1
assert appels == []
VALIDE = "Valide-Essai-42"
class _CompteExistant:
def __init__(self, role):
self.role, self.is_active, self.hashed_password = role, True, "hachage-d-origine"
@pytest.fixture
def base_avec(monkeypatch):
"""Une base dont l'adresse demandee appartient deja a un compte de ce role."""
def installer(role):
compte = _CompteExistant(role)
commits = []
class Resultat:
def scalar_one_or_none(self):
return compte
class Session:
async def __aenter__(self):
return self
async def __aexit__(self, *exc):
return False
async def execute(self, *args, **kwargs):
return Resultat()
async def commit(self):
commits.append(1)
monkeypatch.setattr(create_admin, "AsyncSessionLocal", Session)
monkeypatch.setattr(create_admin, "hash_password", lambda mdp: f"hache:{mdp}")
return compte, commits
return installer
def test_un_compte_ordinaire_n_est_jamais_promu_en_silence(lancer, base_avec, capsys):
"""
Le site est public avant l'etape 6 de demarrer.sh : quiconque s'inscrivait
sous ADMIN_EMAIL devenait superadmin, avec son propre mot de passe.
"""
compte, commits = base_avec("user")
code = lancer("--email", "admin@jurix.cm", "--password", VALIDE)
assert code == 1
assert compte.role == "user"
assert commits == []
assert "--promouvoir" in capsys.readouterr().err
def test_promouvoir_remplace_le_mot_de_passe(lancer, base_avec):
compte, commits = base_avec("user")
code = lancer("--email", "admin@jurix.cm", "--password", VALIDE, "--promouvoir")
assert code == 0
assert compte.role == "superadmin"
assert compte.hashed_password == f"hache:{VALIDE}"
assert commits == [1]
def test_un_administrateur_existant_garde_son_mot_de_passe(lancer, base_avec):
"""create_admin.py ne remet jamais un mot de passe sans --reset-password."""
compte, _ = base_avec("admin")
assert lancer("--email", "admin@jurix.cm", "--password", VALIDE) == 0
assert compte.role == "superadmin"
assert compte.hashed_password == "hachage-d-origine"
|