Skip to content

Commit 23d888a

Browse files
magicmarkclaude
andcommitted
Fix typing of TransportQueryError.errors from List[Any] to List[GraphQLError]
- Change `errors` type annotation in `TransportQueryError` from `Optional[List[Any]]` to `Optional[List[GraphQLError]]` - Wrap raw dict payload in `GraphQLError` in `websockets_protocol.py` so all error paths produce `GraphQLError` objects consistently - Update test assertions to use `GraphQLError` attribute access (`.message`, `.extensions`) instead of dict indexing (`["message"]`) - Add `extensions is not None` guards for mypy narrowing This reduces the total mypy error count from 24 to 10 (fixing 14 pre-existing type errors in websocket exception tests). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 91b9355 commit 23d888a

File tree

6 files changed

+33
-16
lines changed

6 files changed

+33
-16
lines changed

gql/transport/exceptions.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from typing import Any, List, Optional
22

3+
from graphql import GraphQLError
4+
35

46
class TransportError(Exception):
57
"""Base class for all the Transport exceptions"""
@@ -34,15 +36,15 @@ class TransportQueryError(TransportError):
3436
"""
3537

3638
query_id: Optional[int]
37-
errors: Optional[List[Any]]
39+
errors: Optional[List[GraphQLError]]
3840
data: Optional[Any]
3941
extensions: Optional[Any]
4042

4143
def __init__(
4244
self,
4345
msg: str,
4446
query_id: Optional[int] = None,
45-
errors: Optional[List[Any]] = None,
47+
errors: Optional[List[GraphQLError]] = None,
4648
data: Optional[Any] = None,
4749
extensions: Optional[Any] = None,
4850
):

gql/transport/websockets_protocol.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from contextlib import suppress
55
from typing import Any, Dict, List, Optional, Tuple, Union
66

7-
from graphql import ExecutionResult
7+
from graphql import ExecutionResult, GraphQLError
88

99
from ..graphql_request import GraphQLRequest
1010
from .common.adapters.connection import AdapterConnection
@@ -382,7 +382,14 @@ def _parse_answer_apollo(
382382
elif answer_type == "error":
383383

384384
raise TransportQueryError(
385-
str(payload), query_id=answer_id, errors=[payload]
385+
str(payload),
386+
query_id=answer_id,
387+
errors=[
388+
GraphQLError(
389+
payload.get("message", str(payload)),
390+
extensions=payload.get("extensions"),
391+
)
392+
],
386393
)
387394

388395
elif answer_type == "ka":

tests/test_aiohttp_websocket_exceptions.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ async def test_aiohttp_websocket_invalid_query(aiohttp_client_and_server, query_
5555

5656
error = exception.errors[0]
5757

58-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
58+
assert error.extensions is not None
59+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
5960

6061

6162
invalid_subscription_str = """
@@ -97,7 +98,8 @@ async def test_aiohttp_websocket_invalid_subscription(
9798

9899
error = exception.errors[0]
99100

100-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
101+
assert error.extensions is not None
102+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
101103

102104

103105
connection_error_server_answer = (
@@ -205,7 +207,7 @@ async def monkey_patch_send_query(
205207

206208
error = exception.errors[0]
207209

208-
assert error["message"] == "Must provide document"
210+
assert error.message == "Must provide document"
209211

210212

211213
not_json_answer = ["BLAHBLAH"]

tests/test_aiohttp_websocket_graphqlws_exceptions.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ async def test_aiohttp_websocket_graphqlws_invalid_query(
5555

5656
error = exception.errors[0]
5757

58-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
58+
assert error.extensions is not None
59+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
5960

6061

6162
invalid_subscription_str = """
@@ -99,7 +100,8 @@ async def test_aiohttp_websocket_graphqlws_invalid_subscription(
99100

100101
error = exception.errors[0]
101102

102-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
103+
assert error.extensions is not None
104+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
103105

104106

105107
async def server_no_ack(ws):
@@ -159,7 +161,7 @@ async def test_aiohttp_websocket_graphqlws_sending_invalid_query(
159161
error = exception.errors[0]
160162

161163
assert (
162-
error["message"]
164+
error.message
163165
== 'Cannot query field "helo" on type "Query". Did you mean "hello"?'
164166
)
165167

tests/test_graphqlws_exceptions.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ async def test_graphqlws_invalid_query(client_and_graphqlws_server, query_str):
5353

5454
error = exception.errors[0]
5555

56-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
56+
assert error.extensions is not None
57+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
5758

5859

5960
invalid_subscription_str = """
@@ -95,7 +96,8 @@ async def test_graphqlws_invalid_subscription(client_and_graphqlws_server, query
9596

9697
error = exception.errors[0]
9798

98-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
99+
assert error.extensions is not None
100+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
99101

100102

101103
async def server_no_ack(ws):
@@ -151,7 +153,7 @@ async def test_graphqlws_sending_invalid_query(client_and_graphqlws_server):
151153
error = exception.errors[0]
152154

153155
assert (
154-
error["message"]
156+
error.message
155157
== 'Cannot query field "helo" on type "Query". Did you mean "hello"?'
156158
)
157159

tests/test_websocket_exceptions.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ async def test_websocket_invalid_query(client_and_server, query_str):
5656

5757
error = exception.errors[0]
5858

59-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
59+
assert error.extensions is not None
60+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
6061

6162

6263
invalid_subscription_str = """
@@ -96,7 +97,8 @@ async def test_websocket_invalid_subscription(client_and_server, query_str):
9697

9798
error = exception.errors[0]
9899

99-
assert error["extensions"]["code"] == "INTERNAL_SERVER_ERROR"
100+
assert error.extensions is not None
101+
assert error.extensions["code"] == "INTERNAL_SERVER_ERROR"
100102

101103

102104
connection_error_server_answer = (
@@ -200,7 +202,7 @@ async def monkey_patch_send_query(
200202

201203
error = exception.errors[0]
202204

203-
assert error["message"] == "Must provide document"
205+
assert error.message == "Must provide document"
204206

205207

206208
not_json_answer = ["BLAHBLAH"]

0 commit comments

Comments
 (0)