OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library shelf.create_middleware_test; | 5 library shelf.create_middleware_test; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:shelf/shelf.dart'; | 9 import 'package:shelf/shelf.dart'; |
10 import 'package:unittest/unittest.dart'; | 10 import 'package:unittest/unittest.dart'; |
11 | 11 |
12 import 'test_util.dart'; | 12 import 'test_util.dart'; |
13 | 13 |
14 void main() { | 14 void main() { |
15 test('forwards the request and response if both handlers are null', () { | 15 test('forwards the request and response if both handlers are null', () { |
16 var handler = const Pipeline() | 16 var handler = const Pipeline() |
17 .addMiddleware(createMiddleware()) | 17 .addMiddleware(createMiddleware()) |
18 .addHandler((request) { | 18 .addHandler((request) { |
19 return syncHandler(request, headers: {'from' : 'innerHandler'}); | 19 return syncHandler(request, headers: {'from': 'innerHandler'}); |
20 }); | 20 }); |
21 | 21 |
22 return makeSimpleRequest(handler).then((response) { | 22 return makeSimpleRequest(handler).then((response) { |
23 expect(response.headers['from'], 'innerHandler'); | 23 expect(response.headers['from'], 'innerHandler'); |
24 }); | 24 }); |
25 }); | 25 }); |
26 | 26 |
27 group('requestHandler', () { | 27 group('requestHandler', () { |
28 test('sync null response forwards to inner handler', () { | 28 test('sync null response forwards to inner handler', () { |
29 var handler = const Pipeline() | 29 var handler = const Pipeline() |
30 .addMiddleware(createMiddleware(requestHandler: (request) => null)) | 30 .addMiddleware(createMiddleware(requestHandler: (request) => null)) |
(...skipping 21 matching lines...) Expand all Loading... |
52 requestHandler: (request) => _middlewareResponse)) | 52 requestHandler: (request) => _middlewareResponse)) |
53 .addHandler(_failHandler); | 53 .addHandler(_failHandler); |
54 | 54 |
55 return makeSimpleRequest(handler).then((response) { | 55 return makeSimpleRequest(handler).then((response) { |
56 expect(response.headers['from'], 'middleware'); | 56 expect(response.headers['from'], 'middleware'); |
57 }); | 57 }); |
58 }); | 58 }); |
59 | 59 |
60 test('async response is returned', () { | 60 test('async response is returned', () { |
61 var handler = const Pipeline() | 61 var handler = const Pipeline() |
62 .addMiddleware(createMiddleware(requestHandler: (request) => | 62 .addMiddleware(createMiddleware( |
63 new Future.value(_middlewareResponse))) | 63 requestHandler: (request) => |
| 64 new Future.value(_middlewareResponse))) |
64 .addHandler(_failHandler); | 65 .addHandler(_failHandler); |
65 | 66 |
66 return makeSimpleRequest(handler).then((response) { | 67 return makeSimpleRequest(handler).then((response) { |
67 expect(response.headers['from'], 'middleware'); | 68 expect(response.headers['from'], 'middleware'); |
68 }); | 69 }); |
69 }); | 70 }); |
70 | 71 |
71 group('with responseHandler', () { | 72 group('with responseHandler', () { |
72 test('with sync result, responseHandler is not called', () { | 73 test('with sync result, responseHandler is not called', () { |
73 var middleware = createMiddleware( | 74 var middleware = createMiddleware( |
74 requestHandler: (request) => _middlewareResponse, | 75 requestHandler: (request) => _middlewareResponse, |
75 responseHandler: (response) => fail('should not be called')); | 76 responseHandler: (response) => fail('should not be called')); |
76 | 77 |
77 var handler = const Pipeline() | 78 var handler = |
78 .addMiddleware(middleware) | 79 const Pipeline().addMiddleware(middleware).addHandler(syncHandler); |
79 .addHandler(syncHandler); | |
80 | 80 |
81 return makeSimpleRequest(handler).then((response) { | 81 return makeSimpleRequest(handler).then((response) { |
82 expect(response.headers['from'], 'middleware'); | 82 expect(response.headers['from'], 'middleware'); |
83 }); | 83 }); |
84 }); | 84 }); |
85 | 85 |
86 test('with async result, responseHandler is not called', () { | 86 test('with async result, responseHandler is not called', () { |
87 var middleware = createMiddleware( | 87 var middleware = createMiddleware( |
88 requestHandler: (request) => new Future.value(_middlewareResponse), | 88 requestHandler: (request) => new Future.value(_middlewareResponse), |
89 responseHandler: (response) => fail('should not be called')); | 89 responseHandler: (response) => fail('should not be called')); |
90 var handler = const Pipeline() | 90 var handler = |
91 .addMiddleware(middleware) | 91 const Pipeline().addMiddleware(middleware).addHandler(syncHandler); |
92 .addHandler(syncHandler); | |
93 | 92 |
94 return makeSimpleRequest(handler).then((response) { | 93 return makeSimpleRequest(handler).then((response) { |
95 expect(response.headers['from'], 'middleware'); | 94 expect(response.headers['from'], 'middleware'); |
96 }); | 95 }); |
97 }); | 96 }); |
98 }); | 97 }); |
99 }); | 98 }); |
100 | 99 |
101 group('responseHandler', () { | 100 group('responseHandler', () { |
102 test('innerHandler sync response is seen, replaced value continues', () { | 101 test('innerHandler sync response is seen, replaced value continues', () { |
103 var handler = const Pipeline().addMiddleware(createMiddleware( | 102 var handler = const Pipeline() |
104 responseHandler: (response) { | 103 .addMiddleware(createMiddleware(responseHandler: (response) { |
105 expect(response.headers['from'], 'handler'); | 104 expect(response.headers['from'], 'handler'); |
106 return _middlewareResponse; | 105 return _middlewareResponse; |
107 })).addHandler((request) { | 106 })).addHandler((request) { |
108 return syncHandler(request, headers: {'from' : 'handler'} ); | 107 return syncHandler(request, headers: {'from': 'handler'}); |
109 }); | 108 }); |
110 | 109 |
111 return makeSimpleRequest(handler).then((response) { | 110 return makeSimpleRequest(handler).then((response) { |
112 expect(response.headers['from'], 'middleware'); | 111 expect(response.headers['from'], 'middleware'); |
113 }); | 112 }); |
114 }); | 113 }); |
115 | 114 |
116 test('innerHandler async response is seen, async value continues', () { | 115 test('innerHandler async response is seen, async value continues', () { |
117 var handler = const Pipeline().addMiddleware( | 116 var handler = const Pipeline() |
118 createMiddleware(responseHandler: (response) { | 117 .addMiddleware(createMiddleware(responseHandler: (response) { |
119 expect(response.headers['from'], 'handler'); | 118 expect(response.headers['from'], 'handler'); |
120 return new Future.value(_middlewareResponse); | 119 return new Future.value(_middlewareResponse); |
121 })).addHandler((request) { | 120 })).addHandler((request) { |
122 return new Future(() => syncHandler( | 121 return new Future( |
123 request, headers: {'from' : 'handler'} )); | 122 () => syncHandler(request, headers: {'from': 'handler'})); |
124 }); | 123 }); |
125 | 124 |
126 return makeSimpleRequest(handler).then((response) { | 125 return makeSimpleRequest(handler).then((response) { |
127 expect(response.headers['from'], 'middleware'); | 126 expect(response.headers['from'], 'middleware'); |
128 }); | 127 }); |
129 }); | 128 }); |
130 }); | 129 }); |
131 | 130 |
132 group('error handling', () { | 131 group('error handling', () { |
133 test('sync error thrown by requestHandler bubbles down', () { | 132 test('sync error thrown by requestHandler bubbles down', () { |
134 var handler = const Pipeline() | 133 var handler = const Pipeline() |
135 .addMiddleware(createMiddleware( | 134 .addMiddleware(createMiddleware( |
136 requestHandler: (request) => throw 'middleware error')) | 135 requestHandler: (request) => throw 'middleware error')) |
137 .addHandler(_failHandler); | 136 .addHandler(_failHandler); |
138 | 137 |
139 expect(makeSimpleRequest(handler), throwsA('middleware error')); | 138 expect(makeSimpleRequest(handler), throwsA('middleware error')); |
140 }); | 139 }); |
141 | 140 |
142 test('async error thrown by requestHandler bubbles down', () { | 141 test('async error thrown by requestHandler bubbles down', () { |
143 var handler = const Pipeline() | 142 var handler = const Pipeline() |
144 .addMiddleware(createMiddleware(requestHandler: (request) => | 143 .addMiddleware(createMiddleware( |
145 new Future.error('middleware error'))) | 144 requestHandler: (request) => |
| 145 new Future.error('middleware error'))) |
146 .addHandler(_failHandler); | 146 .addHandler(_failHandler); |
147 | 147 |
148 expect(makeSimpleRequest(handler), throwsA('middleware error')); | 148 expect(makeSimpleRequest(handler), throwsA('middleware error')); |
149 }); | 149 }); |
150 | 150 |
151 test('throw from responseHandler does not hit error handler', () { | 151 test('throw from responseHandler does not hit error handler', () { |
152 var middleware = createMiddleware(responseHandler: (response) { | 152 var middleware = createMiddleware(responseHandler: (response) { |
153 throw 'middleware error'; | 153 throw 'middleware error'; |
154 }, errorHandler: (e, s) => fail('should never get here')); | 154 }, errorHandler: (e, s) => fail('should never get here')); |
155 | 155 |
156 var handler = const Pipeline().addMiddleware(middleware) | 156 var handler = |
157 .addHandler(syncHandler); | 157 const Pipeline().addMiddleware(middleware).addHandler(syncHandler); |
158 | 158 |
159 expect(makeSimpleRequest(handler), throwsA('middleware error')); | 159 expect(makeSimpleRequest(handler), throwsA('middleware error')); |
160 }); | 160 }); |
161 | 161 |
162 test('requestHandler throw does not hit errorHandlers', () { | 162 test('requestHandler throw does not hit errorHandlers', () { |
163 var middleware = createMiddleware( | 163 var middleware = createMiddleware(requestHandler: (request) { |
164 requestHandler: (request) { | 164 throw 'middleware error'; |
165 throw 'middleware error'; | 165 }, errorHandler: (e, s) => fail('should never get here')); |
166 }, | |
167 errorHandler: (e, s) => fail('should never get here')); | |
168 | 166 |
169 var handler = const Pipeline().addMiddleware(middleware) | 167 var handler = |
170 .addHandler(syncHandler); | 168 const Pipeline().addMiddleware(middleware).addHandler(syncHandler); |
171 | 169 |
172 expect(makeSimpleRequest(handler), throwsA('middleware error')); | 170 expect(makeSimpleRequest(handler), throwsA('middleware error')); |
173 }); | 171 }); |
174 | 172 |
175 test('inner handler throws, is caught by errorHandler with response', () { | 173 test('inner handler throws, is caught by errorHandler with response', () { |
176 var middleware = createMiddleware( | 174 var middleware = createMiddleware(errorHandler: (error, stack) { |
177 errorHandler: (error, stack) { | 175 expect(error, 'bad handler'); |
178 expect(error, 'bad handler'); | 176 return _middlewareResponse; |
179 return _middlewareResponse; | 177 }); |
180 }); | |
181 | 178 |
182 var handler = const Pipeline().addMiddleware(middleware) | 179 var handler = const Pipeline() |
| 180 .addMiddleware(middleware) |
183 .addHandler((request) { | 181 .addHandler((request) { |
184 throw 'bad handler'; | 182 throw 'bad handler'; |
185 }); | 183 }); |
186 | 184 |
187 return makeSimpleRequest(handler).then((response) { | 185 return makeSimpleRequest(handler).then((response) { |
188 expect(response.headers['from'], 'middleware'); | 186 expect(response.headers['from'], 'middleware'); |
189 }); | 187 }); |
190 }); | 188 }); |
191 | 189 |
192 test('inner handler throws, is caught by errorHandler and rethrown', () { | 190 test('inner handler throws, is caught by errorHandler and rethrown', () { |
193 var middleware = createMiddleware(errorHandler: (error, stack) { | 191 var middleware = createMiddleware(errorHandler: (error, stack) { |
194 expect(error, 'bad handler'); | 192 expect(error, 'bad handler'); |
195 throw error; | 193 throw error; |
196 }); | 194 }); |
197 | 195 |
198 var handler = const Pipeline().addMiddleware(middleware) | 196 var handler = const Pipeline() |
| 197 .addMiddleware(middleware) |
199 .addHandler((request) { | 198 .addHandler((request) { |
200 throw 'bad handler'; | 199 throw 'bad handler'; |
201 }); | 200 }); |
202 | 201 |
203 expect(makeSimpleRequest(handler), throwsA('bad handler')); | 202 expect(makeSimpleRequest(handler), throwsA('bad handler')); |
204 }); | 203 }); |
205 | 204 |
206 test('error thrown by inner handler without a middleware errorHandler is ' | 205 test('error thrown by inner handler without a middleware errorHandler is ' |
207 'rethrown', () { | 206 'rethrown', () { |
208 var middleware = createMiddleware(); | 207 var middleware = createMiddleware(); |
209 | 208 |
210 var handler = const Pipeline().addMiddleware(middleware) | 209 var handler = const Pipeline() |
| 210 .addMiddleware(middleware) |
211 .addHandler((request) { | 211 .addHandler((request) { |
212 throw 'bad handler'; | 212 throw 'bad handler'; |
213 }); | 213 }); |
214 | 214 |
215 expect(makeSimpleRequest(handler), throwsA('bad handler')); | 215 expect(makeSimpleRequest(handler), throwsA('bad handler')); |
216 }); | 216 }); |
217 | 217 |
218 test("doesn't handle HijackException", () { | 218 test("doesn't handle HijackException", () { |
219 var middleware = createMiddleware(errorHandler: (error, stack) { | 219 var middleware = createMiddleware(errorHandler: (error, stack) { |
220 fail("error handler shouldn't be called"); | 220 fail("error handler shouldn't be called"); |
221 }); | 221 }); |
222 | 222 |
223 var handler = const Pipeline().addMiddleware(middleware) | 223 var handler = const Pipeline() |
| 224 .addMiddleware(middleware) |
224 .addHandler((request) => throw const HijackException()); | 225 .addHandler((request) => throw const HijackException()); |
225 | 226 |
226 expect(makeSimpleRequest(handler), | 227 expect(makeSimpleRequest(handler), |
227 throwsA(new isInstanceOf<HijackException>())); | 228 throwsA(new isInstanceOf<HijackException>())); |
228 }); | 229 }); |
229 }); | 230 }); |
230 } | 231 } |
231 | 232 |
232 _failHandler(Request request) => fail('should never get here'); | 233 _failHandler(Request request) => fail('should never get here'); |
233 | 234 |
234 final Response _middlewareResponse = | 235 final Response _middlewareResponse = |
235 new Response.ok('middleware content', headers: {'from': 'middleware'}); | 236 new Response.ok('middleware content', headers: {'from': 'middleware'}); |
OLD | NEW |