|
| 1 | +# type: ignore |
1 | 2 | from __future__ import print_function
|
2 | 3 |
|
| 4 | +import json |
| 5 | + |
| 6 | +from pytest import raises |
| 7 | +from graphql.error import GraphQLError |
3 | 8 | from graphql.execution import MiddlewareManager, execute
|
4 |
| -from graphql.execution.middleware import (get_middleware_resolvers, |
5 |
| - middleware_chain) |
| 9 | +from graphql.execution.middleware import get_middleware_resolvers, middleware_chain |
6 | 10 | from graphql.language.parser import parse
|
7 |
| -from graphql.type import (GraphQLArgument, GraphQLBoolean, GraphQLField, |
8 |
| - GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, |
9 |
| - GraphQLObjectType, GraphQLSchema, GraphQLString) |
| 11 | +from graphql.type import ( |
| 12 | + GraphQLArgument, |
| 13 | + GraphQLBoolean, |
| 14 | + GraphQLField, |
| 15 | + GraphQLInt, |
| 16 | + GraphQLList, |
| 17 | + GraphQLObjectType, |
| 18 | + GraphQLSchema, |
| 19 | + GraphQLString, |
| 20 | + GraphQLNonNull, |
| 21 | + GraphQLID, |
| 22 | +) |
10 | 23 | from promise import Promise
|
11 | 24 |
|
12 | 25 |
|
13 | 26 | def test_middleware():
|
14 |
| - doc = '''{ |
| 27 | + # type: () -> None |
| 28 | + doc = """{ |
15 | 29 | ok
|
16 | 30 | not_ok
|
17 |
| - }''' |
| 31 | + }""" |
18 | 32 |
|
19 | 33 | class Data(object):
|
20 |
| - |
21 | 34 | def ok(self):
|
22 |
| - return 'ok' |
| 35 | + # type: () -> str |
| 36 | + return "ok" |
23 | 37 |
|
24 | 38 | def not_ok(self):
|
25 |
| - return 'not_ok' |
| 39 | + # type: () -> str |
| 40 | + return "not_ok" |
26 | 41 |
|
27 | 42 | doc_ast = parse(doc)
|
28 | 43 |
|
29 |
| - Type = GraphQLObjectType('Type', { |
30 |
| - 'ok': GraphQLField(GraphQLString), |
31 |
| - 'not_ok': GraphQLField(GraphQLString), |
32 |
| - }) |
| 44 | + Type = GraphQLObjectType( |
| 45 | + "Type", |
| 46 | + {"ok": GraphQLField(GraphQLString), "not_ok": GraphQLField(GraphQLString)}, |
| 47 | + ) |
33 | 48 |
|
34 | 49 | def reversed_middleware(next, *args, **kwargs):
|
| 50 | + # type: (Callable, *Any, **Any) -> Promise |
35 | 51 | p = next(*args, **kwargs)
|
36 | 52 | return p.then(lambda x: x[::-1])
|
37 | 53 |
|
38 | 54 | middlewares = MiddlewareManager(reversed_middleware)
|
39 |
| - result = execute(GraphQLSchema(Type), doc_ast, |
40 |
| - Data(), middleware=middlewares) |
41 |
| - assert result.data == {'ok': 'ko', 'not_ok': 'ko_ton'} |
| 55 | + result = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares) |
| 56 | + assert result.data == {"ok": "ko", "not_ok": "ko_ton"} |
42 | 57 |
|
43 | 58 |
|
44 | 59 | def test_middleware_class():
|
45 |
| - doc = '''{ |
| 60 | + # type: () -> None |
| 61 | + doc = """{ |
46 | 62 | ok
|
47 | 63 | not_ok
|
48 |
| - }''' |
| 64 | + }""" |
49 | 65 |
|
50 | 66 | class Data(object):
|
51 |
| - |
52 | 67 | def ok(self):
|
53 |
| - return 'ok' |
| 68 | + # type: () -> str |
| 69 | + return "ok" |
54 | 70 |
|
55 | 71 | def not_ok(self):
|
56 |
| - return 'not_ok' |
| 72 | + # type: () -> str |
| 73 | + return "not_ok" |
57 | 74 |
|
58 | 75 | doc_ast = parse(doc)
|
59 | 76 |
|
60 |
| - Type = GraphQLObjectType('Type', { |
61 |
| - 'ok': GraphQLField(GraphQLString), |
62 |
| - 'not_ok': GraphQLField(GraphQLString), |
63 |
| - }) |
| 77 | + Type = GraphQLObjectType( |
| 78 | + "Type", |
| 79 | + {"ok": GraphQLField(GraphQLString), "not_ok": GraphQLField(GraphQLString)}, |
| 80 | + ) |
64 | 81 |
|
65 | 82 | class MyMiddleware(object):
|
66 | 83 | def resolve(self, next, *args, **kwargs):
|
| 84 | + # type: (Callable, *Any, **Any) -> Promise |
67 | 85 | p = next(*args, **kwargs)
|
68 | 86 | return p.then(lambda x: x[::-1])
|
69 | 87 |
|
70 | 88 | middlewares = MiddlewareManager(MyMiddleware())
|
71 |
| - result = execute(GraphQLSchema(Type), doc_ast, |
72 |
| - Data(), middleware=middlewares) |
73 |
| - assert result.data == {'ok': 'ko', 'not_ok': 'ko_ton'} |
| 89 | + result = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares) |
| 90 | + assert result.data == {"ok": "ko", "not_ok": "ko_ton"} |
74 | 91 |
|
75 | 92 |
|
76 | 93 | def test_middleware_skip_promise_wrap():
|
77 |
| - doc = '''{ |
| 94 | + # type: () -> None |
| 95 | + doc = """{ |
78 | 96 | ok
|
79 | 97 | not_ok
|
80 |
| - }''' |
| 98 | + }""" |
81 | 99 |
|
82 | 100 | class Data(object):
|
83 |
| - |
84 | 101 | def ok(self):
|
85 |
| - return 'ok' |
| 102 | + # type: () -> str |
| 103 | + return "ok" |
86 | 104 |
|
87 | 105 | def not_ok(self):
|
88 |
| - return 'not_ok' |
| 106 | + # type: () -> str |
| 107 | + return "not_ok" |
89 | 108 |
|
90 | 109 | doc_ast = parse(doc)
|
91 | 110 |
|
92 |
| - Type = GraphQLObjectType('Type', { |
93 |
| - 'ok': GraphQLField(GraphQLString), |
94 |
| - 'not_ok': GraphQLField(GraphQLString), |
95 |
| - }) |
| 111 | + Type = GraphQLObjectType( |
| 112 | + "Type", |
| 113 | + {"ok": GraphQLField(GraphQLString), "not_ok": GraphQLField(GraphQLString)}, |
| 114 | + ) |
96 | 115 |
|
97 | 116 | class MyPromiseMiddleware(object):
|
98 | 117 | def resolve(self, next, *args, **kwargs):
|
| 118 | + # type: (Callable, *Any, **Any) -> Promise |
99 | 119 | return Promise.resolve(next(*args, **kwargs))
|
100 | 120 |
|
101 | 121 | class MyEmptyMiddleware(object):
|
102 | 122 | def resolve(self, next, *args, **kwargs):
|
| 123 | + # type: (Callable, *Any, **Any) -> str |
103 | 124 | return next(*args, **kwargs)
|
104 | 125 |
|
105 | 126 | middlewares_with_promise = MiddlewareManager(
|
106 |
| - MyPromiseMiddleware(), wrap_in_promise=False) |
| 127 | + MyPromiseMiddleware(), wrap_in_promise=False |
| 128 | + ) |
107 | 129 | middlewares_without_promise = MiddlewareManager(
|
108 |
| - MyEmptyMiddleware(), wrap_in_promise=False) |
| 130 | + MyEmptyMiddleware(), wrap_in_promise=False |
| 131 | + ) |
109 | 132 |
|
110 |
| - result1 = execute(GraphQLSchema(Type), doc_ast, Data(), |
111 |
| - middleware=middlewares_with_promise) |
112 |
| - result2 = execute(GraphQLSchema(Type), doc_ast, Data(), |
113 |
| - middleware=middlewares_without_promise) |
| 133 | + result1 = execute( |
| 134 | + GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_with_promise |
| 135 | + ) |
| 136 | + result2 = execute( |
| 137 | + GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_without_promise |
| 138 | + ) |
114 | 139 | assert result1.data == result2.data and result1.data == {
|
115 |
| - 'ok': 'ok', 'not_ok': 'not_ok'} |
| 140 | + "ok": "ok", |
| 141 | + "not_ok": "not_ok", |
| 142 | + } |
116 | 143 |
|
117 | 144 |
|
118 | 145 | def test_middleware_chain(capsys):
|
119 |
| - |
| 146 | + # type: () -> None |
120 | 147 | class CharPrintingMiddleware(object):
|
121 | 148 | def __init__(self, char):
|
| 149 | + # type: (str) -> None |
122 | 150 | self.char = char
|
123 | 151 |
|
124 | 152 | def resolve(self, next, *args, **kwargs):
|
| 153 | + # type: (Callable, *Any, **Any) -> str |
125 | 154 | print("resolve() called for middleware {}".format(self.char))
|
126 | 155 | return next(*args, **kwargs).then(
|
127 | 156 | lambda x: print("then() for {}".format(self.char))
|
128 | 157 | )
|
129 | 158 |
|
130 | 159 | middlewares = [
|
131 |
| - CharPrintingMiddleware('a'), |
132 |
| - CharPrintingMiddleware('b'), |
133 |
| - CharPrintingMiddleware('c'), |
| 160 | + CharPrintingMiddleware("a"), |
| 161 | + CharPrintingMiddleware("b"), |
| 162 | + CharPrintingMiddleware("c"), |
134 | 163 | ]
|
135 | 164 |
|
136 | 165 | middlewares_resolvers = get_middleware_resolvers(middlewares)
|
137 | 166 |
|
138 |
| - def func(): return |
| 167 | + def func(): |
| 168 | + # type: () -> None |
| 169 | + return |
139 | 170 |
|
140 |
| - chain_iter = middleware_chain(func, middlewares_resolvers) |
| 171 | + chain_iter = middleware_chain(func, middlewares_resolvers, wrap_in_promise=True) |
141 | 172 |
|
142 | 173 | assert_stdout(capsys, "")
|
143 | 174 |
|
144 | 175 | chain_iter()
|
145 | 176 |
|
146 | 177 | expected_stdout = (
|
147 |
| - 'resolve() called for middleware c\n' |
148 |
| - 'resolve() called for middleware b\n' |
149 |
| - 'resolve() called for middleware a\n' |
150 |
| - 'then() for a\n' |
151 |
| - 'then() for b\n' |
152 |
| - 'then() for c\n' |
| 178 | + "resolve() called for middleware c\n" |
| 179 | + "resolve() called for middleware b\n" |
| 180 | + "resolve() called for middleware a\n" |
| 181 | + "then() for a\n" |
| 182 | + "then() for b\n" |
| 183 | + "then() for c\n" |
153 | 184 | )
|
154 | 185 | assert_stdout(capsys, expected_stdout)
|
155 | 186 |
|
156 | 187 |
|
157 | 188 | def assert_stdout(capsys, expected_stdout):
|
| 189 | + # type: (Any, str) -> None |
158 | 190 | captured = capsys.readouterr()
|
159 | 191 | assert captured.out == expected_stdout
|
0 commit comments