feat: compose Android app and verify native calendar and reminders

This commit is contained in:
Codex
2026-10-13 09:14:47 +08:00
parent 2c4256b880
commit 5ceab20b67
37 changed files with 695 additions and 229 deletions
@@ -0,0 +1,43 @@
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);
},
);
}