import 'dart:io'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:social_app/core/notifications/reminder_notification_callbacks.dart'; void main() { setUp(() async { SharedPreferences.setMockInitialValues({}); await ReminderNotificationCallbacks.resetForTest(); }); test('contains top-level vm entry-point background callback', () async { final source = await File( 'lib/core/notifications/reminder_notification_callbacks.dart', ).readAsString(); expect(source, contains("@pragma('vm:entry-point')")); expect(source, contains('Future reminderNotificationTapBackground(')); }); test( 'dispatches foreground and background responses to bound handler', () async { final handledIds = []; await ReminderNotificationCallbacks.bindResponseHandler((response) async { handledIds.add(response.id); }); await ReminderNotificationCallbacks.onForegroundResponse( NotificationResponse( notificationResponseType: NotificationResponseType.selectedNotificationAction, id: 10, ), ); await reminderNotificationTapBackground( NotificationResponse( notificationResponseType: NotificationResponseType.selectedNotificationAction, id: 20, ), ); expect(handledIds, [10, 20]); }, ); test( 'queues background response when handler is unbound and drains later', () async { await reminderNotificationTapBackground( NotificationResponse( notificationResponseType: NotificationResponseType.selectedNotificationAction, id: 99, ), ); final handledIds = []; await ReminderNotificationCallbacks.bindResponseHandler((response) async { handledIds.add(response.id); }); expect(handledIds, [99]); }, ); test( 'queues foreground response when handler is unbound and drains later', () async { await ReminderNotificationCallbacks.onForegroundResponse( NotificationResponse( notificationResponseType: NotificationResponseType.selectedNotificationAction, id: 55, ), ); final handledIds = []; await ReminderNotificationCallbacks.bindResponseHandler((response) async { handledIds.add(response.id); }); expect(handledIds, [55]); }, ); test('failed pending item stays queued for next bind retry', () async { await reminderNotificationTapBackground( NotificationResponse( notificationResponseType: NotificationResponseType.selectedNotificationAction, id: 77, ), ); var firstAttempt = true; await ReminderNotificationCallbacks.bindResponseHandler((response) async { if (firstAttempt) { firstAttempt = false; throw Exception('temporary failure'); } }); final handledIds = []; await ReminderNotificationCallbacks.bindResponseHandler((response) async { handledIds.add(response.id); }); expect(handledIds, [77]); }); test( 'background handler failure while bound is enqueued for retry', () async { var firstAttempt = true; await ReminderNotificationCallbacks.bindResponseHandler((response) async { if (firstAttempt) { firstAttempt = false; throw Exception('temporary failure'); } }); await reminderNotificationTapBackground( NotificationResponse( notificationResponseType: NotificationResponseType.selectedNotificationAction, id: 123, ), ); final handledIds = []; await ReminderNotificationCallbacks.bindResponseHandler((response) async { handledIds.add(response.id); }); expect(handledIds, [123]); }, ); }