Skip to content

Commit ad392b5

Browse files
committed
Return errors as promise when return_promise=True (#5)
1 parent eef0919 commit ad392b5

File tree

2 files changed

+76
-8
lines changed

2 files changed

+76
-8
lines changed

graphql_server/__init__.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
from collections import namedtuple
1313

1414
import six
15+
16+
from promise import promisify, is_thenable
17+
1518
from graphql import get_default_backend
1619
from graphql.error import format_error as default_format_error
1720
from graphql.execution import ExecutionResult
1821
from graphql.execution.executors.sync import SyncExecutor
1922
from graphql.type import GraphQLSchema
20-
from promise import Promise, is_thenable
2123

2224
from .error import HttpQueryError
2325

@@ -304,6 +306,11 @@ def execute_graphql_request(
304306
return ExecutionResult(errors=[e], invalid=True)
305307

306308

309+
@promisify
310+
def execute_graphql_request_as_promise(*args, **kwargs):
311+
return execute_graphql_request(*args, **kwargs)
312+
313+
307314
def get_response(
308315
schema, # type: GraphQLSchema
309316
params, # type: RequestParams
@@ -318,10 +325,13 @@ def get_response(
318325
that belong to an exception class that you need to pass as a parameter.
319326
"""
320327
# noinspection PyBroadException
328+
execute = (
329+
execute_graphql_request_as_promise
330+
if kwargs.get("return_promise", False)
331+
else execute_graphql_request
332+
)
321333
try:
322-
execution_result = execute_graphql_request(
323-
schema, params, allow_only_query, **kwargs
324-
)
334+
execution_result = execute(schema, params, allow_only_query, **kwargs)
325335
except catch_exc:
326336
return None
327337

tests/test_query.py

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import json
22

3-
from graphql.error import GraphQLError
3+
from pytest import raises
4+
45
from promise import Promise
56

7+
from graphql.error import GraphQLError, GraphQLSyntaxError
8+
from graphql.execution import ExecutionResult
9+
610
from graphql_server import (
711
HttpQueryError,
812
RequestParams,
@@ -13,7 +17,6 @@
1317
load_json_body,
1418
run_http_query,
1519
)
16-
from pytest import raises
1720

1821
from .schema import schema
1922
from .utils import as_dicts
@@ -529,7 +532,7 @@ def test_batch_allows_post_with_operation_name():
529532
]
530533

531534

532-
def test_get_reponses_using_executor():
535+
def test_get_responses_using_executor():
533536
class TestExecutor(object):
534537
called = False
535538
waited = False
@@ -550,14 +553,18 @@ def execute(self, fn, *args, **kwargs):
550553
schema, "get", {}, dict(query=query), executor=TestExecutor(),
551554
)
552555

556+
assert isinstance(results, list)
557+
assert len(results) == 1
558+
assert isinstance(results[0], ExecutionResult)
559+
553560
assert as_dicts(results) == [{"data": {"test": "Hello World"}}]
554561
assert params == [RequestParams(query=query, variables=None, operation_name=None)]
555562
assert TestExecutor.called
556563
assert TestExecutor.waited
557564
assert not TestExecutor.cleaned
558565

559566

560-
def test_get_reponses_using_executor_return_promise():
567+
def test_get_responses_using_executor_return_promise():
561568
class TestExecutor(object):
562569
called = False
563570
waited = False
@@ -583,10 +590,61 @@ def execute(self, fn, *args, **kwargs):
583590
return_promise=True,
584591
)
585592

593+
assert isinstance(result_promises, list)
594+
assert len(result_promises) == 1
595+
assert isinstance(result_promises[0], Promise)
586596
results = Promise.all(result_promises).get()
587597

588598
assert as_dicts(results) == [{"data": {"test": "Hello World"}}]
589599
assert params == [RequestParams(query=query, variables=None, operation_name=None)]
590600
assert TestExecutor.called
591601
assert not TestExecutor.waited
592602
assert TestExecutor.cleaned
603+
604+
605+
def test_syntax_error_using_executor_return_promise():
606+
class TestExecutor(object):
607+
called = False
608+
waited = False
609+
cleaned = False
610+
611+
def wait_until_finished(self):
612+
TestExecutor.waited = True
613+
614+
def clean(self):
615+
TestExecutor.cleaned = True
616+
617+
def execute(self, fn, *args, **kwargs):
618+
TestExecutor.called = True
619+
return fn(*args, **kwargs)
620+
621+
query = "this is a syntax error"
622+
result_promises, params = run_http_query(
623+
schema,
624+
"get",
625+
{},
626+
dict(query=query),
627+
executor=TestExecutor(),
628+
return_promise=True,
629+
)
630+
631+
assert isinstance(result_promises, list)
632+
assert len(result_promises) == 1
633+
assert isinstance(result_promises[0], Promise)
634+
results = Promise.all(result_promises).get()
635+
636+
assert isinstance(results, list)
637+
assert len(results) == 1
638+
result = results[0]
639+
assert isinstance(result, ExecutionResult)
640+
641+
assert result.data is None
642+
assert isinstance(result.errors, list)
643+
assert len(result.errors) == 1
644+
error = result.errors[0]
645+
assert isinstance(error, GraphQLSyntaxError)
646+
647+
assert params == [RequestParams(query=query, variables=None, operation_name=None)]
648+
assert not TestExecutor.called
649+
assert not TestExecutor.waited
650+
assert not TestExecutor.cleaned

0 commit comments

Comments
 (0)