fix: test suite sent real push notifications via the developer's .env
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
"""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", "")
|
||||
Reference in New Issue
Block a user