81 lines
3.0 KiB
Dart
81 lines
3.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:timezone/data/latest.dart' as tzdata;
|
|
import 'package:hepan_everyday/app/hepan_app.dart';
|
|
import 'package:hepan_everyday/app/app_controller.dart';
|
|
import 'package:hepan_everyday/domain/app_snapshot.dart';
|
|
import 'package:hepan_everyday/domain/semester.dart';
|
|
import 'package:hepan_everyday/features/timetable/timetable_page.dart';
|
|
|
|
import '../support/fakes.dart';
|
|
import '../domain/schedule_engine_test.dart' show course;
|
|
|
|
void main() {
|
|
setUpAll(tzdata.initializeTimeZones);
|
|
testWidgets('imported courses without start date show an actionable prompt', (
|
|
tester,
|
|
) async {
|
|
final c = AppController(
|
|
MemoryStore(AppSnapshot(courses: [course()])),
|
|
FakeNotifications(),
|
|
FakeCalendar(),
|
|
() => DateTime(2026, 10, 13),
|
|
);
|
|
await c.initialize();
|
|
await tester.pumpWidget(HepanApp(controller: c));
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('课表已导入,请设置学期开始日'), findsOneWidget);
|
|
expect(find.text('1 条课程安排已保存'), findsOneWidget);
|
|
await tester.tap(find.text('设置学期开始日'));
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('课表设置'), findsOneWidget);
|
|
expect(find.text('学期开始日').hitTestable(), findsOneWidget);
|
|
await c.updateSettings(
|
|
(s) => s.copyWith(
|
|
semester: Semester(startDate: DateTime(2026, 10, 12), totalWeeks: 20),
|
|
),
|
|
);
|
|
Navigator.of(tester.element(find.text('课表设置'))).pop();
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('课表已导入,请设置学期开始日'), findsNothing);
|
|
expect(find.text('周日'), findsOneWidget);
|
|
c.dispose();
|
|
});
|
|
testWidgets(
|
|
'timetable refresh calls school sync and page titles are specific',
|
|
(tester) async {
|
|
final c = AppController(
|
|
MemoryStore(),
|
|
FakeNotifications(),
|
|
FakeCalendar(),
|
|
() => DateTime(2026, 10, 13),
|
|
);
|
|
await c.initialize();
|
|
var calls = 0;
|
|
await tester.pumpWidget(
|
|
MaterialApp(
|
|
home: Scaffold(
|
|
body: TimetablePage(controller: c, onSync: () => calls++),
|
|
),
|
|
),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
await tester.tap(find.byTooltip('刷新课表'));
|
|
expect(calls, 1);
|
|
expect(find.text('课表'), findsOneWidget);
|
|
await tester.pumpWidget(HepanApp(controller: c));
|
|
await tester.pumpAndSettle();
|
|
await tester.tap(find.bySemanticsLabel('考试'));
|
|
await tester.pumpAndSettle();
|
|
// The page heading and Dock caption both show the active tab name.
|
|
expect(find.text('考试'), findsNWidgets(2));
|
|
expect(find.text('考试安排'), findsOneWidget);
|
|
await tester.tap(find.bySemanticsLabel('个人设置'));
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('更新学期'), findsOneWidget);
|
|
expect(find.text('TPSchedule'), findsWidgets);
|
|
c.dispose();
|
|
},
|
|
);
|
|
}
|