import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:motorcycle_dash/features/dashboard/widgets/dashboard_alert_region.dart'; import 'package:motorcycle_dash/services/location_service.dart'; class _MockLocationService extends LocationService { bool _mockGranted = false; void grant() { _mockGranted = true; } void revoke() { _mockGranted = false; } @override Future hasPermissions() async => _mockGranted; } void main() { TestWidgetsFlutterBinding.ensureInitialized(); testWidgets( 'DashboardAlertRegion automatically clears location banner when app resumes with granted permission', (tester) async { final mockService = _MockLocationService(); addTearDown(() => mockService.dispose()); // Initially permissions are denied (system dialog is showing) mockService.revoke(); await tester.pumpWidget( ProviderScope( overrides: [ locationServiceProvider.overrideWithValue(mockService), ], child: const MaterialApp( home: Scaffold( body: DashboardAlertRegion(), ), ), ), ); await tester.pumpAndSettle(); // Banner should be visible initially expect( find.text('Location permission needed for GPS speedometer.'), findsOneWidget, ); // User grants permission in system dialog mockService.grant(); // System dialog closes -> Flutter engine receives AppLifecycleState.resumed tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); await tester.pumpAndSettle(); // The banner must automatically dismiss WITHOUT tapping Enable or restarting the app! expect( find.text('Location permission needed for GPS speedometer.'), findsNothing, ); mockService.dispose(); }, ); }