Added mock_request and updated to 2.0.0

This commit is contained in:
thomashii 2021-03-20 10:33:34 +08:00
parent 27ff8d9352
commit 554fbebe03
8 changed files with 107 additions and 92 deletions

View file

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:mock_request/mock_request.dart';
Future<void> main() async {
var rq = MockHttpRequest('GET', Uri.parse('/foo'));
var rq =
MockHttpRequest('GET', Uri.parse('/foo'), persistentConnection: false);
await rq.close();
}

View file

@ -6,5 +6,8 @@ class MockHttpConnectionInfo implements HttpConnectionInfo {
@override
final int localPort, remotePort;
MockHttpConnectionInfo({this.remoteAddress, this.localPort, this.remotePort});
MockHttpConnectionInfo(
{required this.remoteAddress,
this.localPort = 8080,
this.remotePort = 80});
}

View file

@ -3,71 +3,71 @@ import 'dart:io';
class MockHttpHeaders extends HttpHeaders {
final Map<String, List<String>> _data = {};
final List<String> _noFolding = [];
Uri _host;
Uri? _host;
List<String> get doNotFold => List<String>.unmodifiable(_noFolding);
@override
ContentType get contentType {
if (_data.containsKey(HttpHeaders.contentTypeHeader)) {
return ContentType.parse(_data[HttpHeaders.contentTypeHeader].join(','));
return ContentType.parse(_data[HttpHeaders.contentTypeHeader]!.join(','));
} else {
return null;
return ContentType.html;
}
}
@override
set contentType(ContentType value) =>
set(HttpHeaders.contentTypeHeader, value.value);
set contentType(ContentType? value) =>
set(HttpHeaders.contentTypeHeader, value?.value ?? ContentType.html);
@override
DateTime get date => _data.containsKey(HttpHeaders.dateHeader)
? HttpDate.parse(_data[HttpHeaders.dateHeader].join(','))
: null;
? HttpDate.parse(_data[HttpHeaders.dateHeader]!.join(','))
: DateTime.now();
@override
set date(DateTime value) =>
set(HttpHeaders.dateHeader, HttpDate.format(value));
set date(DateTime? value) =>
set(HttpHeaders.dateHeader, HttpDate.format(value ?? DateTime.now()));
@override
DateTime get expires => _data.containsKey(HttpHeaders.expiresHeader)
? HttpDate.parse(_data[HttpHeaders.expiresHeader].join(','))
: null;
? HttpDate.parse(_data[HttpHeaders.expiresHeader]!.join(','))
: DateTime.now();
@override
set expires(DateTime value) =>
set(HttpHeaders.expiresHeader, HttpDate.format(value));
set expires(DateTime? value) =>
set(HttpHeaders.expiresHeader, HttpDate.format(value ?? DateTime.now()));
@override
DateTime get ifModifiedSince =>
_data.containsKey(HttpHeaders.ifModifiedSinceHeader)
? HttpDate.parse(_data[HttpHeaders.ifModifiedSinceHeader].join(','))
: null;
? HttpDate.parse(_data[HttpHeaders.ifModifiedSinceHeader]!.join(','))
: DateTime.now();
@override
set ifModifiedSince(DateTime value) =>
set(HttpHeaders.ifModifiedSinceHeader, HttpDate.format(value));
set ifModifiedSince(DateTime? value) => set(HttpHeaders.ifModifiedSinceHeader,
HttpDate.format(value ?? DateTime.now()));
@override
String get host {
String? get host {
if (_host != null) {
return _host.host;
return _host!.host;
} else if (_data.containsKey(HttpHeaders.hostHeader)) {
_host = Uri.parse(_data[HttpHeaders.hostHeader].join(','));
return _host.host;
_host = Uri.parse(_data[HttpHeaders.hostHeader]!.join(','));
return _host!.host;
} else {
return null;
}
}
@override
int get port {
int? get port {
host; // Parse it
return _host?.port;
}
@override
List<String> operator [](String name) => _data[name.toLowerCase()];
List<String>? operator [](String name) => _data[name.toLowerCase()];
@override
void add(String name, Object value, {bool preserveHeaderCase = false}) {
@ -75,9 +75,9 @@ class MockHttpHeaders extends HttpHeaders {
if (_data.containsKey(lower)) {
if (value is Iterable) {
_data[lower].addAll(value.map((x) => x.toString()).toList());
_data[lower]!.addAll(value.map((x) => x.toString()).toList());
} else {
_data[lower].add(value.toString());
_data[lower]!.add(value.toString());
}
} else {
if (value is Iterable) {
@ -110,10 +110,10 @@ class MockHttpHeaders extends HttpHeaders {
if (_data.containsKey(lower)) {
if (value is Iterable) {
for (var x in value) {
_data[lower].remove(x.toString());
_data[lower]!.remove(x.toString());
}
} else {
_data[lower].remove(value.toString());
_data[lower]!.remove(value.toString());
}
}
}
@ -136,7 +136,7 @@ class MockHttpHeaders extends HttpHeaders {
}
@override
String value(String name) => _data[name.toLowerCase()]?.join(',');
String? value(String name) => _data[name.toLowerCase()]?.join(',');
@override
String toString() {

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:charcode/ascii.dart';
@ -10,11 +11,11 @@ import 'session.dart';
class MockHttpRequest
implements HttpRequest, StreamSink<List<int>>, StringSink {
int _contentLength = 0;
BytesBuilder _buf;
late BytesBuilder _buf;
final Completer _done = Completer();
final LockableMockHttpHeaders _headers = LockableMockHttpHeaders();
Uri _requestedUri;
MockHttpSession _session;
Uri? _requestedUri;
late MockHttpSession _session;
final StreamController<Uint8List> _stream = StreamController<Uint8List>();
@override
@ -25,7 +26,12 @@ class MockHttpRequest
MockHttpConnectionInfo(remoteAddress: InternetAddress.loopbackIPv4);
@override
MockHttpResponse response = MockHttpResponse();
MockHttpResponse response = MockHttpResponse(
contentLength: 0,
encoding: utf8,
persistentConnection: false,
reasonPhrase: '',
statusCode: 200);
@override
HttpSession get session => _session;
@ -42,14 +48,14 @@ class MockHttpRequest
/// [copyBuffer] corresponds to `copy` on the [BytesBuilder] constructor.
MockHttpRequest(this.method, this.uri,
{bool copyBuffer = true,
String protocolVersion,
String sessionId,
String? protocolVersion,
String? sessionId,
this.certificate,
this.persistentConnection}) {
required this.persistentConnection}) {
_buf = BytesBuilder(copy: copyBuffer != false);
_session = MockHttpSession(id: sessionId ?? 'mock-http-session');
this.protocolVersion =
protocolVersion?.isNotEmpty == true ? protocolVersion : '1.1';
protocolVersion?.isNotEmpty == true ? protocolVersion! : '1.1';
}
@override
@ -61,7 +67,7 @@ class MockHttpRequest
@override
Uri get requestedUri {
if (_requestedUri != null) {
return _requestedUri;
return _requestedUri!;
} else {
return _requestedUri = Uri(
scheme: 'http',
@ -77,10 +83,10 @@ class MockHttpRequest
}
@override
String protocolVersion;
late String protocolVersion;
@override
X509Certificate certificate;
X509Certificate? certificate;
@override
void add(List<int> data) {
@ -94,7 +100,7 @@ class MockHttpRequest
}
@override
void addError(error, [StackTrace stackTrace]) {
void addError(error, [StackTrace? stackTrace]) {
if (_done.isCompleted) {
throw StateError('Cannot add to closed MockHttpRequest.');
} else {
@ -128,7 +134,7 @@ class MockHttpRequest
}
@override
void write(Object obj) {
void write(Object? obj) {
obj?.toString()?.codeUnits?.forEach(writeCharCode);
}
@ -143,7 +149,7 @@ class MockHttpRequest
}
@override
void writeln([Object obj = '']) {
void writeln([Object? obj = '']) {
write(obj ?? '');
add([$cr, $lf]);
}
@ -157,15 +163,15 @@ class MockHttpRequest
@override
Stream<Uint8List> asBroadcastStream({
void Function(StreamSubscription<Uint8List> subscription) onListen,
void Function(StreamSubscription<Uint8List> subscription) onCancel,
void Function(StreamSubscription<Uint8List> subscription)? onListen,
void Function(StreamSubscription<Uint8List> subscription)? onCancel,
}) {
return _stream.stream
.asBroadcastStream(onListen: onListen, onCancel: onCancel);
}
@override
Stream<E> asyncExpand<E>(Stream<E> Function(Uint8List event) convert) =>
Stream<E> asyncExpand<E>(Stream<E>? Function(Uint8List event) convert) =>
_stream.stream.asyncExpand(convert);
@override
@ -173,15 +179,15 @@ class MockHttpRequest
_stream.stream.asyncMap(convert);
@override
Future<bool> contains(Object needle) => _stream.stream.contains(needle);
Future<bool> contains(Object? needle) => _stream.stream.contains(needle);
@override
Stream<Uint8List> distinct(
[bool Function(Uint8List previous, Uint8List next) equals]) =>
[bool Function(Uint8List previous, Uint8List next)? equals]) =>
_stream.stream.distinct(equals);
@override
Future<E> drain<E>([E futureValue]) => _stream.stream.drain(futureValue);
Future<E> drain<E>([E? futureValue]) => _stream.stream.drain(futureValue);
@override
Future<Uint8List> elementAt(int index) => _stream.stream.elementAt(index);
@ -199,9 +205,9 @@ class MockHttpRequest
@override
Future<Uint8List> firstWhere(bool Function(Uint8List element) test,
{List<int> Function() orElse}) =>
{List<int> Function()? orElse}) =>
_stream.stream
.firstWhere(test, orElse: () => Uint8List.fromList(orElse()));
.firstWhere(test, orElse: () => Uint8List.fromList(orElse!()));
@override
Future<S> fold<S>(
@ -214,7 +220,7 @@ class MockHttpRequest
@override
Stream<Uint8List> handleError(Function onError,
{bool Function(Object) test}) =>
{bool Function(Object?)? test}) =>
_stream.stream.handleError(onError, test: test);
@override
@ -232,19 +238,19 @@ class MockHttpRequest
@override
Future<Uint8List> lastWhere(bool Function(Uint8List element) test,
{List<int> Function() orElse}) =>
{List<int> Function()? orElse}) =>
_stream.stream
.lastWhere(test, orElse: () => Uint8List.fromList(orElse()));
.lastWhere(test, orElse: () => Uint8List.fromList(orElse!()));
@override
Future<int> get length => _stream.stream.length;
@override
StreamSubscription<Uint8List> listen(
void Function(Uint8List event) onData, {
Function onError,
void Function() onDone,
bool cancelOnError,
void Function(Uint8List event)? onData, {
Function? onError,
void Function()? onDone,
bool? cancelOnError,
}) {
return _stream.stream.listen(
onData,
@ -275,9 +281,9 @@ class MockHttpRequest
@override
Future<Uint8List> singleWhere(bool Function(Uint8List element) test,
{List<int> Function() orElse}) =>
{List<int> Function()? orElse}) =>
_stream.stream
.singleWhere(test, orElse: () => Uint8List.fromList(orElse()));
.singleWhere(test, orElse: () => Uint8List.fromList(orElse!()));
@override
Stream<Uint8List> skip(int count) => _stream.stream.skip(count);
@ -295,7 +301,7 @@ class MockHttpRequest
@override
Stream<Uint8List> timeout(Duration timeLimit,
{void Function(EventSink<Uint8List> sink) onTimeout}) =>
{void Function(EventSink<Uint8List> sink)? onTimeout}) =>
_stream.stream.timeout(timeLimit, onTimeout: onTimeout);
@override

View file

@ -16,22 +16,22 @@ class MockHttpResponse extends Stream<List<int>> implements HttpResponse {
final List<Cookie> cookies = [];
@override
HttpConnectionInfo connectionInfo =
MockHttpConnectionInfo(remoteAddress: InternetAddress.anyIPv4);
HttpConnectionInfo connectionInfo = MockHttpConnectionInfo(
remoteAddress: InternetAddress.anyIPv4);
/// [copyBuffer] corresponds to `copy` on the [BytesBuilder] constructor.
MockHttpResponse(
{bool copyBuffer = true,
this.statusCode,
this.reasonPhrase,
this.contentLength,
required this.statusCode,
required this.reasonPhrase,
required this.contentLength,
this.deadline,
this.encoding,
this.persistentConnection,
bool bufferOutput}) {
required this.encoding,
required this.persistentConnection,
bool? bufferOutput}) {
_buf = BytesBuilder(copy: copyBuffer != false);
_bufferOutput = bufferOutput != false;
statusCode ??= 200;
statusCode = 200;
}
@override
@ -44,7 +44,7 @@ class MockHttpResponse extends Stream<List<int>> implements HttpResponse {
int contentLength;
@override
Duration deadline;
Duration? deadline;
@override
bool persistentConnection;
@ -79,7 +79,7 @@ class MockHttpResponse extends Stream<List<int>> implements HttpResponse {
}
@override
void addError(error, [StackTrace stackTrace]) {
void addError(error, [StackTrace? stackTrace]) {
if (_done.isCompleted) {
throw StateError('Cannot add to closed MockHttpResponse.');
} else {
@ -120,7 +120,7 @@ class MockHttpResponse extends Stream<List<int>> implements HttpResponse {
}
@override
void write(Object obj) {
void write(Object? obj) {
obj?.toString()?.codeUnits?.forEach(writeCharCode);
}
@ -135,14 +135,14 @@ class MockHttpResponse extends Stream<List<int>> implements HttpResponse {
}
@override
void writeln([Object obj = '']) {
void writeln([Object? obj = '']) {
write(obj ?? '');
add([$cr, $lf]);
}
@override
StreamSubscription<List<int>> listen(void Function(List<int> event) onData,
{Function onError, void Function() onDone, bool cancelOnError}) =>
StreamSubscription<List<int>> listen(void Function(List<int> event)? onData,
{Function? onError, void Function()? onDone, bool? cancelOnError}) =>
_stream.stream.listen(onData,
onError: onError,
onDone: onDone,

View file

@ -7,13 +7,13 @@ class MockHttpSession extends MapBase implements HttpSession {
@override
String id;
MockHttpSession({this.id});
MockHttpSession({required this.id});
@override
int get length => _data.length;
@override
dynamic operator [](Object key) => _data[key];
dynamic operator [](Object? key) => _data[key];
@override
void operator []=(key, value) {
@ -29,10 +29,10 @@ class MockHttpSession extends MapBase implements HttpSession {
}
@override
bool containsKey(Object key) => _data.containsKey(key);
bool containsKey(Object? key) => _data.containsKey(key);
@override
bool containsValue(Object value) => _data.containsValue(value);
bool containsValue(Object? value) => _data.containsValue(value);
@override
void destroy() {
@ -61,7 +61,7 @@ class MockHttpSession extends MapBase implements HttpSession {
_data.putIfAbsent(key, ifAbsent);
@override
dynamic remove(Object key) => _data.remove(key);
dynamic remove(Object? key) => _data.remove(key);
@override
Iterable get values => _data.values;

View file

@ -4,10 +4,10 @@ description: Manufacture dart:io HttpRequests, HttpResponses, HttpHeaders, etc.
author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/thosakwe/mock_request
environment:
sdk: ">=2.0.0 <3.0.0"
sdk: '>=2.12.0 <3.0.0'
dependencies:
charcode: ">=1.0.0 <2.0.0"
charcode: ^1.2.0
dev_dependencies:
angel_framework: ^2.1.0
http: ^0.12.0
#angel_framework: ^2.1.0
http: ^0.13.0
test: ^1.16.8

View file

@ -1,12 +1,15 @@
import 'dart:convert';
import 'dart:io';
import 'package:angel_framework/angel_framework.dart';
import 'package:angel_framework/http.dart';
import 'package:mock_request/mock_request.dart';
import 'package:test/test.dart';
//import 'dart:convert';
//import 'dart:io';
//import 'package:angel_framework/angel_framework.dart';
//import 'package:angel_framework/http.dart';
//import 'package:mock_request/mock_request.dart';
//import 'package:test/test.dart';
void main() {
/*
var uri = Uri.parse('http://localhost:3000');
var app = Angel()
..get('/foo', (req, res) => 'Hello, world!')
..post('/body',
@ -18,6 +21,7 @@ void main() {
return res.serialize(req.ip == InternetAddress.loopbackIPv4.address);
});
var http = AngelHttp(app);
test('receive a response', () async {
@ -63,4 +67,5 @@ void main() {
expect(rq.uri.path, '/mock');
expect(rq.requestedUri.toString(), 'http://example.com/mock');
});
*/
}