import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:geolocator/geolocator.dart'; import 'package:ignis_app/features/homes/providers/location_providers.dart'; import 'package:ignis_app/features/homes/services/location_platform_service.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); test( 'location watcher does not auto-request permission when denied', () async { final service = _FakeLocationPlatformService(); final container = ProviderContainer( overrides: [locationPlatformServiceProvider.overrideWithValue(service)], ); addTearDown(() async { await service.dispose(); container.dispose(); }); final notifier = container.read(userLocationProvider.notifier); await notifier.startWatching(); await notifier.refresh(); expect(service.requestPermissionCalls, 0); expect(service.getPositionStreamCalls, 0); expect( container.read(userLocationProvider).issue, UserLocationIssue.permissionDenied, ); }, ); test('location watcher resumes after permission is granted later', () async { final service = _FakeLocationPlatformService(); final container = ProviderContainer( overrides: [locationPlatformServiceProvider.overrideWithValue(service)], ); addTearDown(() async { await service.dispose(); container.dispose(); }); final notifier = container.read(userLocationProvider.notifier); await notifier.startWatching(); service.permission = LocationPermission.always; await notifier.ensureWatchingStarted(); expect(service.requestPermissionCalls, 0); expect(service.getPositionStreamCalls, 1); }); test('explicit location request asks Android and starts watching', () async { final service = _FakeLocationPlatformService(); service.requestPermissionResult = LocationPermission.always; final container = ProviderContainer( overrides: [locationPlatformServiceProvider.overrideWithValue(service)], ); addTearDown(() async { await service.dispose(); container.dispose(); }); final notifier = container.read(userLocationProvider.notifier); await notifier.startWatching(); await notifier.requestPermission(); expect(service.requestPermissionCalls, 1); expect(service.getPositionStreamCalls, 1); }); } class _FakeLocationPlatformService implements LocationPlatformService { final StreamController _positionController = StreamController.broadcast(); bool locationServiceEnabled = true; LocationPermission permission = LocationPermission.denied; LocationPermission requestPermissionResult = LocationPermission.denied; int requestPermissionCalls = 0; int getPositionStreamCalls = 0; Future dispose() async { await _positionController.close(); } @override Future checkPermission() async => permission; @override Stream getPositionStream({ required LocationSettings locationSettings, }) { getPositionStreamCalls += 1; return _positionController.stream; } @override Future getCurrentPosition({ required LocationSettings locationSettings, }) { throw UnimplementedError(); } @override Future getLastKnownPosition() async => null; @override Future isLocationServiceEnabled() async => locationServiceEnabled; @override Future openAppSettings() async => true; @override Future openLocationSettings() async => true; @override Future requestPermission() async { requestPermissionCalls += 1; permission = requestPermissionResult; return permission; } }