from __future__ import annotations

import logging

from sqlalchemy.exc import OperationalError

from quartermaster.db import get_session
from quartermaster.main import create_app
from fastapi.testclient import TestClient


def test_healthz_returns_ok(client):
    response = client.get("/healthz")
    assert response.status_code == 200
    assert response.json() == {"status": "ok"}


def test_healthz_returns_503_when_db_check_raises(caplog):
    app = create_app()

    def broken_session():
        class BrokenSession:
            def execute(self, *args, **kwargs):
                raise OperationalError("boom", None, Exception("boom"))

            def close(self):
                pass

        session = BrokenSession()
        try:
            yield session
        finally:
            session.close()

    app.dependency_overrides[get_session] = broken_session

    caplog.set_level(logging.WARNING, logger="quartermaster.health")
    with TestClient(app) as client:
        response = client.get("/healthz")

    assert response.status_code == 503
    body = response.json()
    assert body["status"] == "error"
    assert body["detail"] == "OperationalError"

    failed = [r for r in caplog.records if getattr(r, "event", None) == "healthz_failed"]
    assert len(failed) == 1
    assert failed[0].levelname == "WARNING"
    assert failed[0].error_class == "OperationalError"
