98 lines
3.4 KiB
Dart
98 lines
3.4 KiB
Dart
import 'package:dsh_workbench/main.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
const channel = MethodChannel('dsh.workbench/gecko/42');
|
|
final calls = <String>[];
|
|
var canGoBack = true;
|
|
final systemCalls = <String>[];
|
|
|
|
setUp(() {
|
|
calls.clear();
|
|
systemCalls.clear();
|
|
canGoBack = true;
|
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
|
.setMockMethodCallHandler(channel, (call) async {
|
|
calls.add(call.method);
|
|
return call.method == 'goBack' ? canGoBack : null;
|
|
});
|
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
|
.setMockMethodCallHandler(SystemChannels.platform, (call) async {
|
|
systemCalls.add(call.method);
|
|
return null;
|
|
});
|
|
});
|
|
|
|
tearDown(() {
|
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
|
.setMockMethodCallHandler(channel, null);
|
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
|
.setMockMethodCallHandler(SystemChannels.platform, null);
|
|
});
|
|
|
|
Future<void> emit(String method, [Object? value]) async {
|
|
await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
|
.handlePlatformMessage(
|
|
channel.name,
|
|
const StandardMethodCodec().encodeMethodCall(
|
|
MethodCall(method, value),
|
|
),
|
|
(_) {},
|
|
);
|
|
}
|
|
|
|
testWidgets('返回键优先回退 Gecko 历史,之后退出应用', (tester) async {
|
|
await tester.pumpWidget(const DshApp());
|
|
tester.widget<AndroidView>(find.byType(AndroidView)).onPlatformViewCreated!(
|
|
42,
|
|
);
|
|
await tester.pump();
|
|
final pop = tester.widget<PopScope>(
|
|
find.byWidgetPredicate((w) => w is PopScope),
|
|
);
|
|
pop.onPopInvokedWithResult!(false, null);
|
|
await tester.pump();
|
|
expect(calls.last, 'goBack');
|
|
expect(systemCalls, isNot(contains('SystemNavigator.pop')));
|
|
canGoBack = false;
|
|
pop.onPopInvokedWithResult!(false, null);
|
|
await tester.pump();
|
|
expect(systemCalls, contains('SystemNavigator.pop'));
|
|
await tester.pumpWidget(const SizedBox());
|
|
});
|
|
|
|
testWidgets('Gecko 页面事件、错误及重试通过独立通道连接', (tester) async {
|
|
await tester.pumpWidget(const DshApp());
|
|
final view = tester.widget<AndroidView>(find.byType(AndroidView));
|
|
expect(view.viewType, 'dsh.workbench/gecko');
|
|
view.onPlatformViewCreated!(42);
|
|
await tester.pump();
|
|
expect(calls, ['load']);
|
|
expect(find.text('正在加载…'), findsOneWidget);
|
|
|
|
await emit('onPageFinished');
|
|
await tester.pump();
|
|
expect(find.text('正在加载…'), findsNothing);
|
|
|
|
await emit('onLoadError', '连接已断开');
|
|
await tester.pump();
|
|
expect(find.text('连接已断开'), findsOneWidget);
|
|
await tester.tap(find.text('重试'));
|
|
await tester.pump();
|
|
expect(calls.last, 'reload');
|
|
expect(find.text('正在加载…'), findsOneWidget);
|
|
|
|
await emit('onPageStarted');
|
|
await emit('onPageFinished');
|
|
await emit('onDownloadError', '空间不足');
|
|
await tester.pump();
|
|
expect(find.text('下载失败:空间不足'), findsOneWidget);
|
|
await tester.pumpWidget(const SizedBox());
|
|
await emit('onPageStarted');
|
|
expect(tester.takeException(), isNull);
|
|
});
|
|
}
|