68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SCRIPT_PATH = ROOT / "scripts" / "fleet_phase_status.py"
|
|
DOC_PATH = ROOT / "docs" / "FLEET_PHASE_1_SURVIVAL.md"
|
|
|
|
|
|
def _load_module(path: Path, name: str):
|
|
assert path.exists(), f"missing {path.relative_to(ROOT)}"
|
|
spec = importlib.util.spec_from_file_location(name, path)
|
|
assert spec and spec.loader
|
|
module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def test_compute_phase_status_tracks_survival_gate_requirements() -> None:
|
|
mod = _load_module(SCRIPT_PATH, "fleet_phase_status")
|
|
|
|
status = mod.compute_phase_status(
|
|
{
|
|
"fleet_operational": True,
|
|
"resources": {
|
|
"uptime_percent": 94.5,
|
|
"days_at_or_above_95_percent": 12,
|
|
"capacity_utilization_percent": 45.0,
|
|
},
|
|
}
|
|
)
|
|
|
|
assert status["current_phase"] == "PHASE-1 Survival"
|
|
assert status["next_phase_ready"] is False
|
|
assert any("94.5% / 95.0%" in item for item in status["missing_requirements"])
|
|
assert any("12/30" in item for item in status["missing_requirements"])
|
|
assert any("45.0% / >60.0%" in item for item in status["missing_requirements"])
|
|
|
|
|
|
def test_render_markdown_preserves_phase_buildings_and_manual_clicker_language() -> None:
|
|
mod = _load_module(SCRIPT_PATH, "fleet_phase_status")
|
|
status = mod.compute_phase_status(mod.default_snapshot())
|
|
report = mod.render_markdown(status)
|
|
|
|
for snippet in (
|
|
"# [PHASE-1] Survival - Keep the Lights On",
|
|
"VPS hosts: Ezra, Allegro, Bezalel",
|
|
"Timmy harness",
|
|
"Gitea forge",
|
|
"Evennia worlds",
|
|
"Every restart, every SSH, every check is a manual click.",
|
|
):
|
|
assert snippet in report
|
|
|
|
|
|
def test_repo_contains_generated_phase_1_doc() -> None:
|
|
assert DOC_PATH.exists(), "missing committed phase-1 survival doc"
|
|
text = DOC_PATH.read_text(encoding="utf-8")
|
|
for snippet in (
|
|
"# [PHASE-1] Survival - Keep the Lights On",
|
|
"## Current Buildings",
|
|
"## Next Phase Trigger",
|
|
"## Manual Clicker Interpretation",
|
|
):
|
|
assert snippet in text
|