Skip to content

Commit d7d871f

Browse files
authored
Better transport exception messages (#155)
1 parent 56d7d7f commit d7d871f

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

gql/transport/aiohttp.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,20 @@ async def execute(
204204
resp.raise_for_status()
205205

206206
except ClientResponseError as e:
207-
raise TransportServerError from e
207+
raise TransportServerError(str(e)) from e
208208

209-
raise TransportProtocolError("Server did not return a GraphQL result")
209+
result_text = await resp.text()
210+
raise TransportProtocolError(
211+
f"Server did not return a GraphQL result: {result_text}"
212+
)
210213

211214
if "errors" not in result and "data" not in result:
212-
raise TransportProtocolError("Server did not return a GraphQL result")
215+
result_text = await resp.text()
216+
raise TransportProtocolError(
217+
"Server did not return a GraphQL result: "
218+
'No "data" or "error" keys in answer: '
219+
f"{result_text}"
220+
)
213221

214222
return ExecutionResult(errors=result.get("errors"), data=result.get("data"))
215223

gql/transport/websockets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ def _parse_answer(
325325

326326
except ValueError as e:
327327
raise TransportProtocolError(
328-
"Server did not return a GraphQL result"
328+
f"Server did not return a GraphQL result: {answer}"
329329
) from e
330330

331331
return answer_type, answer_id, execution_result

tests/test_aiohttp.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,11 @@ async def handler(request):
8383

8484
query = gql(query1_str)
8585

86-
with pytest.raises(TransportServerError):
86+
with pytest.raises(TransportServerError) as exc_info:
8787
await session.execute(query)
8888

89+
assert "500, message='Internal Server Error'" in str(exc_info.value)
90+
8991

9092
query1_server_error_answer = '{"errors": ["Error 1", "Error 2"]}'
9193

@@ -114,15 +116,34 @@ async def handler(request):
114116

115117

116118
invalid_protocol_responses = [
117-
"{}",
118-
"qlsjfqsdlkj",
119-
'{"not_data_or_errors": 35}',
119+
{
120+
"response": "{}",
121+
"expected_exception": (
122+
"Server did not return a GraphQL result: "
123+
'No "data" or "error" keys in answer: {}'
124+
),
125+
},
126+
{
127+
"response": "qlsjfqsdlkj",
128+
"expected_exception": (
129+
"Server did not return a GraphQL result: " "qlsjfqsdlkj"
130+
),
131+
},
132+
{
133+
"response": '{"not_data_or_errors": 35}',
134+
"expected_exception": (
135+
"Server did not return a GraphQL result: "
136+
'No "data" or "error" keys in answer: {"not_data_or_errors": 35}'
137+
),
138+
},
120139
]
121140

122141

123142
@pytest.mark.asyncio
124-
@pytest.mark.parametrize("response", invalid_protocol_responses)
125-
async def test_aiohttp_invalid_protocol(event_loop, aiohttp_server, response):
143+
@pytest.mark.parametrize("param", invalid_protocol_responses)
144+
async def test_aiohttp_invalid_protocol(event_loop, aiohttp_server, param):
145+
response = param["response"]
146+
126147
async def handler(request):
127148
return web.Response(text=response, content_type="application/json")
128149

@@ -138,9 +159,11 @@ async def handler(request):
138159

139160
query = gql(query1_str)
140161

141-
with pytest.raises(TransportProtocolError):
162+
with pytest.raises(TransportProtocolError) as exc_info:
142163
await session.execute(query)
143164

165+
assert param["expected_exception"] in str(exc_info.value)
166+
144167

145168
@pytest.mark.asyncio
146169
async def test_aiohttp_subscribe_not_supported(event_loop, aiohttp_server):

0 commit comments

Comments
 (0)