Preserve courses with pending rooms and report precise graduate import errors

This commit is contained in:
david1465833828
2026-10-28 19:56:02 +08:00
parent 8713bce0ee
commit 21b0df9e33
17 changed files with 340 additions and 53 deletions
@@ -31,6 +31,59 @@ void main() {
platform.delegate.finished(url);
}
testWidgets(
'graduate parser rejection keeps its reason instead of becoming a network timeout',
(tester) async {
addTearDown(SchoolPageDiagnostic.instance.clear);
session.connectionState = SchoolConnectionState.connected;
await session.openTimetable(term: SchoolTerm(73));
platform.web.javascript = (_) async => schoolPageEvidence(
topUrl: platform.web.url!,
html: fixture().replaceFirst('1-3周', '未知周'),
);
await tester.runAsync(() async {
navigate(SchoolTerm(73).timetableUri.toString());
await flushSchoolEvents();
});
expect(session.message, contains('上课周次'));
await tester.pump(const Duration(seconds: 46));
expect(session.message, contains('上课周次'));
expect(session.message, isNot(contains('查找超时')));
expect(session.pendingDraft, isNull);
final log = utf8.decode(await DiagnosticLog.instance.export());
expect(log, contains('"code":"weeks_invalid"'));
expect(log, contains('"column":5'));
expect(log, isNot(contains('示例集成电路')));
SchoolPageDiagnostic.instance.clear();
},
);
testWidgets('a new graduate page never inherits an old parsing reason', (
tester,
) async {
addTearDown(SchoolPageDiagnostic.instance.clear);
session.connectionState = SchoolConnectionState.connected;
await session.openTimetable(term: SchoolTerm(73));
platform.web.javascript = (_) async => schoolPageEvidence(
topUrl: platform.web.url!,
html: fixture().replaceFirst('1-3周', '未知周'),
);
await tester.runAsync(() async {
navigate(SchoolTerm(73).timetableUri.toString());
await flushSchoolEvents();
});
expect(session.message, contains('上课周次'));
platform.web.javascript = (_) async =>
schoolPageEvidence(topUrl: platform.web.url!);
await tester.runAsync(() async {
navigate(SchoolTerm(72).timetableUri.toString());
await flushSchoolEvents();
});
await tester.pump(const Duration(seconds: 46));
expect(session.message, contains('查找超时'));
expect(session.message, isNot(contains('上课周次')));
SchoolPageDiagnostic.instance.clear();
});
test(
'graduate auto read retains HTML after leaving and clears on next query',
() async {