fix(test): pre-import decnet.cli at collection time to prevent agent-mode stripping

import decnet.cli as _decnet_cli at module level guarantees the app singleton is
built in master mode before any test can set DECNET_MODE=agent. Without this,
test_defence_in_depth_direct_call_fails_in_agent_mode triggered a fresh import
of decnet.cli with DECNET_MODE=agent active, which stripped master-only commands
and wrote the stripped module to sys.modules[decnet].cli — a parent-attribute
corruption that no sys.modules dict restore can fix.
This commit is contained in:
2026-05-10 07:32:43 -04:00
parent 8f6f56f481
commit a8f6a28f3a

View File

@@ -9,6 +9,8 @@ from pathlib import Path
import pytest import pytest
import decnet.cli as _decnet_cli # noqa: F401 — pre-load in master mode at collection time
REPO = pathlib.Path(__file__).resolve().parent.parent.parent REPO = pathlib.Path(__file__).resolve().parent.parent.parent
#DECNET_BIN = REPO / ".venv" / "bin" / "decnet" #DECNET_BIN = REPO / ".venv" / "bin" / "decnet"
@@ -78,11 +80,10 @@ def test_defence_in_depth_direct_call_fails_in_agent_mode(monkeypatch):
_require_master_mode('api') is the belt-and-braces guard.""" _require_master_mode('api') is the belt-and-braces guard."""
monkeypatch.setenv("DECNET_MODE", "agent") monkeypatch.setenv("DECNET_MODE", "agent")
monkeypatch.setenv("DECNET_DISALLOW_MASTER", "true") monkeypatch.setenv("DECNET_DISALLOW_MASTER", "true")
# Re-import cli so the module-level gate re-runs (harmless here; # _require_master_mode reads os.environ at call time — no reimport needed.
# we're exercising the in-function guard). Use monkeypatch.delitem so # Reimporting decnet.cli would corrupt sys.modules["decnet"].cli (the
# the original cached module is restored after the test and subsequent # parent-package attribute that `import decnet.cli as x` resolves through)
# tests don't see the agent-mode-stripped app singleton. # and no restore strategy can fix that without reloading the decnet package.
monkeypatch.delitem(sys.modules, "decnet.cli", raising=False)
from decnet.cli import _require_master_mode from decnet.cli import _require_master_mode
import typer import typer
with pytest.raises(typer.Exit): with pytest.raises(typer.Exit):