gps_speed_test.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import 'package:cardash_launcher/core/theme/app_theme.dart';
  2. import 'package:cardash_launcher/data/models/bluetooth_device_info.dart';
  3. import 'package:cardash_launcher/data/models/bluetooth_power_state.dart';
  4. import 'package:cardash_launcher/data/models/gps_speed.dart';
  5. import 'package:cardash_launcher/data/models/location_reading.dart';
  6. import 'package:cardash_launcher/data/models/obd_state.dart';
  7. import 'package:cardash_launcher/data/services/telemetry_bridge.dart';
  8. import 'package:cardash_launcher/features/home/gps_speed_controller.dart';
  9. import 'package:cardash_launcher/features/home/widgets/gps_speed_card.dart';
  10. import 'package:flutter/material.dart';
  11. import 'package:flutter_test/flutter_test.dart';
  12. class _GpsPlatform implements TelemetryPlatform {
  13. _GpsPlatform({this.permission = true, this.speedKmh = 0});
  14. bool permission;
  15. final double speedKmh;
  16. var started = false;
  17. var startCalls = 0;
  18. var permissionRequests = 0;
  19. @override
  20. Future<bool> startGpsSpeed() async {
  21. started = true;
  22. startCalls++;
  23. return permission;
  24. }
  25. @override
  26. Future<void> stopGpsSpeed() async {}
  27. @override
  28. Future<GpsSpeed> getGpsSpeed() async {
  29. if (!permission) return const GpsSpeed();
  30. return GpsSpeed(
  31. hasPermission: true,
  32. hasFix: true,
  33. speedKmh: speedKmh,
  34. updatedAt: DateTime(2026).millisecondsSinceEpoch,
  35. );
  36. }
  37. @override
  38. Future<List<BluetoothDeviceInfo>> listBondedDevices() async => const [];
  39. @override
  40. Future<BluetoothPowerState> bluetoothState() async => BluetoothPowerState.off;
  41. @override
  42. Future<bool> ensureBluetoothPermission() async => false;
  43. @override
  44. Future<bool> openBluetoothSettings() async => true;
  45. @override
  46. Future<bool> ensureLocationPermission() async {
  47. permissionRequests++;
  48. return permission;
  49. }
  50. @override
  51. Future<LocationReading> getLocation() async =>
  52. const LocationReading(latitude: 0, longitude: 0, place: '');
  53. @override
  54. Future<void> connectObd(String address) async {}
  55. @override
  56. Future<void> disconnectObd() async {}
  57. @override
  58. Future<ObdState> getObdState() async => const ObdState();
  59. }
  60. void main() {
  61. test('stationary GPS fix reports 0 km/h', () async {
  62. final platform = _GpsPlatform(speedKmh: 0);
  63. final controller = GpsSpeedController(
  64. platform,
  65. clock: () => DateTime(2026),
  66. );
  67. addTearDown(controller.dispose);
  68. await controller.start();
  69. expect(platform.started, isTrue);
  70. expect(controller.speedKmh, 0);
  71. controller.stop();
  72. });
  73. test('no precise location means no prompt and no speed', () async {
  74. final platform = _GpsPlatform(permission: false);
  75. final controller = GpsSpeedController(
  76. platform,
  77. clock: () => DateTime(2026),
  78. );
  79. addTearDown(controller.dispose);
  80. await controller.start();
  81. expect(controller.hasPermission, isFalse);
  82. expect(controller.hasSpeed, isFalse);
  83. controller.stop();
  84. });
  85. test('permission grant retries the GPS fallback', () async {
  86. final platform = _GpsPlatform(permission: false);
  87. final controller = GpsSpeedController(
  88. platform,
  89. clock: () => DateTime(2026),
  90. );
  91. addTearDown(controller.dispose);
  92. await controller.start();
  93. expect(platform.startCalls, 1);
  94. expect(controller.hasPermission, isFalse);
  95. platform.permission = true;
  96. final granted = await controller.requestPermission();
  97. expect(granted, isTrue);
  98. expect(platform.permissionRequests, 1);
  99. expect(platform.startCalls, 2);
  100. expect(controller.hasPermission, isTrue);
  101. controller.stop();
  102. });
  103. testWidgets('GPS card displays 0 km/h', (tester) async {
  104. await tester.pumpWidget(
  105. MaterialApp(
  106. theme: AppTheme.dark(),
  107. home: const Scaffold(
  108. body: SizedBox(width: 380, child: GpsSpeedCard(speedKmh: 0)),
  109. ),
  110. ),
  111. );
  112. expect(find.text('0'), findsOneWidget);
  113. expect(find.text('km/h'), findsOneWidget);
  114. expect(find.text('GPS'), findsOneWidget);
  115. });
  116. }