| 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 Stack() | 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 Stack() | 29 var handler = const Pipeline() |
| 30 .addMiddleware(createMiddleware(requestHandler: (request) => null)) | 30 .addMiddleware(createMiddleware(requestHandler: (request) => null)) |
| 31 .addHandler(syncHandler); | 31 .addHandler(syncHandler); |
| 32 | 32 |
| 33 return makeSimpleRequest(handler).then((response) { | 33 return makeSimpleRequest(handler).then((response) { |
| 34 expect(response.headers['from'], isNull); | 34 expect(response.headers['from'], isNull); |
| 35 }); | 35 }); |
| 36 }); | 36 }); |
| 37 | 37 |
| 38 test('async null response forwards to inner handler', () { | 38 test('async null response forwards to inner handler', () { |
| 39 var handler = const Stack() | 39 var handler = const Pipeline() |
| 40 .addMiddleware(createMiddleware( | 40 .addMiddleware(createMiddleware( |
| 41 requestHandler: (request) => new Future.value(null))) | 41 requestHandler: (request) => new Future.value(null))) |
| 42 .addHandler(syncHandler); | 42 .addHandler(syncHandler); |
| 43 | 43 |
| 44 return makeSimpleRequest(handler).then((response) { | 44 return makeSimpleRequest(handler).then((response) { |
| 45 expect(response.headers['from'], isNull); | 45 expect(response.headers['from'], isNull); |
| 46 }); | 46 }); |
| 47 }); | 47 }); |
| 48 | 48 |
| 49 test('sync response is returned', () { | 49 test('sync response is returned', () { |
| 50 var handler = const Stack() | 50 var handler = const Pipeline() |
| 51 .addMiddleware(createMiddleware( | 51 .addMiddleware(createMiddleware( |
| 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 Stack() | 61 var handler = const Pipeline() |
| 62 .addMiddleware(createMiddleware(requestHandler: (request) => | 62 .addMiddleware(createMiddleware(requestHandler: (request) => |
| 63 new Future.value(_middlewareResponse))) | 63 new Future.value(_middlewareResponse))) |
| 64 .addHandler(_failHandler); | 64 .addHandler(_failHandler); |
| 65 | 65 |
| 66 return makeSimpleRequest(handler).then((response) { | 66 return makeSimpleRequest(handler).then((response) { |
| 67 expect(response.headers['from'], 'middleware'); | 67 expect(response.headers['from'], 'middleware'); |
| 68 }); | 68 }); |
| 69 }); | 69 }); |
| 70 | 70 |
| 71 group('with responseHandler', () { | 71 group('with responseHandler', () { |
| 72 test('with sync result, responseHandler is not called', () { | 72 test('with sync result, responseHandler is not called', () { |
| 73 var middleware = createMiddleware( | 73 var middleware = createMiddleware( |
| 74 requestHandler: (request) => _middlewareResponse, | 74 requestHandler: (request) => _middlewareResponse, |
| 75 responseHandler: (response) => fail('should not be called')); | 75 responseHandler: (response) => fail('should not be called')); |
| 76 | 76 |
| 77 var handler = const Stack() | 77 var handler = const Pipeline() |
| 78 .addMiddleware(middleware) | 78 .addMiddleware(middleware) |
| 79 .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 Stack() | 90 var handler = const Pipeline() |
| 91 .addMiddleware(middleware) | 91 .addMiddleware(middleware) |
| 92 .addHandler(syncHandler); | 92 .addHandler(syncHandler); |
| 93 | 93 |
| 94 return makeSimpleRequest(handler).then((response) { | 94 return makeSimpleRequest(handler).then((response) { |
| 95 expect(response.headers['from'], 'middleware'); | 95 expect(response.headers['from'], 'middleware'); |
| 96 }); | 96 }); |
| 97 }); | 97 }); |
| 98 }); | 98 }); |
| 99 }); | 99 }); |
| 100 | 100 |
| 101 group('responseHandler', () { | 101 group('responseHandler', () { |
| 102 test('innerHandler sync response is seen, replaced value continues', () { | 102 test('innerHandler sync response is seen, replaced value continues', () { |
| 103 var handler = const Stack().addMiddleware(createMiddleware( | 103 var handler = const Pipeline().addMiddleware(createMiddleware( |
| 104 responseHandler: (response) { | 104 responseHandler: (response) { |
| 105 expect(response.headers['from'], 'handler'); | 105 expect(response.headers['from'], 'handler'); |
| 106 return _middlewareResponse; | 106 return _middlewareResponse; |
| 107 })).addHandler((request) { | 107 })).addHandler((request) { |
| 108 return syncHandler(request, headers: {'from' : 'handler'} ); | 108 return syncHandler(request, headers: {'from' : 'handler'} ); |
| 109 }); | 109 }); |
| 110 | 110 |
| 111 return makeSimpleRequest(handler).then((response) { | 111 return makeSimpleRequest(handler).then((response) { |
| 112 expect(response.headers['from'], 'middleware'); | 112 expect(response.headers['from'], 'middleware'); |
| 113 }); | 113 }); |
| 114 }); | 114 }); |
| 115 | 115 |
| 116 test('innerHandler async response is seen, async value continues', () { | 116 test('innerHandler async response is seen, async value continues', () { |
| 117 var handler = const Stack().addMiddleware( | 117 var handler = const Pipeline().addMiddleware( |
| 118 createMiddleware(responseHandler: (response) { | 118 createMiddleware(responseHandler: (response) { |
| 119 expect(response.headers['from'], 'handler'); | 119 expect(response.headers['from'], 'handler'); |
| 120 return new Future.value(_middlewareResponse); | 120 return new Future.value(_middlewareResponse); |
| 121 })).addHandler((request) { | 121 })).addHandler((request) { |
| 122 return new Future(() => syncHandler( | 122 return new Future(() => syncHandler( |
| 123 request, headers: {'from' : 'handler'} )); | 123 request, headers: {'from' : 'handler'} )); |
| 124 }); | 124 }); |
| 125 | 125 |
| 126 return makeSimpleRequest(handler).then((response) { | 126 return makeSimpleRequest(handler).then((response) { |
| 127 expect(response.headers['from'], 'middleware'); | 127 expect(response.headers['from'], 'middleware'); |
| 128 }); | 128 }); |
| 129 }); | 129 }); |
| 130 }); | 130 }); |
| 131 | 131 |
| 132 group('error handling', () { | 132 group('error handling', () { |
| 133 test('sync error thrown by requestHandler bubbles down', () { | 133 test('sync error thrown by requestHandler bubbles down', () { |
| 134 var handler = const Stack() | 134 var handler = const Pipeline() |
| 135 .addMiddleware(createMiddleware( | 135 .addMiddleware(createMiddleware( |
| 136 requestHandler: (request) => throw 'middleware error')) | 136 requestHandler: (request) => throw 'middleware error')) |
| 137 .addHandler(_failHandler); | 137 .addHandler(_failHandler); |
| 138 | 138 |
| 139 expect(makeSimpleRequest(handler), throwsA('middleware error')); | 139 expect(makeSimpleRequest(handler), throwsA('middleware error')); |
| 140 }); | 140 }); |
| 141 | 141 |
| 142 test('async error thrown by requestHandler bubbles down', () { | 142 test('async error thrown by requestHandler bubbles down', () { |
| 143 var handler = const Stack() | 143 var handler = const Pipeline() |
| 144 .addMiddleware(createMiddleware(requestHandler: (request) => | 144 .addMiddleware(createMiddleware(requestHandler: (request) => |
| 145 new Future.error('middleware error'))) | 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 Stack().addMiddleware(middleware) | 156 var handler = const Pipeline().addMiddleware(middleware) |
| 157 .addHandler(syncHandler); | 157 .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( |
| 164 requestHandler: (request) { | 164 requestHandler: (request) { |
| 165 throw 'middleware error'; | 165 throw 'middleware error'; |
| 166 }, | 166 }, |
| 167 errorHandler: (e, s) => fail('should never get here')); | 167 errorHandler: (e, s) => fail('should never get here')); |
| 168 | 168 |
| 169 var handler = const Stack().addMiddleware(middleware) | 169 var handler = const Pipeline().addMiddleware(middleware) |
| 170 .addHandler(syncHandler); | 170 .addHandler(syncHandler); |
| 171 | 171 |
| 172 expect(makeSimpleRequest(handler), throwsA('middleware error')); | 172 expect(makeSimpleRequest(handler), throwsA('middleware error')); |
| 173 }); | 173 }); |
| 174 | 174 |
| 175 test('inner handler throws, is caught by errorHandler with response', () { | 175 test('inner handler throws, is caught by errorHandler with response', () { |
| 176 var middleware = createMiddleware( | 176 var middleware = createMiddleware( |
| 177 errorHandler: (error, stack) { | 177 errorHandler: (error, stack) { |
| 178 expect(error, 'bad handler'); | 178 expect(error, 'bad handler'); |
| 179 return _middlewareResponse; | 179 return _middlewareResponse; |
| 180 }); | 180 }); |
| 181 | 181 |
| 182 var handler = const Stack().addMiddleware(middleware) | 182 var handler = const Pipeline().addMiddleware(middleware) |
| 183 .addHandler((request) { | 183 .addHandler((request) { |
| 184 throw 'bad handler'; | 184 throw 'bad handler'; |
| 185 }); | 185 }); |
| 186 | 186 |
| 187 return makeSimpleRequest(handler).then((response) { | 187 return makeSimpleRequest(handler).then((response) { |
| 188 expect(response.headers['from'], 'middleware'); | 188 expect(response.headers['from'], 'middleware'); |
| 189 }); | 189 }); |
| 190 }); | 190 }); |
| 191 | 191 |
| 192 test('inner handler throws, is caught by errorHandler and rethrown', () { | 192 test('inner handler throws, is caught by errorHandler and rethrown', () { |
| 193 var middleware = createMiddleware(errorHandler: (error, stack) { | 193 var middleware = createMiddleware(errorHandler: (error, stack) { |
| 194 expect(error, 'bad handler'); | 194 expect(error, 'bad handler'); |
| 195 throw error; | 195 throw error; |
| 196 }); | 196 }); |
| 197 | 197 |
| 198 var handler = const Stack().addMiddleware(middleware) | 198 var handler = const Pipeline().addMiddleware(middleware) |
| 199 .addHandler((request) { | 199 .addHandler((request) { |
| 200 throw 'bad handler'; | 200 throw 'bad handler'; |
| 201 }); | 201 }); |
| 202 | 202 |
| 203 expect(makeSimpleRequest(handler), throwsA('bad handler')); | 203 expect(makeSimpleRequest(handler), throwsA('bad handler')); |
| 204 }); | 204 }); |
| 205 }); | 205 }); |
| 206 } | 206 } |
| 207 | 207 |
| 208 _failHandler(Request request) => fail('should never get here'); | 208 _failHandler(Request request) => fail('should never get here'); |
| 209 | 209 |
| 210 final Response _middlewareResponse = | 210 final Response _middlewareResponse = |
| 211 new Response.ok('middleware content', headers: {'from': 'middleware'}); | 211 new Response.ok('middleware content', headers: {'from': 'middleware'}); |
| OLD | NEW |