"""Shared test fixtures. The autouse fixture here exists because of a real incident (2026-08-18): the `sync` CLI tests invoke the actual command, which calls `load_config()`, which calls `load_dotenv()` — so the developer's real `.env` was loaded and its `NTFY_TOPIC` used. Every `pytest` run fired real push notifications at the developer's phone, including a fabricated "3 conversations failed to export" from a fixture. Nothing appeared in the log to explain it, because the tests pass `--no-log-file`. The lesson generalises past ntfy: any test that exercises a command end to end inherits whatever is in `.env` unless the environment is neutralised first. """ import pytest @pytest.fixture(autouse=True) def _no_outbound_side_effects(monkeypatch): """Neutralise every environment variable that could reach a real service. Set to empty/unroutable values rather than deleted: `load_dotenv` is called with ``override=False``, which only skips keys **already present** in the environment. Deleting a key would let the developer's `.env` put it back. Individual tests may still `monkeypatch.setenv` these — that is how the notification tests point at a dead local port on purpose. """ # Notifications: an empty topic disables sending outright (`is_configured` # strips and checks truthiness), and the server is pointed at a closed port # so even a test that sets its own topic cannot reach the internet. monkeypatch.setenv("NTFY_TOPIC", "") monkeypatch.setenv("NTFY_SERVER", "http://127.0.0.1:9") monkeypatch.setenv("NTFY_TOKEN", "") # Joplin: a test that reached the developer's running desktop instance would # create or overwrite real notes in their archive. monkeypatch.setenv("JOPLIN_API_URL", "http://127.0.0.1:9") monkeypatch.setenv("JOPLIN_API_TOKEN", "")