forked from Rockachopa/Timmy-time-dashboard
96 lines
3.6 KiB
Python
96 lines
3.6 KiB
Python
"""Tests for the real-time monitoring dashboard routes. Refs: #862"""
|
|
|
|
|
|
class TestMonitoringPage:
|
|
"""Tests for the monitoring dashboard HTML page."""
|
|
|
|
def test_monitoring_page_returns_200(self, client):
|
|
response = client.get("/monitoring")
|
|
assert response.status_code == 200
|
|
|
|
def test_monitoring_page_contains_key_headings(self, client):
|
|
response = client.get("/monitoring")
|
|
assert response.status_code == 200
|
|
body = response.text
|
|
assert "Real-Time Monitoring" in body
|
|
assert "Agent Status" in body
|
|
assert "System Resources" in body
|
|
assert "Economy" in body
|
|
assert "Stream Health" in body
|
|
assert "Content Pipeline" in body
|
|
|
|
|
|
class TestMonitoringStatusEndpoint:
|
|
"""Tests for /monitoring/status JSON endpoint."""
|
|
|
|
def test_status_returns_200(self, client):
|
|
response = client.get("/monitoring/status")
|
|
assert response.status_code == 200
|
|
|
|
def test_status_has_required_keys(self, client):
|
|
response = client.get("/monitoring/status")
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
for key in ("timestamp", "uptime_seconds", "agents", "resources", "economy", "stream", "pipeline", "alerts"):
|
|
assert key in data, f"Missing key: {key}"
|
|
|
|
def test_agents_is_list(self, client):
|
|
response = client.get("/monitoring/status")
|
|
data = response.json()
|
|
assert isinstance(data["agents"], list)
|
|
|
|
def test_alerts_is_list(self, client):
|
|
response = client.get("/monitoring/status")
|
|
data = response.json()
|
|
assert isinstance(data["alerts"], list)
|
|
|
|
def test_resources_has_expected_fields(self, client):
|
|
response = client.get("/monitoring/status")
|
|
data = response.json()
|
|
resources = data["resources"]
|
|
for field in ("disk_percent", "disk_free_gb", "ollama_reachable", "loaded_models", "warnings"):
|
|
assert field in resources, f"Missing resource field: {field}"
|
|
|
|
def test_economy_has_expected_fields(self, client):
|
|
response = client.get("/monitoring/status")
|
|
data = response.json()
|
|
economy = data["economy"]
|
|
for field in ("balance_sats", "earned_sats", "spent_sats", "tx_count"):
|
|
assert field in economy, f"Missing economy field: {field}"
|
|
|
|
def test_stream_has_expected_fields(self, client):
|
|
response = client.get("/monitoring/status")
|
|
data = response.json()
|
|
stream = data["stream"]
|
|
for field in ("live", "viewer_count", "bitrate_kbps", "uptime_seconds"):
|
|
assert field in stream, f"Missing stream field: {field}"
|
|
|
|
def test_uptime_is_non_negative(self, client):
|
|
response = client.get("/monitoring/status")
|
|
data = response.json()
|
|
assert data["uptime_seconds"] >= 0
|
|
|
|
|
|
class TestMonitoringAlertsEndpoint:
|
|
"""Tests for /monitoring/alerts JSON endpoint."""
|
|
|
|
def test_alerts_returns_200(self, client):
|
|
response = client.get("/monitoring/alerts")
|
|
assert response.status_code == 200
|
|
|
|
def test_alerts_has_alerts_and_count(self, client):
|
|
response = client.get("/monitoring/alerts")
|
|
data = response.json()
|
|
assert "alerts" in data
|
|
assert "count" in data
|
|
assert isinstance(data["alerts"], list)
|
|
assert data["count"] == len(data["alerts"])
|
|
|
|
def test_alert_items_have_level_and_title(self, client):
|
|
response = client.get("/monitoring/alerts")
|
|
data = response.json()
|
|
for alert in data["alerts"]:
|
|
assert "level" in alert
|
|
assert "title" in alert
|
|
assert alert["level"] in ("info", "warning", "critical")
|