Skip to content

Commit 24b037d

Browse files
authored
Add extensions field to ExecutionResult (#188) (#190)
* Add extensions field to ExecutionResult * Update graphql-core min version to 3.1.4
1 parent 459d5eb commit 24b037d

8 files changed

+123
-5
lines changed

gql/transport/aiohttp.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,11 @@ async def execute(
236236
f"{result_text}"
237237
)
238238

239-
return ExecutionResult(errors=result.get("errors"), data=result.get("data"))
239+
return ExecutionResult(
240+
errors=result.get("errors"),
241+
data=result.get("data"),
242+
extensions=result.get("extensions"),
243+
)
240244

241245
def subscribe(
242246
self,

gql/transport/phoenix_channel_websockets.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,9 @@ def _parse_answer(
189189
answer_type = "data"
190190

191191
execution_result = ExecutionResult(
192-
errors=payload.get("errors"), data=result.get("data")
192+
errors=payload.get("errors"),
193+
data=result.get("data"),
194+
extensions=payload.get("extensions"),
193195
)
194196

195197
elif event == "phx_reply":

gql/transport/requests.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,11 @@ def execute( # type: ignore
171171
if "errors" not in result and "data" not in result:
172172
raise TransportProtocolError("Server did not return a GraphQL result")
173173

174-
return ExecutionResult(errors=result.get("errors"), data=result.get("data"))
174+
return ExecutionResult(
175+
errors=result.get("errors"),
176+
data=result.get("data"),
177+
extensions=result.get("extensions"),
178+
)
175179

176180
def close(self):
177181
"""Closing the transport by closing the inner session"""

gql/transport/websockets.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,9 @@ def _parse_answer(
303303
)
304304

305305
execution_result = ExecutionResult(
306-
errors=payload.get("errors"), data=payload.get("data")
306+
errors=payload.get("errors"),
307+
data=payload.get("data"),
308+
extensions=payload.get("extensions"),
307309
)
308310

309311
elif answer_type == "error":

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from setuptools import setup, find_packages
44

55
install_requires = [
6-
"graphql-core>=3.1,<3.2",
6+
"graphql-core>=3.1.4,<3.2",
77
"yarl>=1.6,<2.0",
88
]
99

tests/test_aiohttp.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,3 +948,35 @@ async def handler(request):
948948
expected_error = "Syntax Error: Unexpected Name 'BLAHBLAH'"
949949

950950
assert expected_error in captured_err
951+
952+
953+
query1_server_answer_with_extensions = (
954+
f'{{"data":{query1_server_answer_data}, "extensions":{{"key1": "val1"}}}}'
955+
)
956+
957+
958+
@pytest.mark.asyncio
959+
async def test_aiohttp_query_with_extensions(event_loop, aiohttp_server):
960+
from aiohttp import web
961+
from gql.transport.aiohttp import AIOHTTPTransport
962+
963+
async def handler(request):
964+
return web.Response(
965+
text=query1_server_answer_with_extensions, content_type="application/json"
966+
)
967+
968+
app = web.Application()
969+
app.router.add_route("POST", "/", handler)
970+
server = await aiohttp_server(app)
971+
972+
url = server.make_url("/")
973+
974+
sample_transport = AIOHTTPTransport(url=url, timeout=10)
975+
976+
async with Client(transport=sample_transport,) as session:
977+
978+
query = gql(query1_str)
979+
980+
execution_result = await session._execute(query)
981+
982+
assert execution_result.extensions["key1"] == "val1"

tests/test_requests.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,47 @@ def test_code():
216216
sample_transport.execute(query)
217217

218218
await run_sync_test(event_loop, server, test_code)
219+
220+
221+
query1_server_answer_with_extensions = (
222+
'{"data":{"continents":['
223+
'{"code":"AF","name":"Africa"},{"code":"AN","name":"Antarctica"},'
224+
'{"code":"AS","name":"Asia"},{"code":"EU","name":"Europe"},'
225+
'{"code":"NA","name":"North America"},{"code":"OC","name":"Oceania"},'
226+
'{"code":"SA","name":"South America"}]},'
227+
'"extensions": {"key1": "val1"}'
228+
"}"
229+
)
230+
231+
232+
@pytest.mark.aiohttp
233+
@pytest.mark.asyncio
234+
async def test_requests_query_with_extensions(
235+
event_loop, aiohttp_server, run_sync_test
236+
):
237+
from aiohttp import web
238+
from gql.transport.requests import RequestsHTTPTransport
239+
240+
async def handler(request):
241+
return web.Response(
242+
text=query1_server_answer_with_extensions, content_type="application/json"
243+
)
244+
245+
app = web.Application()
246+
app.router.add_route("POST", "/", handler)
247+
server = await aiohttp_server(app)
248+
249+
url = server.make_url("/")
250+
251+
def test_code():
252+
sample_transport = RequestsHTTPTransport(url=url)
253+
254+
with Client(transport=sample_transport,) as session:
255+
256+
query = gql(query1_str)
257+
258+
execution_result = session._execute(query)
259+
260+
assert execution_result.extensions["key1"] == "val1"
261+
262+
await run_sync_test(event_loop, server, test_code)

tests/test_websocket_query.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,3 +569,33 @@ async def test_websocket_using_cli(event_loop, server, monkeypatch, capsys):
569569
received_answer = json.loads(captured_out)
570570

571571
assert received_answer == expected_answer
572+
573+
574+
query1_server_answer_with_extensions = (
575+
'{{"type":"data","id":"{query_id}","payload":{{"data":{{"continents":['
576+
'{{"code":"AF","name":"Africa"}},{{"code":"AN","name":"Antarctica"}},'
577+
'{{"code":"AS","name":"Asia"}},{{"code":"EU","name":"Europe"}},'
578+
'{{"code":"NA","name":"North America"}},{{"code":"OC","name":"Oceania"}},'
579+
'{{"code":"SA","name":"South America"}}]}},'
580+
'"extensions": {{"key1": "val1"}}}}}}'
581+
)
582+
583+
server1_answers_with_extensions = [
584+
query1_server_answer_with_extensions,
585+
]
586+
587+
588+
@pytest.mark.asyncio
589+
@pytest.mark.parametrize("server", [server1_answers_with_extensions], indirect=True)
590+
@pytest.mark.parametrize("query_str", [query1_str])
591+
async def test_websocket_simple_query_with_extensions(
592+
event_loop, client_and_server, query_str
593+
):
594+
595+
session, server = client_and_server
596+
597+
query = gql(query_str)
598+
599+
execution_result = await session._execute(query)
600+
601+
assert execution_result.extensions["key1"] == "val1"

0 commit comments

Comments
 (0)