151 lines
4.6 KiB
Python
151 lines
4.6 KiB
Python
import re
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def _env_example_keys() -> set[str]:
|
|
keys = set()
|
|
for raw_line in (ROOT / ".env.example").read_text(encoding="utf-8").splitlines():
|
|
line = raw_line.strip()
|
|
if not line or line.startswith("#") or "=" not in line:
|
|
continue
|
|
key, _value = line.split("=", 1)
|
|
keys.add(key.strip())
|
|
return keys
|
|
|
|
|
|
def test_phase3f_orphan_ai_services_stay_removed():
|
|
orphan_services = [
|
|
"services/elephant_alpha_decision_router.py",
|
|
"services/telegram_ai_integration.py",
|
|
"services/watcher_agent.py",
|
|
]
|
|
|
|
assert [path for path in orphan_services if (ROOT / path).exists()] == []
|
|
|
|
|
|
def test_active_guides_do_not_point_to_removed_ai_services():
|
|
active_guides = [
|
|
ROOT / "docs" / "ELEPHANT_ALPHA_SETUP.md",
|
|
]
|
|
removed_modules = [
|
|
"services/telegram_ai_integration.py",
|
|
"services/watcher_agent.py",
|
|
]
|
|
|
|
for guide in active_guides:
|
|
content = guide.read_text(encoding="utf-8")
|
|
assert "Modify routing behavior in `services/elephant_alpha_decision_router.py`" not in content
|
|
for module_path in removed_modules:
|
|
assert module_path not in content
|
|
|
|
|
|
def test_env_example_documents_runtime_and_ai_automation_variables():
|
|
expected_keys = {
|
|
"AUTO_FIX_ENABLED",
|
|
"CODE_REVIEW_AUTO_FIX_ENABLED",
|
|
"ELEPHANT_ALPHA_ALLOWED_SSH_HOSTS",
|
|
"ELEPHANT_ALPHA_URL",
|
|
"EMBEDDING_HOST",
|
|
"EMBEDDING_TIMEOUT",
|
|
"GUNICORN_TIMEOUT",
|
|
"GUNICORN_THREADS",
|
|
"GUNICORN_WORKER_CLASS",
|
|
"LINE_ENABLED",
|
|
"MOMO_AI_AUTOMATION_SMOKE_HISTORY",
|
|
"MOMO_AI_AUTOMATION_SMOKE_HISTORY_LIMIT",
|
|
"MOMO_ALLOW_INSECURE_INTERNAL_WEBHOOK_FOR_DEV",
|
|
"MOMO_EVENT_ROUTER_DEFAULT_DEDUP_SEC",
|
|
"MOMO_EVENT_ROUTER_QUEUE",
|
|
"MOMO_EVENT_ROUTER_REPLAY_LIMIT",
|
|
"MOMO_EVENT_ROUTER_REPLAY_ON_SUCCESS",
|
|
"N8N_HOST",
|
|
"N8N_PASSWORD",
|
|
"N8N_PROTOCOL",
|
|
"N8N_USER",
|
|
"N8N_WEBHOOK_BASE_URL",
|
|
"OLLAMA_EMBED_TIMEOUT",
|
|
"TELEGRAM_CHAT_ID",
|
|
"WEB_CONCURRENCY",
|
|
}
|
|
|
|
assert expected_keys <= _env_example_keys()
|
|
|
|
|
|
def test_scheduler_does_not_silently_swallow_exceptions():
|
|
scheduler_source = (ROOT / "scheduler.py").read_text(encoding="utf-8")
|
|
|
|
assert "except:" not in scheduler_source
|
|
assert not re.search(r"except(?: Exception)?[^\n]*:\n\s+pass(?:\s|#|$)", scheduler_source)
|
|
|
|
|
|
def test_tracked_backup_artifacts_stay_removed():
|
|
forbidden_artifacts = [
|
|
"app.py.backup_login_required",
|
|
"vendor_stockout_list.html.backup",
|
|
"database/edm_dashboard.html",
|
|
"tests/main_test.py",
|
|
]
|
|
|
|
assert [path for path in forbidden_artifacts if (ROOT / path).exists()] == []
|
|
|
|
|
|
def test_active_code_no_longer_references_legacy_5888_port():
|
|
active_paths = [
|
|
ROOT / "app.py",
|
|
ROOT / "tests",
|
|
ROOT / "AUTO_IMPORT_README.md",
|
|
ROOT / "GOOGLE_DRIVE_SETUP.md",
|
|
ROOT / "start_momo.command",
|
|
ROOT / "scripts" / "archive" / "check_email_status.py",
|
|
]
|
|
|
|
offenders = []
|
|
for active_path in active_paths:
|
|
paths = active_path.rglob("*") if active_path.is_dir() else [active_path]
|
|
for path in paths:
|
|
if (
|
|
not path.is_file()
|
|
or path == Path(__file__).resolve()
|
|
or "__pycache__" in path.parts
|
|
or path.suffix == ".pyc"
|
|
):
|
|
continue
|
|
content = path.read_text(encoding="utf-8", errors="ignore")
|
|
if "5888" in content:
|
|
offenders.append(str(path.relative_to(ROOT)))
|
|
|
|
assert offenders == []
|
|
|
|
|
|
def test_executable_scripts_do_not_use_remove_orphans():
|
|
script_paths = [
|
|
ROOT / "scripts",
|
|
ROOT / "docker",
|
|
ROOT / ".gitea" / "workflows",
|
|
]
|
|
|
|
offenders = []
|
|
for script_root in script_paths:
|
|
if not script_root.exists():
|
|
continue
|
|
for path in script_root.rglob("*"):
|
|
if not path.is_file():
|
|
continue
|
|
content = path.read_text(encoding="utf-8", errors="ignore")
|
|
if "--remove-orphans" in content or "docker compose down" in content:
|
|
offenders.append(str(path.relative_to(ROOT)))
|
|
|
|
assert offenders == []
|
|
|
|
|
|
def test_gitea_cd_uses_ewoooc_dedicated_runner_label():
|
|
workflow = (ROOT / ".gitea" / "workflows" / "cd.yaml").read_text(encoding="utf-8")
|
|
|
|
assert "runs-on: ewoooc-host" in workflow
|
|
assert "runs-on: ubuntu-latest" not in workflow
|
|
assert "runs-on: ubuntu-22.04" not in workflow
|
|
assert "runs-on: ubuntu-24.04" not in workflow
|