diff --git a/Makefile b/Makefile index 36a27df9..af72c983 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: docs test clean fix test: - tox -e py311-dj42-sqlite_file + tox -e py-dj42-sqlite_file docs: tox -e docs diff --git a/pytest_django/plugin.py b/pytest_django/plugin.py index 8af5c1e0..285f1733 100644 --- a/pytest_django/plugin.py +++ b/pytest_django/plugin.py @@ -477,10 +477,13 @@ def get_order_number(test: pytest.Item) -> int: def pytest_unconfigure(config: pytest.Config) -> None: - if blocking_manager_key not in config.stash: - return - blocking_manager = config.stash[blocking_manager_key] - blocking_manager.unblock() + # Undo the block() in _setup_django(), if it happenned. + # It's also possible the user forgot to call restore(). + # We can warn about it, but let's just clean it up. + if blocking_manager_key in config.stash: + blocking_manager = config.stash[blocking_manager_key] + while blocking_manager.is_active: + blocking_manager.restore() @pytest.fixture(autouse=True, scope="session") @@ -845,8 +848,18 @@ def block(self) -> ContextManager[None]: return _DatabaseBlockerContextManager(self) def restore(self) -> None: + """Undo a previous call to block() or unblock(). + + Consider using block() and unblock() as context managers instead of + manually calling restore(). + """ self._dj_db_wrapper.ensure_connection = self._history.pop() + @property + def is_active(self) -> bool: + """Whether a block() or unblock() is currently active.""" + return bool(self._history) + # On Config.stash. blocking_manager_key = pytest.StashKey[DjangoDbBlocker]()