Files
TPSchedule/mobile/test/widgets/term_prompt_test.dart
T

80 lines
2.9 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();
expect(find.text('考试'), findsOneWidget);
expect(find.text('考试安排'), findsOneWidget);
await tester.tap(find.bySemanticsLabel('个人设置'));
await tester.pumpAndSettle();
expect(find.text('更新学期'), findsOneWidget);
expect(find.text('RSchedule'), findsWidgets);
c.dispose();
},
);
}