"""Settings → System (#5467): Steward's own health, a verdict then each measure now and over the day. The verdict names what is wrong, and only that.""" from datetime import datetime, timezone import pytest from quart import render_template, session from steward.core import health AT = datetime(2026, 10, 9, 12, 0, tzinfo=timezone.utc) STORAGE = {"total": 3 * 2**30, "rest": {"count": 0, "bytes": 0}, "tables": [{"name": "plugin_metrics", "bytes": 2 * 2**30, "rows": 41_000_000}, {"name": "docker_logs", "bytes": 512 * 2**20, "rows": None}]} NO_EMAIL = {"rows": [], "more": 0, "sent": 0, "problems": []} async def _page(app, ctx, storage=STORAGE, cleanup=None, email=NO_EMAIL): from steward.core.outbox import KIND_LABELS async with app.test_request_context("/settings/system/"): session["user_role"] = "admin" page = await render_template("settings/system.html", **ctx, storage=storage, cleanup=cleanup, email=email, kind_labels=KIND_LABELS) return " ".join(page.split()) def _previews(**over): base = {m: {"now": 0.0, "at": AT, "series": [0.0, 0.0], "low": 0.0, "high": 0.0} for m in health.PROCESS_METRICS} base["db_roundtrip_ms"] = {"now": 4.0, "at": AT, "series": [3.0, 5.0], "low": 2.0, "high": 9.0} for m, v in over.items(): base[m] = {**base[m], **v} return base @pytest.fixture def previews(monkeypatch): def use(**over): got = _previews(**over) async def fake(db, source, resource, metric, now=None): assert (source, resource) == ("steward", "process") return got[metric] monkeypatch.setattr("steward.alerts.service.metric_preview", fake) return use async def test_a_healthy_steward_has_no_problems(previews): previews() got = await health.process_health(None) assert got["seen"] and got["problems"] == [] assert [r["metric"] for r in got["rows"]] == health.PROCESS_METRICS async def test_failures_and_gaps_are_named(previews): previews(ingest_failed={"now": 2.0, "high": 2.0}, unwatched_secs={"high": 420.0}, open_fds_pct={"now": 85.0}) problems = (await health.process_health(None))["problems"] assert problems[0] == "2 agent posts failed in the last minute" assert "wasn't watching for up to 7m" in problems[1] assert problems[2] == "open files at 85% of the limit" async def test_the_page_reads_as_a_verdict_then_each_measure(app, previews): previews(unwatched_secs={"high": 420.0}) got = await health.process_health(None) for r in got["rows"]: r["spark"] = "" page = await _page(app, got) assert 'Steward wasn't watching for up to 7m' in page assert 'title="<' not in page # a