Skip to content

Commit 79af8ab

Browse files
committed
Add docstring and test for async middleware
1 parent 9fa8827 commit 79af8ab

File tree

3 files changed

+76
-3
lines changed

3 files changed

+76
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ a query language for APIs created by Facebook.
1212
[![Python 3 Status](https://pyup.io/repos/github/graphql-python/graphql-core-next/python-3-shield.svg)](https://pyup.io/repos/github/graphql-python/graphql-core-next/)
1313

1414
The current version 1.0.1 of GraphQL-core-next is up-to-date with GraphQL.js version
15-
14.0.2. All parts of the API are covered by an extensive test suite of currently 1624
15+
14.0.2. All parts of the API are covered by an extensive test suite of currently 1626
1616
unit tests.
1717

1818

graphql/execution/middleware.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class MiddlewareManager:
1515
and/or objects. The functions take the next middleware function as first argument.
1616
If middleware is provided as an object, it must provide a method `resolve` that is
1717
used as the middleware function.
18+
19+
Note that since resolvers return "MaybeAwaitable" values, all middleware functions
20+
must be aware of this and check whether values are awaitable before awaiting them.
1821
"""
1922

2023
__slots__ = "middlewares", "_middleware_resolvers", "_cached_resolvers"
@@ -35,7 +38,7 @@ def get_field_resolver(
3538
"""Wrap the provided resolver with the middleware.
3639
3740
Returns a function that chains the middleware functions with the provided
38-
resolver function
41+
resolver function.
3942
"""
4043
if self._middleware_resolvers is None:
4144
return field_resolver

tests/execution/test_middleware.py

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pytest import raises
1+
from pytest import mark, raises
22

33
from graphql.execution import MiddlewareManager, execute
44
from graphql.language.parser import parse
@@ -55,6 +55,36 @@ def reverse_middleware(next_, *args, **kwargs):
5555

5656
assert result.data == {"first": "eno", "second": "owt"}
5757

58+
@mark.asyncio
59+
async def single_async_function():
60+
doc = parse("{ first second }")
61+
62+
# noinspection PyMethodMayBeStatic
63+
class Data:
64+
async def first(self, _info):
65+
return "one"
66+
67+
async def second(self, _info):
68+
return "two"
69+
70+
test_type = GraphQLObjectType(
71+
"TestType",
72+
{
73+
"first": GraphQLField(GraphQLString),
74+
"second": GraphQLField(GraphQLString),
75+
},
76+
)
77+
78+
async def reverse_middleware(next_, *args, **kwargs):
79+
return (await next_(*args, **kwargs))[::-1]
80+
81+
middlewares = MiddlewareManager(reverse_middleware)
82+
result = await execute(
83+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares
84+
)
85+
86+
assert result.data == {"first": "eno", "second": "owt"}
87+
5888
def single_object():
5989
doc = parse("{ first second }")
6090

@@ -114,6 +144,46 @@ def resolve(self, next_, *args, **kwargs):
114144
)
115145
assert result.data == {"field": "Devloser"}
116146

147+
middlewares = MiddlewareManager(CaptitalizeMiddleware(), reverse_middleware)
148+
result = execute(
149+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares
150+
)
151+
assert result.data == {"field": "devloseR"}
152+
153+
@mark.asyncio
154+
async def with_async_function_and_object():
155+
doc = parse("{ field }")
156+
157+
# noinspection PyMethodMayBeStatic
158+
class Data:
159+
async def field(self, _info):
160+
return "resolved"
161+
162+
test_type = GraphQLObjectType(
163+
"TestType", {"field": GraphQLField(GraphQLString)}
164+
)
165+
166+
async def reverse_middleware(next_, *args, **kwargs):
167+
return (await next_(*args, **kwargs))[::-1]
168+
169+
class CaptitalizeMiddleware:
170+
171+
# noinspection PyMethodMayBeStatic
172+
async def resolve(self, next_, *args, **kwargs):
173+
return (await next_(*args, **kwargs)).capitalize()
174+
175+
middlewares = MiddlewareManager(reverse_middleware, CaptitalizeMiddleware())
176+
result = await execute(
177+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares
178+
)
179+
assert result.data == {"field": "Devloser"}
180+
181+
middlewares = MiddlewareManager(CaptitalizeMiddleware(), reverse_middleware)
182+
result = await execute(
183+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares
184+
)
185+
assert result.data == {"field": "devloseR"}
186+
117187
def describe_without_manager():
118188
def no_middleware():
119189
doc = parse("{ field }")

0 commit comments

Comments
 (0)