diff --git a/packages/spookie/lib/spookie.dart b/packages/spookie/lib/spookie.dart index f3eae985..9ec86b91 100644 --- a/packages/spookie/lib/spookie.dart +++ b/packages/spookie/lib/spookie.dart @@ -5,12 +5,13 @@ import 'src/http_expectation.dart'; export 'package:test/test.dart'; -typedef TestApp = Function(HttpRequest req); +typedef HttpRequestHandler = Function(HttpRequest req); abstract interface class Spookie { - late final HttpServer _server; + factory Spookie.server(HttpServer server) => + _$SpookieImpl(getServerUri(server)); - Spookie._(HttpServer server) : _server = server; + factory Spookie.uri(Uri uri) => _$SpookieImpl(uri); Spookie auth(String user, String pass); @@ -46,14 +47,14 @@ abstract interface class Spookie { }); } -class _$SpookieImpl extends Spookie { - Uri get serverUri => getServerUri(_server); +class _$SpookieImpl implements Spookie { + final Uri baseUri; - _$SpookieImpl(super.server) : super._() { + _$SpookieImpl(this.baseUri) { _headers.clear(); } - Uri getUri(String path) => Uri.parse('$serverUri$path'); + Uri getUri(String path) => baseUri.replace(path: path); final Map _headers = {}; @@ -139,18 +140,18 @@ class _$SpookieImpl extends Spookie { } class SpookieAgent { - static _$SpookieImpl? _instance; + static Spookie? _instance; + static HttpServer? _server; - static Future create(TestApp app) async { + static Future create(HttpRequestHandler app) async { if (_instance != null) { - await _instance!._server.close(); - _instance = null; + await _server?.close(); + _server = null; } - final server = await HttpServer.bind('127.0.0.1', 0) + _server = await HttpServer.bind(InternetAddress.anyIPv4, 0) ..listen(app); - _instance = _$SpookieImpl(server); - return _instance!; + return _instance = Spookie.server(_server!); } } @@ -171,7 +172,6 @@ Uri getServerUri(HttpServer server) { return Uri(scheme: 'http', host: server.address.address, port: server.port); } -Future request(T app) async { - final tester = await SpookieAgent.create((app as dynamic).handleRequest); - return tester; +Future request(T app) async { + return SpookieAgent.create((app as dynamic).handleRequest); } diff --git a/packages/spookie/test/spookie_test.dart b/packages/spookie/test/spookie_test.dart index ca49c9e4..1d2cd0a1 100644 --- a/packages/spookie/test/spookie_test.dart +++ b/packages/spookie/test/spookie_test.dart @@ -18,12 +18,17 @@ void main() { test('should work with an active server', () async { final app = Pharaoh() - ..post('/hello', (req, res) => res.ok('Hello World')); - await (await (request(app))).get('/').expectStatus(404).test(); - await (await (request(app))) + ..post('/hello', (req, res) => res.ok('Active Server')); + + await app.listen(port: 5050); + + await Spookie.uri(app.uri) .post('/hello', {}) + .expectBody('Active Server') .expectStatus(200) .test(); + + await app.shutdown(); }); test('should work with remote server', () async {