Spaces:
Sleeping
Sleeping
| """ | |
| 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 | |