blob: 9370e0e1d4a825cef6a39c78bfc32a1b24b55517 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_driver/src/common/error.dart';
import 'package:flutter_driver/src/common/health.dart';
import 'package:flutter_driver/src/driver/web_driver.dart';
import 'package:webdriver/src/common/log.dart';
import '../../common.dart';
void main() {
group('WebDriver', () {
late FakeFlutterWebConnection fakeConnection;
late WebFlutterDriver driver;
setUp(() {
fakeConnection = FakeFlutterWebConnection();
driver = WebFlutterDriver.connectedTo(fakeConnection);
});
test('sendCommand succeeds', () async {
fakeConnection.fakeResponse = '''
{
"isError": false,
"response": {
"test": "hello"
}
}
''';
final Map<String, Object?> response = await driver.sendCommand(const GetHealth());
expect(response['test'], 'hello');
});
test('sendCommand fails on communication error', () async {
fakeConnection.communicationError = Error();
expect(
() => driver.sendCommand(const GetHealth()),
_throwsDriverErrorWithMessage(
'FlutterDriver command GetHealth failed due to a remote error.\n'
'Command sent: {"command":"get_health"}'
),
);
});
test('sendCommand fails on null', () async {
fakeConnection.fakeResponse = null;
expect(
() => driver.sendCommand(const GetHealth()),
_throwsDriverErrorWithDataString('Null', 'null'),
);
});
test('sendCommand fails when response data is not a string', () async {
fakeConnection.fakeResponse = 1234;
expect(
() => driver.sendCommand(const GetHealth()),
_throwsDriverErrorWithDataString('int', '1234'),
);
});
test('sendCommand fails when isError is true', () async {
fakeConnection.fakeResponse = '''
{
"isError": true,
"response": "test error message"
}
''';
expect(
() => driver.sendCommand(const GetHealth()),
_throwsDriverErrorWithMessage(
'Error in Flutter application: test error message'
),
);
});
test('sendCommand fails when isError is not bool', () async {
fakeConnection.fakeResponse = '{ "isError": 5 }';
expect(
() => driver.sendCommand(const GetHealth()),
_throwsDriverErrorWithDataString('String', '{ "isError": 5 }'),
);
});
test('sendCommand fails when "response" field is not a JSON map', () async {
fakeConnection.fakeResponse = '{ "response": 5 }';
expect(
() => driver.sendCommand(const GetHealth()),
_throwsDriverErrorWithDataString('String', '{ "response": 5 }'),
);
});
});
}
Matcher _throwsDriverErrorWithMessage(String expectedMessage) {
return throwsA(allOf(
isA<DriverError>(),
predicate<DriverError>((DriverError error) {
final String actualMessage = error.message;
return actualMessage == expectedMessage;
}, 'contains message: $expectedMessage'),
));
}
Matcher _throwsDriverErrorWithDataString(String dataType, String dataString) {
return _throwsDriverErrorWithMessage(
'Received malformed response from the FlutterDriver extension.\n'
'Expected a JSON map containing a "response" field and, optionally, an '
'"isError" field, but got $dataType: $dataString'
);
}
class FakeFlutterWebConnection implements FlutterWebConnection {
@override
bool supportsTimelineAction = false;
@override
Future<void> close() async {}
@override
Stream<LogEntry> get logs => throw UnimplementedError();
@override
Future<List<int>> screenshot() {
throw UnimplementedError();
}
Object? fakeResponse;
Error? communicationError;
@override
Future<Object?> sendCommand(String script, Duration? duration) async {
if (communicationError != null) {
throw communicationError!;
}
return fakeResponse;
}
}