118 lines
3.2 KiB
Dart
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;
|
|
}
|