71 lines
1.9 KiB
Dart
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();
|
|
},
|
|
);
|
|
}
|