Skip to content

Commit a16edf1

Browse files
committed
Some more tests for the middleware implementation
1 parent 2865994 commit a16edf1

File tree

3 files changed

+164
-66
lines changed

3 files changed

+164
-66
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ a query language for APIs created by Facebook.
1313

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

1818

1919
## Documentation

graphql/execution/execute.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class ExecutionResult(NamedTuple):
6060

6161
ExecutionResult.__new__.__defaults__ = (None, None) # type: ignore
6262

63-
Middleware = Optional[Union[Iterable[Any], MiddlewareManager]]
63+
Middleware = Optional[Union[Tuple, List, MiddlewareManager]]
6464

6565

6666
def execute(
@@ -168,13 +168,13 @@ def build(
168168
fragments: Dict[str, FragmentDefinitionNode] = {}
169169
middleware_manager: Optional[MiddlewareManager] = None
170170
if middleware is not None:
171-
if isinstance(middleware, Iterable):
171+
if isinstance(middleware, (list, tuple)):
172172
middleware_manager = MiddlewareManager(*middleware)
173173
elif isinstance(middleware, MiddlewareManager):
174174
middleware_manager = middleware
175175
else:
176176
raise TypeError(
177-
"Middleware must be passed as a sequence of functions"
177+
"Middleware must be passed as a list or tuple of functions"
178178
" or objects, or as a single MiddlewareManager object."
179179
f" Got {middleware!r} instead.")
180180

tests/execution/test_middleware.py

+160-62
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from pytest import raises
2+
13
from graphql.execution import MiddlewareManager, execute
24
from graphql.language.parser import parse
35
from graphql.type import (
@@ -6,86 +8,182 @@
68

79
def describe_middleware():
810

9-
def with_function_as_middleware():
10-
doc = parse("{ first second }")
11+
def describe_with_manager():
12+
13+
def default():
14+
doc = parse("{ field }")
15+
16+
# noinspection PyMethodMayBeStatic
17+
class Data:
18+
def field(self, _info):
19+
return 'resolved'
20+
21+
test_type = GraphQLObjectType('TestType', {
22+
'field': GraphQLField(GraphQLString)})
23+
24+
middlewares = MiddlewareManager()
25+
result = execute(
26+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
27+
28+
assert result.data['field'] == 'resolved'
29+
30+
def single_function():
31+
doc = parse("{ first second }")
32+
33+
# noinspection PyMethodMayBeStatic
34+
class Data:
35+
def first(self, _info):
36+
return 'one'
37+
38+
def second(self, _info):
39+
return 'two'
40+
41+
test_type = GraphQLObjectType('TestType', {
42+
'first': GraphQLField(GraphQLString),
43+
'second': GraphQLField(GraphQLString)})
44+
45+
def reverse_middleware(next_, *args, **kwargs):
46+
return next_(*args, **kwargs)[::-1]
47+
48+
middlewares = MiddlewareManager(reverse_middleware)
49+
result = execute(
50+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
1151

12-
# noinspection PyMethodMayBeStatic
13-
class Data:
14-
def first(self, _info):
15-
return 'one'
52+
assert result.data == {'first': 'eno', 'second': 'owt'}
1653

17-
def second(self, _info):
18-
return 'two'
54+
def single_object():
55+
doc = parse("{ first second }")
1956

20-
test_type = GraphQLObjectType('Type', {
21-
'first': GraphQLField(GraphQLString),
22-
'second': GraphQLField(GraphQLString)})
57+
# noinspection PyMethodMayBeStatic
58+
class Data:
59+
def first(self, _info):
60+
return 'one'
2361

24-
def reverse_middleware(next_, *args, **kwargs):
25-
return next_(*args, **kwargs)[::-1]
62+
def second(self, _info):
63+
return 'two'
2664

27-
middlewares = MiddlewareManager(reverse_middleware)
28-
result = execute(
29-
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
30-
assert result.data == {'first': 'eno', 'second': 'owt'}
65+
test_type = GraphQLObjectType('TestType', {
66+
'first': GraphQLField(GraphQLString),
67+
'second': GraphQLField(GraphQLString)})
3168

32-
def with_object_as_middleware():
33-
doc = parse("{ first second }")
69+
class ReverseMiddleware:
3470

35-
# noinspection PyMethodMayBeStatic
36-
class Data:
37-
def first(self, _info):
38-
return 'one'
71+
# noinspection PyMethodMayBeStatic
72+
def resolve(self, next_, *args, **kwargs):
73+
return next_(*args, **kwargs)[::-1]
3974

40-
def second(self, _info):
41-
return 'two'
75+
middlewares = MiddlewareManager(ReverseMiddleware())
76+
result = execute(
77+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
4278

43-
test_type = GraphQLObjectType('Type', {
44-
'first': GraphQLField(GraphQLString),
45-
'second': GraphQLField(GraphQLString)})
79+
assert result.data == {'first': 'eno', 'second': 'owt'}
4680

47-
class ReverseMiddleware:
81+
def with_function_and_object():
82+
doc = parse("{ field }")
4883

4984
# noinspection PyMethodMayBeStatic
50-
def resolve(self, next_, *args, **kwargs):
85+
class Data:
86+
def field(self, _info):
87+
return 'resolved'
88+
89+
test_type = GraphQLObjectType('TestType', {
90+
'field': GraphQLField(GraphQLString)})
91+
92+
def reverse_middleware(next_, *args, **kwargs):
5193
return next_(*args, **kwargs)[::-1]
5294

53-
middlewares = MiddlewareManager(ReverseMiddleware())
54-
result = execute(
55-
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
56-
assert result.data == {'first': 'eno', 'second': 'owt'}
95+
class CaptitalizeMiddleware:
96+
97+
# noinspection PyMethodMayBeStatic
98+
def resolve(self, next_, *args, **kwargs):
99+
return next_(*args, **kwargs).capitalize()
100+
101+
middlewares = MiddlewareManager(
102+
reverse_middleware, CaptitalizeMiddleware())
103+
result = execute(
104+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
105+
assert result.data == {'field': 'Devloser'}
57106

58-
def with_middleware_chain():
59-
doc = parse("{ field }")
107+
def describe_without_manager():
60108

61-
# noinspection PyMethodMayBeStatic
62-
class Data:
63-
def field(self, _info):
64-
return 'resolved'
109+
def no_middleware():
110+
doc = parse("{ field }")
65111

66-
test_type = GraphQLObjectType('Type', {
67-
'field': GraphQLField(GraphQLString)})
112+
# noinspection PyMethodMayBeStatic
113+
class Data:
114+
def field(self, _info):
115+
return 'resolved'
116+
117+
test_type = GraphQLObjectType('TestType', {
118+
'field': GraphQLField(GraphQLString)})
119+
120+
result = execute(
121+
GraphQLSchema(test_type), doc, Data(), middleware=None)
122+
123+
assert result.data['field'] == 'resolved'
124+
125+
def empty_middleware_list():
126+
doc = parse("{ field }")
127+
128+
# noinspection PyMethodMayBeStatic
129+
class Data:
130+
def field(self, _info):
131+
return 'resolved'
132+
133+
test_type = GraphQLObjectType('TestType', {
134+
'field': GraphQLField(GraphQLString)})
135+
136+
result = execute(
137+
GraphQLSchema(test_type), doc, Data(), middleware=[])
138+
139+
assert result.data['field'] == 'resolved'
68140

69-
log = []
141+
def bad_middleware_object():
142+
doc = parse("{ field }")
70143

71-
class LogMiddleware:
72-
def __init__(self, name):
73-
self.name = name
144+
test_type = GraphQLObjectType('TestType', {
145+
'field': GraphQLField(GraphQLString)})
146+
147+
with raises(TypeError) as exc_info:
148+
execute(GraphQLSchema(test_type), doc, None,
149+
middleware={'bad': 'value'})
150+
151+
assert str(exc_info.value) == (
152+
'Middleware must be passed as a list or tuple of functions'
153+
' or objects, or as a single MiddlewareManager object.'
154+
" Got {'bad': 'value'} instead.")
155+
156+
def list_of_functions():
157+
doc = parse("{ field }")
74158

75159
# noinspection PyMethodMayBeStatic
76-
def resolve(self, next_, *args, **kwargs):
77-
log.append(f'enter {self.name}')
78-
value = next_(*args, **kwargs)
79-
log.append(f'exit {self.name}')
80-
return value
81-
82-
middlewares = [
83-
LogMiddleware('A'), LogMiddleware('B'), LogMiddleware('C')]
84-
85-
result = execute(
86-
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
87-
assert result.data == {'field': 'resolved'}
88-
89-
assert log == [
90-
'enter C', 'enter B', 'enter A',
91-
'exit A', 'exit B', 'exit C']
160+
class Data:
161+
def field(self, _info):
162+
return 'resolved'
163+
164+
test_type = GraphQLObjectType('TestType', {
165+
'field': GraphQLField(GraphQLString)})
166+
167+
log = []
168+
169+
class LogMiddleware:
170+
def __init__(self, name):
171+
self.name = name
172+
173+
# noinspection PyMethodMayBeStatic
174+
def resolve(self, next_, *args, **kwargs):
175+
log.append(f'enter {self.name}')
176+
value = next_(*args, **kwargs)
177+
log.append(f'exit {self.name}')
178+
return value
179+
180+
middlewares = [
181+
LogMiddleware('A'), LogMiddleware('B'), LogMiddleware('C')]
182+
183+
result = execute(
184+
GraphQLSchema(test_type), doc, Data(), middleware=middlewares)
185+
assert result.data == {'field': 'resolved'}
186+
187+
assert log == [
188+
'enter C', 'enter B', 'enter A',
189+
'exit A', 'exit B', 'exit C']

0 commit comments

Comments
 (0)