Files
TPSchedule/mobile/test/school/browser_compatibility_test.dart

83 lines
3.2 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:flutter_test/flutter_test.dart';
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
import 'package:hepan_everyday/domain/school_term.dart';
import 'package:hepan_everyday/features/school/school_browser.dart';
import 'package:hepan_everyday/features/school/school_session.dart';
import 'package:hepan_everyday/features/school/undergraduate/session.dart';
import 'package:hepan_everyday/services/diagnostic_log.dart';
import '../support/fake_school_web.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
test('both school entries wait for browser compatibility settings before loading', () async {
for (final undergraduate in [false, true]) {
final platform = FakeSchoolPlatform();
WebViewPlatform.instance = platform;
final ready = Completer<SchoolBrowserInfo>();
final graduate = SchoolSession(configureBrowser: (_, _) => ready.future);
final under = UndergraduateSession(
configureBrowser: (_, _) => ready.future,
);
addTearDown(graduate.dispose);
addTearDown(under.dispose);
final opening = undergraduate
? under.openTimetable()
: graduate.openTimetable(term: SchoolTerm(73));
await flushSchoolEvents();
expect(platform.web.loads, isEmpty);
ready.complete(const SchoolBrowserInfo(chromiumVersion: '155.0.1.2'));
await opening;
expect(platform.web.loads, hasLength(1));
expect(
undergraduate ? under.browserVersion : graduate.browserVersion,
'155.0.1.2',
);
}
});
test(
'cancel while browser settings initialize never starts a late navigation',
() async {
final platform = FakeSchoolPlatform();
WebViewPlatform.instance = platform;
final ready = Completer<SchoolBrowserInfo>();
final session = UndergraduateSession(
configureBrowser: (_, _) => ready.future,
);
addTearDown(session.dispose);
final opening = session.openTimetable();
await flushSchoolEvents();
session.setReadingActive(false);
ready.complete(const SchoolBrowserInfo());
await opening;
expect(platform.web.loads, isEmpty);
},
);
test('subresource failures remain diagnostic without aborting the school session', () async {
final platform = FakeSchoolPlatform();
WebViewPlatform.instance = platform;
final session = UndergraduateSession();
addTearDown(session.dispose);
await session.openTimetable();
platform.delegate.resourceError(
WebResourceError(
errorCode: -105,
description: 'PRIVATE_COOKIE',
isForMainFrame: false,
url: 'http://eams.uestc.edu.cn/eams/scripts/component.js?ticket=PRIVATE_TICKET',
),
);
await flushSchoolEvents();
final log = utf8.decode(await DiagnosticLog.instance.export());
expect(log, contains('school_resource_failed'));
expect(log, contains('"page":"script"'));
expect(log, contains('"status":-105'));
expect(log, isNot(contains('PRIVATE_COOKIE')));
expect(log, isNot(contains('PRIVATE_TICKET')));
expect(session.message, isNot(contains('未完成')));
});
}