Groups every flat test_*.py under the module it exercises, matching the
existing tests/{profiler,sniffer,prober,collector,correlation,cli,web,
topology,swarm,bus,updater,api,docker,geoip,...} layout. New folders:
services/, fleet/, config/, logging/, db/ (+ db/mysql/), telemetry/,
mutator/, core/.
Path-dependent __file__ references bumped an extra .parent in three
files that moved one level deeper:
- tests/sniffer/test_sniffer_ja3.py (template path)
- tests/services/test_ssh_capture_emit.py (template path)
- tests/cli/test_mode_gating.py (REPO root)
- tests/web/test_env_lazy_jwt.py (repo var)
Also drops two SQLite runtime artifacts (test_decnet.db-{shm,wal}) that
were leaking into the repo from a previous test run.
Fixes two test_service_isolation cases that patched asyncio.sleep (no
longer on the profiler main-loop hot path — same pre-existing bug I
fixed earlier in test_attacker_worker.py) by patching asyncio.wait_for
and passing interval=0.
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
"""The JWT secret must be lazy: agent/updater subcommands should import
|
|
`decnet.env` without DECNET_JWT_SECRET being set."""
|
|
from __future__ import annotations
|
|
|
|
import importlib
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
|
|
def _reimport_env(monkeypatch):
|
|
monkeypatch.delenv("DECNET_JWT_SECRET", raising=False)
|
|
for mod in list(sys.modules):
|
|
if mod == "decnet.env" or mod.startswith("decnet.env."):
|
|
sys.modules.pop(mod)
|
|
return importlib.import_module("decnet.env")
|
|
|
|
|
|
def test_env_imports_without_jwt_secret(monkeypatch):
|
|
env = _reimport_env(monkeypatch)
|
|
assert hasattr(env, "DECNET_API_PORT")
|
|
|
|
|
|
def test_jwt_secret_access_returns_value_when_set(monkeypatch):
|
|
monkeypatch.setenv("DECNET_JWT_SECRET", "x" * 32)
|
|
env = _reimport_env(monkeypatch)
|
|
monkeypatch.setenv("DECNET_JWT_SECRET", "x" * 32)
|
|
assert env.DECNET_JWT_SECRET == "x" * 32
|
|
|
|
|
|
def test_agent_cli_imports_without_jwt_secret(monkeypatch, tmp_path):
|
|
"""Subprocess check: `decnet agent --help` must succeed with no
|
|
DECNET_JWT_SECRET in the environment and no .env file in cwd."""
|
|
import subprocess
|
|
import pathlib
|
|
clean_env = {
|
|
k: v for k, v in os.environ.items()
|
|
if not k.startswith("DECNET_") and not k.startswith("PYTEST")
|
|
}
|
|
clean_env["PATH"] = os.environ["PATH"]
|
|
clean_env["HOME"] = str(tmp_path)
|
|
repo = pathlib.Path(__file__).resolve().parent.parent.parent
|
|
# binary = repo / ".venv" / "bin" / "decnet"
|
|
binary = Path(sys.executable).parent / "decnet"
|
|
result = subprocess.run(
|
|
[str(binary), "agent", "--help"],
|
|
cwd=str(tmp_path),
|
|
env=clean_env,
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=15,
|
|
)
|
|
assert result.returncode == 0, result.stderr
|
|
assert "worker agent" in result.stdout.lower()
|
|
|
|
|
|
def test_unknown_attr_still_raises(monkeypatch):
|
|
env = _reimport_env(monkeypatch)
|
|
with pytest.raises(AttributeError):
|
|
_ = env.DOES_NOT_EXIST
|