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