83 lines
3.2 KiB
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('未完成')));
|
|
});
|
|
}
|