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/app_controller.dart'; import 'package:hepan_everyday/app/hepan_app.dart'; import 'package:hepan_everyday/domain/app_snapshot.dart'; import '../support/fakes.dart'; void main() { setUpAll(tzdata.initializeTimeZones); for (final badBackup in [false, true]) { testWidgets( 'corrupt primary with ${badBackup ? "corrupt" : "missing"} backup has confirmed fresh recovery', (tester) async { final store = DamagedStore(badBackup); final controller = AppController( store, FakeNotifications(), FakeCalendar(), DateTime.now, ); await controller.initialize(); await controller.restoreBackup(); await tester.pumpWidget(HepanApp(controller: controller)); await tester.pumpAndSettle(); expect(controller.storageReady, isFalse); expect(find.text('重新建立课表'), findsOneWidget); await tester.tap(find.text('重新建立课表')); await tester.pumpAndSettle(); await tester.tap(find.text('取消')); await tester.pumpAndSettle(); expect(controller.storageReady, isFalse); expect(store.freshStarts, 0); await tester.tap(find.text('重新建立课表')); await tester.pumpAndSettle(); await tester.tap(find.text('保留损坏文件并重新建立')); await tester.pumpAndSettle(); expect(controller.storageReady, isTrue); await tester.tap(find.bySemanticsLabel('我的')); await tester.pumpAndSettle(); await tester.ensureVisible(find.text('课表设置')); await tester.pumpAndSettle(); await tester.tap(find.text('课表设置')); await tester.pumpAndSettle(); await tester.tap(find.text('单色')); await tester.pumpAndSettle(); expect(store.value!.settings.colorMode.name, 'single'); expect(store.freshStarts, 1); await tester.pumpWidget(const SizedBox()); controller.dispose(); }, ); } } class DamagedStore extends MemoryStore { DamagedStore(this.badBackup); final bool badBackup; int freshStarts = 0; @override Future load() async => value ?? (throw const FormatException('damaged')); @override Future restoreBackup() async => throw StateError(badBackup ? '备份损坏' : '没有备份'); @override Future startFresh() async { freshStarts++; return value = AppSnapshot(); } }