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