Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 39 additions & 16 deletions lib/stubber.dart
Original file line number Diff line number Diff line change
@@ -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<void> Function(HttpRequest request) onMissingStub;

Stubber({this.onMissingStub});

MockWebServer _mockWebServer = MockWebServer(port: 8081);

HashMap<String, Stub> stubs = HashMap();
start() async {
await _mockWebServer.start();
Expand All @@ -26,18 +31,24 @@ class Stubber {
Future<MockResponse> _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;
Expand All @@ -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);
}

}
}
42 changes: 23 additions & 19 deletions lib/wrapper.dart
Original file line number Diff line number Diff line change
@@ -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<void> Function(HttpRequest request) onMissingStub;

static addStub(Stub stub) {
_stubber.stub(stub);
}
static Future<void> start(Iterable<StepDefinitionBase> steps,[Iterable<Hook> hooks]) async {

static Future<void> start(Iterable<StepDefinitionBase> steps,
[Iterable<Hook> 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<Hook> arrHooks=[];
if(hooks!=null){
List<Hook> 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
Expand All @@ -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();
Expand Down