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