import httpx import pytest from srht_contrib.services.srht_client import SourceHutClientError, SourceHutGraphQLClient def test_graphql_client_retries_http_5xx_and_succeeds() -> None: attempts = {"count": 0} def handler(request: httpx.Request) -> httpx.Response: attempts["count"] += 1 if attempts["count"] == 1: return httpx.Response(502, json={"error": "bad gateway"}) return httpx.Response(200, json={"data": {"ok": True}}) client = SourceHutGraphQLClient( "https://todo.sr.ht/query", "token", transport=httpx.MockTransport(handler), ) data = client.execute("query Ping { ping }") assert data == {"ok": True} assert attempts["count"] == 2 client.close() def test_graphql_client_raises_for_graphql_errors() -> None: client = SourceHutGraphQLClient( "https://todo.sr.ht/query", "token", transport=httpx.MockTransport(lambda request: httpx.Response(200, json={"errors": [{"message": "nope"}]})), ) with pytest.raises(SourceHutClientError): client.execute("query Ping { ping }") client.close() def test_graphql_client_raises_for_network_errors() -> None: def handler(request: httpx.Request) -> httpx.Response: raise httpx.ConnectError("offline", request=request) client = SourceHutGraphQLClient( "https://todo.sr.ht/query", "token", max_retries=0, transport=httpx.MockTransport(handler), ) with pytest.raises(SourceHutClientError): client.execute("query Ping { ping }") client.close()