import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:timezone/data/latest.dart' as tzdata; import 'package:hepan_everyday/services/android_calendar_service.dart'; import 'package:hepan_everyday/domain/schedule_engine.dart'; import '../test/domain/schedule_engine_test.dart' show course; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets( 'native dedicated calendar creates updates deduplicates and deletes owned events', (tester) async { tzdata.initializeTimeZones(); await tester.pumpWidget(const MaterialApp(home: Scaffold())); final gateway = MethodCalendarGateway(); final service = AndroidCalendarService(gateway); expect(await service.requestAccess(),isTrue); final calendars = await service.listWritableCalendars(); final selected = calendars.where( (c) => c.name == 'Hepan_Integration_Test', ); if (selected.isEmpty) { fail('请先在专用模拟器建立 Hepan Integration Test 日历'); } final id = selected.single.id; final events = ScheduleEngine.occurrences([ course(last: 2), ], Semester(startDate: DateTime(2026, 9, 9), totalWeeks: 1)); var mapping = await service.sync(events, id, {}); expect(mapping, hasLength(1)); final original = mapping.values.single; mapping = await service.sync(events, id, {}); // lost mapping recovery expect(mapping.values.single, original); expect(await gateway.ownedEvents(id), hasLength(1)); await gateway.delete(original, 'wrong-occurrence'); expect(await gateway.ownedEvents(id), hasLength(1)); await service.deleteOwned(mapping); expect(await gateway.ownedEvents(id), isEmpty); }, ); }