Chromium Code Reviews| Index: pkg/http/lib/src/mock_client.dart |
| diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e9e45191d2de25f954f70882e18526fc10d76f15 |
| --- /dev/null |
| +++ b/pkg/http/lib/src/mock_client.dart |
| @@ -0,0 +1,75 @@ |
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +library mock_client; |
| + |
| +import 'dart:io'; |
| + |
| +import 'base_client.dart'; |
| +import 'base_request.dart'; |
| +import 'request.dart'; |
| +import 'response.dart'; |
| +import 'streamed_response.dart'; |
| +import 'utils.dart'; |
| + |
| +// TODO(nweiz): once Dart has some sort of Rack- or WSGI-like standard for |
| +// server APIs, MockClient should conform to it. |
| + |
| +/// A mock HTTP client designed for use when testing code that uses |
| +/// [BaseClient]. This client allows you to define a handler callback for all |
| +/// requests that are made through it so that you can mock a server without |
| +/// having to send real HTTP requests. |
| +class MockClient extends BaseClient { |
| + /// The handler for receiving [StreamedRequest]s and sending |
| + /// [StreamedResponse]s. Setting this will override [handler]. |
| + set streamHandler(MockClientStreamHandler fn) => _handler = fn; |
|
Bob Nystrom
2012/11/05 20:36:04
Setters that don't have getters are a design smell
nweiz
2012/11/05 22:35:16
Made them constructor parameters.
|
| + MockClientStreamHandler _handler; |
| + |
| + /// The handler for receiving [Request]s and sending [Response]s. Setting this |
| + /// will override [streamHandler]. |
| + set handler(MockClientHandler fn) { |
| + _handler = (baseRequest, bodyStream) { |
| + return consumeInputStream(bodyStream).chain((bodyBytes) { |
| + var request = new Request(baseRequest.method, baseRequest.url); |
| + request.persistentConnection = baseRequest.persistentConnection; |
| + request.followRedirects = baseRequest.followRedirects; |
| + request.maxRedirects = baseRequest.maxRedirects; |
| + mapAddAll(request.headers, baseRequest.headers); |
| + request.bodyBytes = bodyBytes; |
| + request.finalize(); |
| + |
| + return fn(request); |
| + }).transform((response) { |
| + var stream = new ListInputStream(); |
| + stream.write(response.bodyBytes); |
| + stream.markEndOfStream(); |
| + |
| + return new StreamedResponse( |
| + stream, |
| + response.statusCode, |
| + response.contentLength, |
| + headers: response.headers, |
| + isRedirect: response.isRedirect, |
| + persistentConnection: response.persistentConnection, |
| + reasonPhrase: response.reasonPhrase); |
| + }); |
| + }; |
| + } |
| + |
| + /// Sends a request to be handled by [handler]. |
| + Future<StreamedResponse> send(BaseRequest request) { |
| + var bodyStream = request.finalize(); |
| + var redirectCount = 0; |
|
Bob Nystrom
2012/11/05 20:36:04
Remove this?
nweiz
2012/11/05 22:35:16
Done.
|
| + return async.chain((_) => _handler(request, bodyStream)); |
| + } |
| +} |
| + |
| +/// A handler function that receives [StreamedRequest]s and sends |
| +/// [StreamedResponse]s. Note that [request] will be finalized. |
| +typedef Future<StreamedResponse> MockClientStreamHandler( |
| + BaseRequest request, InputStream bodyStream); |
| + |
| +/// A handler function that receives [Request]s and sends [Response]s. Note that |
| +/// [request] will be finalized. |
| +typedef Future<Response> MockClientHandler(Request request); |