diff --git a/lib/stubber.dart b/lib/stubber.dart index 2b8164f..323afc7 100644 --- a/lib/stubber.dart +++ b/lib/stubber.dart @@ -1,10 +1,15 @@ import 'dart:collection'; import 'dart:io'; -import 'package:flutter_gherkin_addons/flutter_gherkin_addons.dart'; + import 'package:mock_web_server/mock_web_server.dart'; class Stubber { + Future Function(HttpRequest request) onMissingStub; + + Stubber({this.onMissingStub}); + MockWebServer _mockWebServer = MockWebServer(port: 8081); + HashMap stubs = HashMap(); start() async { await _mockWebServer.start(); @@ -26,18 +31,24 @@ class Stubber { Future _dispatcher(HttpRequest request) async { if (stubs.containsKey(_requestToKey(request))) { var _stub = stubs[_requestToKey(request)]; - var _response=_stub._responseBuilder(request); + var _response = _stub._responseBuilder(request); return MockResponse() ..httpCode = _response._statusCode ..body = _response._body ..headers = _response.headers; + } else { + if (onMissingStub != null) { + await onMissingStub(request); + } } return _defaultAnswer; } get _defaultAnswer => MockResponse()..httpCode = 404; } + typedef Response ResponseBuilder(HttpRequest request); + class Stub { final String url; final String method; @@ -56,39 +67,51 @@ class Response { Response(this._statusCode, this._body, {this.headers}); } + class StubFor { - static Stub staticHttpGet(String url, Response response){ + static Stub staticHttpGet(String url, Response response) { return _staticStub("GET", url, response); } - static Stub staticHttpPost(String url, Response response){ + + static Stub staticHttpPost(String url, Response response) { return _staticStub("POST", url, response); } - static Stub staticHttpPut(String url, Response response){ + + static Stub staticHttpPut(String url, Response response) { return _staticStub("PUT", url, response); } - static Stub staticHttpPatch(String url, Response response){ + + static Stub staticHttpPatch(String url, Response response) { return _staticStub("PATCH", url, response); } - static Stub staticHttpDelete(String url, Response response){ + + static Stub staticHttpDelete(String url, Response response) { return _staticStub("DELETE", url, response); } - static Stub _staticStub(String method, String url, Response response){ - return Stub(method, url, (request) {return response;}); + + static Stub _staticStub(String method, String url, Response response) { + return Stub(method, url, (request) { + return response; + }); } - static Stub httpGet(String url, ResponseBuilder responseBuilder){ + + static Stub httpGet(String url, ResponseBuilder responseBuilder) { return Stub("GET", url, responseBuilder); } - static Stub httpPost(String url, ResponseBuilder responseBuilder){ + + static Stub httpPost(String url, ResponseBuilder responseBuilder) { return Stub("POST", url, responseBuilder); } - static Stub httpPut(String url, ResponseBuilder responseBuilder){ + + static Stub httpPut(String url, ResponseBuilder responseBuilder) { return Stub("PUT", url, responseBuilder); } - static Stub httpPatch(String url, ResponseBuilder responseBuilder){ + + static Stub httpPatch(String url, ResponseBuilder responseBuilder) { return Stub("PATCH", url, responseBuilder); } - static Stub httpDelete(String url, ResponseBuilder responseBuilder){ + + static Stub httpDelete(String url, ResponseBuilder responseBuilder) { return Stub("DELETE", url, responseBuilder); } - -} \ No newline at end of file +} diff --git a/lib/wrapper.dart b/lib/wrapper.dart index c8c5fcf..fa69d8b 100644 --- a/lib/wrapper.dart +++ b/lib/wrapper.dart @@ -1,40 +1,44 @@ import 'dart:io'; +import 'dart:io' show Platform; + +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:flutter_gherkin/flutter_gherkin.dart'; import 'package:flutter_gherkin_addons/stubber.dart'; import 'package:gherkin/gherkin.dart'; -import 'package:flutter_gherkin/flutter_gherkin.dart'; import 'package:glob/glob.dart'; -import 'package:flutter_driver/flutter_driver.dart'; import "package:path/path.dart" show dirname; -import 'dart:io' show Platform; - import 'package:yaml/yaml.dart'; class TestRuntime { static Stubber _stubber; - static addStub(Stub stub){ + + static Future Function(HttpRequest request) onMissingStub; + + static addStub(Stub stub) { _stubber.stub(stub); } - static Future start(Iterable steps,[Iterable hooks]) async { + + static Future start(Iterable steps, + [Iterable hooks]) async { String path = dirname(Platform.script.toString()); int index = path.indexOf("test_driver"); String dir = path.substring(index); Map mapConfig = loadYaml(new File("$dir/config.yaml").readAsStringSync()); - List arrHooks=[]; - if(hooks!=null){ + List arrHooks = []; + if (hooks != null) { arrHooks.addAll(hooks); } - if(mapConfig['screenshots']!=null && mapConfig['screenshots']){ + if (mapConfig['screenshots'] != null && mapConfig['screenshots']) { arrHooks.add(AttachScreenshotOnFailedStepHook()); } - var reporters=mapConfig['reporting']!=null && mapConfig['reporting']?[ - ProgressReporter(), - TestRunSummaryReporter(), - JsonReporter(path: testOutputsDirectory + '/report.json') - ]:[ - ProgressReporter(), - TestRunSummaryReporter() - ]; - _stubber = Stubber(); + var reporters = mapConfig['reporting'] != null && mapConfig['reporting'] + ? [ + ProgressReporter(), + TestRunSummaryReporter(), + JsonReporter(path: testOutputsDirectory + '/report.json') + ] + : [ProgressReporter(), TestRunSummaryReporter()]; + _stubber = Stubber(onMissingStub: onMissingStub); var config = FlutterTestConfiguration() ..features = [Glob("$dir/features/**.feature")] ..hooks = arrHooks @@ -43,7 +47,7 @@ class TestRuntime { ..restartAppBetweenScenarios = true ..targetAppPath = "$dir/app.dart" ..exitAfterTestRun = true; - if(mapConfig['stubbing']!=null && mapConfig['stubbing']) { + if (mapConfig['stubbing'] != null && mapConfig['stubbing']) { await _stubber.start(); await GherkinRunner().execute(config); return await _stubber.stop();