diff --git a/tests/test_metis.py b/tests/test_metis.py index 63f6b4d..510a7e1 100644 --- a/tests/test_metis.py +++ b/tests/test_metis.py @@ -111,3 +111,90 @@ def test_watch_sentinel_handles_http_error(monkeypatch) -> None: assert summary.status == "error" assert summary.detail == "upstream fail" assert summary.result["detail"] == "upstream fail" + + +def test_normalize_payload_and_ready(monkeypatch) -> None: + monkeypatch.setattr( + "ariadne.services.metis.settings", + SimpleNamespace(metis_base_url="http://metis", metis_watch_url="", metis_timeout_sec=10.0), + ) + service = metis_module.MetisService() + + assert service.ready() is True + assert metis_module._normalize_payload(None) == {} + assert metis_module._normalize_payload(["watched"]) == {"result": ["watched"]} + + monkeypatch.setattr( + "ariadne.services.metis.settings", + SimpleNamespace(metis_base_url="", metis_watch_url="", metis_timeout_sec=10.0), + ) + assert service.ready() is False + + +def test_watch_sentinel_handles_non_json_success(monkeypatch) -> None: + monkeypatch.setattr( + "ariadne.services.metis.settings", + SimpleNamespace(metis_base_url="http://metis", metis_watch_url="", metis_timeout_sec=10.0), + ) + client = DummyClient(DummyResponse(payload=ValueError("not json"))) + monkeypatch.setattr(metis_module.httpx, "Client", lambda **kwargs: client) + + summary = metis_module.MetisService().watch_sentinel() + + assert summary.status == "ok" + assert summary.result == {} + + +def test_watch_sentinel_handles_http_error_without_json(monkeypatch) -> None: + monkeypatch.setattr( + "ariadne.services.metis.settings", + SimpleNamespace(metis_base_url="http://metis", metis_watch_url="", metis_timeout_sec=10.0), + ) + client = DummyClient(DummyResponse(status_code=503, payload=ValueError("not json"))) + monkeypatch.setattr(metis_module.httpx, "Client", lambda **kwargs: client) + + summary = metis_module.MetisService().watch_sentinel() + + assert summary.status == "error" + assert summary.detail == "metis watch failed with HTTP 503" + + +def test_watch_sentinel_handles_client_exception(monkeypatch) -> None: + monkeypatch.setattr( + "ariadne.services.metis.settings", + SimpleNamespace(metis_base_url="http://metis", metis_watch_url="", metis_timeout_sec=10.0), + ) + + class FailingClient: + def __enter__(self): + raise RuntimeError("network down") + + def __exit__(self, exc_type, exc, tb): + return False + + monkeypatch.setattr(metis_module.httpx, "Client", lambda **kwargs: FailingClient()) + + summary = metis_module.MetisService().watch_sentinel() + + assert summary.status == "error" + assert summary.detail == "network down" + + +def test_watch_sentinel_normalizes_message_and_unknown_status(monkeypatch) -> None: + monkeypatch.setattr( + "ariadne.services.metis.settings", + SimpleNamespace(metis_base_url="http://metis", metis_watch_url="", metis_timeout_sec=10.0), + ) + client = DummyClient(DummyResponse(payload={"status": "warning", "message": " watched with warnings "})) + monkeypatch.setattr(metis_module.httpx, "Client", lambda **kwargs: client) + + summary = metis_module.MetisService().watch_sentinel() + + assert summary.status == "ok" + assert summary.detail == "watched with warnings" + + client.response = DummyResponse(payload={"status": "paused"}) + summary = metis_module.MetisService().watch_sentinel() + + assert summary.status == "ok" + assert summary.detail == "metis watch returned paused"