MotorSignal-App/test/location_permission_refresh...

71 lines
1.9 KiB
Dart

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<bool> 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();
},
);
}