"""Regression guard: shipped code must not reference old project names. The FabledNetMon -> FabledScryer -> Roundtable -> Steward renames repeatedly left stale names behind: package imports in the (then separate) plugins (e.g. `from fabledscryer.models...`), silently breaking every non-host_agent plugin, and a systemd unit still running `fablednetmon` as user `fablednetmon`. This test fails loudly if a legacy name reappears in the shipped Python, templates, plugin manifests or service units. """ from __future__ import annotations from pathlib import Path import pytest _ROOT = Path(__file__).resolve().parent.parent _TREES = [_ROOT / "steward", _ROOT / "plugins", _ROOT / "systemd"] _EXTENSIONS = {".py", ".yaml", ".yml", ".html", ".j2", ".service"} _FORBIDDEN = ("scryer", "roundtable", "netmon") # case-insensitive; old project names def _shipped_files(): for tree in _TREES: for path in tree.rglob("*"): if path.suffix in _EXTENSIONS and "__pycache__" not in path.parts: yield path def test_the_guard_reads_the_service_units(): assert any(p.suffix == ".service" for p in _shipped_files()) @pytest.mark.parametrize("name", _FORBIDDEN) def test_no_legacy_project_name(name): offenders = [ str(p.relative_to(_ROOT)) for p in _shipped_files() if name in p.read_text(encoding="utf-8", errors="ignore").lower() ] assert not offenders, f"legacy name {name!r} found in shipped code: {offenders}"