import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:hepan_everyday/services/local_notification_service.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); test('transient native initialization failure can be retried', () async { debugDefaultTargetPlatformOverride = TargetPlatform.android; AndroidFlutterLocalNotificationsPlugin.registerWith(); const channel = MethodChannel('dexterous.com/flutter/local_notifications'); var attempts = 0; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (call) async { if (call.method == 'initialize') { attempts++; if (attempts == 1) { throw PlatformException(code: 'temporarily-unavailable'); } return true; } if (call.method == 'getNotificationAppLaunchDetails') { return {'notificationLaunchedApp': false}; } return null; }); addTearDown(() { debugDefaultTargetPlatformOverride = null; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, null); }); final gateway = PluginReminderGateway(); await expectLater(gateway.initialize(), throwsA(isA())); await gateway.initialize(); expect(attempts, 2); }); test( 'disabled course notification channel is reported even with app permission', () async { debugDefaultTargetPlatformOverride = TargetPlatform.android; AndroidFlutterLocalNotificationsPlugin.registerWith(); const channel = MethodChannel( 'dexterous.com/flutter/local_notifications', ); var importance = 0; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (call) async { switch (call.method) { case 'initialize': return true; case 'getNotificationAppLaunchDetails': return {'notificationLaunchedApp': false}; case 'areNotificationsEnabled': return true; case 'canScheduleExactNotifications': return true; case 'getNotificationChannels': return [ { 'id': 'hepan_lessons', 'name': '课前提醒', 'description': '课程开始前的提醒', 'importance': importance, 'showBadge': true, 'playSound': true, 'enableVibration': true, 'enableLights': false, 'bypassDnd': false, 'ledColor': 0, 'audioAttributesUsage': 5, }, ]; } return null; }); addTearDown(() { debugDefaultTargetPlatformOverride = null; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, null); }); final gateway = PluginReminderGateway(); expect( (await gateway.permissions(request: false)).notifications, isFalse, ); importance = 4; expect((await gateway.permissions(request: false)).notifications, isTrue); }, ); }