import 'package:consumer_app/core/location/location_service.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:geolocator/geolocator.dart';
void main() {
test('service-disabled access never exposes a coordinate', () async {
final result = await LocationService(
provider: _FakeLocationProvider(serviceEnabled: false),
).requestCurrentLocation();
expect(result.access, LocationAccess.unavailable);
expect(result.coordinate, isNull);
});
test('denied access never exposes a coordinate', () async {
final result = await LocationService(
provider: _FakeLocationProvider(permission: LocationPermission.denied),
).requestCurrentLocation();
expect(result.access, LocationAccess.denied);
expect(result.coordinate, isNull);
});
test('denied-forever access never exposes a coordinate', () async {
final result = await LocationService(
provider: _FakeLocationProvider(
permission: LocationPermission.deniedForever,
),
).requestCurrentLocation();
expect(result.access, LocationAccess.denied);
expect(result.coordinate, isNull);
});
test('granted access returns a valid coordinate', () async {
final result = await LocationService(
provider: _FakeLocationProvider(
position: _position(latitude: 50.9795, longitude: 11.3235),
),
).requestCurrentLocation();
expect(result.access, LocationAccess.granted);
expect(result.coordinate?.latitude, 50.9795);
expect(result.coordinate?.longitude, 11.3235);
});
test('invalid platform coordinates fail closed', () async {
final result = await LocationService(
provider: _FakeLocationProvider(
position: _position(latitude: 91, longitude: 11.3235),
),
).requestCurrentLocation();
expect(result.access, LocationAccess.unavailable);
expect(result.coordinate, isNull);
});
test('provider failures fail closed without exposing a coordinate', () async {
final result = await LocationService(
provider: _FakeLocationProvider(throwsOnPosition: true),
).requestCurrentLocation();
expect(result.access, LocationAccess.unavailable);
expect(result.coordinate, isNull);
});
}
class _FakeLocationProvider implements LocationProvider {
_FakeLocationProvider({
this.serviceEnabled = true,
this.permission = LocationPermission.whileInUse,
this.position,
this.throwsOnPosition = false,
});
final bool serviceEnabled;
final LocationPermission permission;
final Position? position;
final bool throwsOnPosition;
@override
Future<bool> isLocationServiceEnabled() async => serviceEnabled;
@override
Future<LocationPermission> checkPermission() async => permission;
@override
Future<LocationPermission> requestPermission() async => permission;
@override
Future<Position> getCurrentPosition() async {
if (throwsOnPosition) throw StateError('provider failure');
return position ?? _position(latitude: 50.98, longitude: 11.32);
}
}
Position _position({required double latitude, required double longitude}) =>
Position(
latitude: latitude,
longitude: longitude,
timestamp: DateTime.utc(2026, 9, 21),
accuracy: 5,
altitude: 0,
altitudeAccuracy: 1,
heading: 0,
headingAccuracy: 1,
speed: 0,
speedAccuracy: 0,
);
