85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
import unittest
|
|
from types import SimpleNamespace
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.core.security import get_password_hash
|
|
from app.db import get_db_session
|
|
from app.main import app
|
|
|
|
|
|
class StubScalarResult:
|
|
def __init__(self, user=None):
|
|
self.user = user
|
|
|
|
def scalar(self):
|
|
return 1
|
|
|
|
def scalar_one_or_none(self):
|
|
return self.user
|
|
|
|
|
|
class StubReadyDb:
|
|
def __init__(self, password="rotated-secret"):
|
|
self.user = SimpleNamespace(
|
|
username="admin@example.com",
|
|
password_hash=get_password_hash(password),
|
|
)
|
|
|
|
def execute(self, _statement):
|
|
return StubScalarResult(self.user)
|
|
|
|
|
|
class StubBrokenDb:
|
|
def execute(self, _statement):
|
|
raise RuntimeError("database unavailable")
|
|
|
|
|
|
class SystemApiTestCase(unittest.TestCase):
|
|
def tearDown(self):
|
|
app.dependency_overrides.clear()
|
|
|
|
def test_readiness_returns_pilot_assets(self):
|
|
app.dependency_overrides[get_db_session] = lambda: StubReadyDb()
|
|
client = TestClient(app)
|
|
|
|
response = client.get("/api/v1/system/readiness")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
payload = response.json()["data"]
|
|
self.assertEqual(payload["status"], "ready")
|
|
self.assertEqual(payload["pilot_assets"]["default_admin"]["username"], "admin@example.com")
|
|
self.assertTrue(payload["pilot_assets"]["default_admin"]["password_rotated"])
|
|
self.assertGreaterEqual(len(payload["pilot_assets"]["demo_flow"]), 4)
|
|
self.assertTrue(any(item["key"] == "database" and item["status"] == "ok" for item in payload["checks"]))
|
|
self.assertTrue(any(item["key"] == "default_admin_password" and item["status"] == "ok" for item in payload["checks"]))
|
|
|
|
def test_readiness_warns_when_default_admin_password_is_active(self):
|
|
app.dependency_overrides[get_db_session] = lambda: StubReadyDb(password="123456")
|
|
client = TestClient(app)
|
|
|
|
response = client.get("/api/v1/system/readiness")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
payload = response.json()["data"]
|
|
self.assertEqual(payload["status"], "ready")
|
|
self.assertFalse(payload["pilot_assets"]["default_admin"]["password_rotated"])
|
|
self.assertGreaterEqual(payload["summary"]["warnings"], 1)
|
|
self.assertTrue(any(item["key"] == "default_admin_password" and item["status"] == "warning" for item in payload["checks"]))
|
|
|
|
def test_readiness_degrades_when_database_check_fails(self):
|
|
app.dependency_overrides[get_db_session] = lambda: StubBrokenDb()
|
|
client = TestClient(app)
|
|
|
|
response = client.get("/api/v1/system/readiness")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
payload = response.json()["data"]
|
|
self.assertEqual(payload["status"], "degraded")
|
|
self.assertEqual(payload["summary"]["failed_required"], 1)
|
|
self.assertTrue(any(item["key"] == "database" and item["status"] == "failed" for item in payload["checks"]))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|