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