import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:relationship_saver/features/local/local_models.dart'; import 'package:relationship_saver/features/reminders/scheduling/reminder_scheduler_local_notifications.dart'; void main() { test( 'reconcile schedules enabled reminders and cancels previous jobs', () async { final FakeReminderNotificationsDriver driver = FakeReminderNotificationsDriver(); final LocalNotificationsReminderScheduler scheduler = LocalNotificationsReminderScheduler( driver: driver, now: () => DateTime(2026, 2, 16, 10), ); await scheduler.reconcile([ ReminderRule( id: 'r-daily', title: 'Daily check-in', cadence: ReminderCadence.daily, nextAt: DateTime(2026, 2, 16, 20), ), ReminderRule( id: 'r-weekly', title: 'Weekly date plan', cadence: ReminderCadence.weekly, nextAt: DateTime(2026, 2, 17, 9), ), ReminderRule( id: 'r-disabled', title: 'Disabled reminder', cadence: ReminderCadence.monthly, nextAt: DateTime(2026, 2, 18, 8), enabled: false, ), ]); expect(driver.initializeCalls, 1); expect(driver.cancelAllCalls, 1); expect(driver.scheduled.length, 2); expect(driver.scheduled[0].repeatComponents, DateTimeComponents.time); expect( driver.scheduled[1].repeatComponents, DateTimeComponents.dayOfWeekAndTime, ); }, ); test('clearAll clears notification schedule', () async { final FakeReminderNotificationsDriver driver = FakeReminderNotificationsDriver(); final LocalNotificationsReminderScheduler scheduler = LocalNotificationsReminderScheduler(driver: driver); await scheduler.clearAll(); expect(driver.initializeCalls, 1); expect(driver.cancelAllCalls, 1); }); } class FakeReminderNotificationsDriver implements ReminderNotificationsDriver { int initializeCalls = 0; int cancelAllCalls = 0; final List scheduled = []; @override Future cancelAll() async { cancelAllCalls += 1; } @override Future ensureInitialized() async { initializeCalls += 1; } @override Future schedule({ required int id, required String title, required String body, required DateTime scheduledAt, required DateTimeComponents? repeatComponents, required String payload, }) async { scheduled.add( ScheduledCall( id: id, title: title, body: body, scheduledAt: scheduledAt, repeatComponents: repeatComponents, payload: payload, ), ); } } class ScheduledCall { const ScheduledCall({ required this.id, required this.title, required this.body, required this.scheduledAt, required this.repeatComponents, required this.payload, }); final int id; final String title; final String body; final DateTime scheduledAt; final DateTimeComponents? repeatComponents; final String payload; }