Integrate local notifications scheduler for reminders
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
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>[
|
||||
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<ScheduledCall> scheduled = <ScheduledCall>[];
|
||||
|
||||
@override
|
||||
Future<void> cancelAll() async {
|
||||
cancelAllCalls += 1;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> ensureInitialized() async {
|
||||
initializeCalls += 1;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> 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;
|
||||
}
|
||||
Reference in New Issue
Block a user