Files
rely/test/features/reminders/scheduling/reminder_scheduler_local_notifications_test.dart
T

118 lines
3.2 KiB
Dart

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;
}