Files
dsh-web/test/gecko_bridge_test.dart
T

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);
});
}