technova-api / tests /test_database.py
SteGONZALEZ's picture
commentaires dans les tests
6d68c0d
Raw
History Blame Contribute Delete
2.07 kB
"""
Il y a 2 tests :
Vérifier que si DATABASE_URL n’est pas défini, ton module app.database utilise une URL SQLite par défaut.
Vérifier que get_db() ferme bien la session (appel à close()), même quand on utilise un faux objet.
"""
import importlib
import sys
# On doit recharger le module database pour que les changements d'environnement soient pris en compte
def reload_database_module(monkeypatch, database_url: str | None):
if database_url is None:
monkeypatch.delenv("DATABASE_URL", raising=False)
else:
monkeypatch.setenv("DATABASE_URL", database_url)
# On supprime le module de sys.modules pour forcer son rechargement, ce qui permet de s'assurer
# que les changements d'environnement sont pris en compte lors de l'importation du module.
sys.modules.pop("app.database", None)
import app.database # noqa: F401
return importlib.reload(app.database)
# tester que si DATABASE_URL n'est pas défini, le module database utilise une URL SQLite en mémoire par défaut.
def test_database_defaults_to_sqlite_memory_when_env_missing(monkeypatch):
db = reload_database_module(monkeypatch, None)
assert hasattr(db, "DATABASE_URL")
assert db.DATABASE_URL.startswith("sqlite+pysqlite:///")
# tester que si DATABASE_URL est défini, le module database l'utilise.
# Ici on ne teste pas la connexion à la DB, juste que la variable est bien prise en compte.
def test_get_db_closes_session(monkeypatch):
db = reload_database_module(monkeypatch, "sqlite+pysqlite:///:memory:")
class FakeSession:
def __init__(self):
self.closed = False
def close(self):
self.closed = True
fake_session = FakeSession()
# On remplace SessionLocal par une fonction qui retourne notre FakeSession
monkeypatch.setattr(db, "SessionLocal", lambda: fake_session)
gen = db.get_db()
session = next(gen)
assert session is fake_session
# Ferme le generator => déclenche finally => close()
gen.close()
assert fake_session.closed is True