import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:timezone/data/latest.dart' as tzdata; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:hepan_everyday/app/hepan_app.dart'; import 'package:hepan_everyday/domain/school_term.dart'; import 'package:hepan_everyday/features/school/school_session.dart'; import '../support/fake_school_web.dart'; import 'navigation_test.dart' show uiController; void main() { setUpAll(tzdata.initializeTimeZones); testWidgets('cancelling school selection never starts authentication', ( tester, ) async { WebViewPlatform.instance = FakeSchoolPlatform(); final session = SchoolSession(); final controller = uiController(); await controller.initialize(); addTearDown(session.dispose); addTearDown(controller.dispose); await tester.pumpWidget( HepanApp( controller: controller, school: session, schoolBuilder: () => const Scaffold(body: Text('学校认证页面')), ), ); await tester.pumpAndSettle(); await tester.tap(find.bySemanticsLabel('个人设置')); await tester.pumpAndSettle(); await tester.tap(find.widgetWithText(FilledButton, '选择学校')); await tester.pumpAndSettle(); expect(find.text('电子科技大学(研究生)'), findsOneWidget); expect(session.hasOpened, isFalse); expect(find.text('学校认证页面'), findsNothing); await tester.tap(find.byType(BackButton)); await tester.pumpAndSettle(); expect(session.hasOpened, isFalse); expect(find.widgetWithText(FilledButton, '选择学校'), findsOneWidget); expect(controller.snapshot.courses, isEmpty); }); testWidgets('selecting UESTC graduate enters its existing authentication', ( tester, ) async { final platform = FakeSchoolPlatform(); WebViewPlatform.instance = platform; final session = SchoolSession(); final controller = uiController(); await controller.initialize(); addTearDown(session.dispose); addTearDown(controller.dispose); await tester.pumpWidget( HepanApp( controller: controller, school: session, schoolBuilder: () => const Scaffold(body: Text('学校认证页面')), ), ); await tester.pumpAndSettle(); await tester.tap(find.bySemanticsLabel('个人设置')); await tester.pumpAndSettle(); await tester.tap(find.widgetWithText(FilledButton, '选择学校')); await tester.pumpAndSettle(); expect(session.hasOpened, isFalse); await tester.tap(find.text('电子科技大学(研究生)')); await tester.pumpAndSettle(); expect(find.text('学校认证页面'), findsOneWidget); expect(session.hasOpened, isTrue); expect(platform.web.loads, ['https://yjsjy.uestc.edu.cn/pyxx/jzsso/login']); Navigator.pop(tester.element(find.text('学校认证页面'))); await tester.pumpAndSettle(); expect(find.textContaining('电子科技大学(研究生)'), findsOneWidget); }); testWidgets('first exam sync selects school before opening exam workflow', ( tester, ) async { WebViewPlatform.instance = FakeSchoolPlatform(); final session = SchoolSession(); final controller = uiController(); await controller.initialize(); addTearDown(session.dispose); addTearDown(controller.dispose); await tester.pumpWidget( HepanApp( controller: controller, school: session, schoolBuilder: () => const Scaffold(body: Text('学校认证页面')), ), ); await tester.pumpAndSettle(); await tester.tap(find.bySemanticsLabel('考试')); await tester.pumpAndSettle(); await tester.tap(find.byTooltip('从学校更新考试')); await tester.pumpAndSettle(); expect(find.text('电子科技大学(研究生)'), findsOneWidget); expect(session.hasOpened, isFalse); await tester.tap(find.text('电子科技大学(研究生)')); await tester.pumpAndSettle(); expect(session.requestingExams, isTrue); expect(find.text('学校认证页面'), findsOneWidget); }); testWidgets('connected refresh keeps the school and imported semester', ( tester, ) async { final platform = FakeSchoolPlatform(); WebViewPlatform.instance = platform; final session = SchoolSession(); await session.openTimetable(term: SchoolTerm(72)); session.connectionState = SchoolConnectionState.connected; final controller = uiController(); await controller.initialize(); controller.snapshot = controller.snapshot.copyWith( schoolTerm: SchoolTerm(72), ); addTearDown(session.dispose); addTearDown(controller.dispose); await tester.pumpWidget( HepanApp( controller: controller, school: session, schoolBuilder: () => const Scaffold(body: Text('学校认证页面')), ), ); await tester.pumpAndSettle(); await tester.tap(find.byTooltip('刷新课表')); await tester.pumpAndSettle(); expect(find.text('学校认证页面'), findsOneWidget); expect(find.text('电子科技大学(研究生)'), findsNothing); expect( platform.web.loads.last, 'https://yjsjy.uestc.edu.cn/pyxx/pygl/xskbcx/index/72', ); expect(session.selectedTerm, SchoolTerm(72)); session.setReadingActive(false); }); }