telemetry_settings_controller_test.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import 'package:cardash_launcher/data/models/bluetooth_device_info.dart';
  2. import 'package:cardash_launcher/data/models/gps_speed.dart';
  3. import 'package:cardash_launcher/data/models/location_reading.dart';
  4. import 'package:cardash_launcher/data/models/obd_state.dart';
  5. import 'package:cardash_launcher/data/repositories/settings_repository.dart';
  6. import 'package:cardash_launcher/data/services/telemetry_bridge.dart';
  7. import 'package:cardash_launcher/data/services/weather_service.dart';
  8. import 'package:cardash_launcher/features/home/telemetry_settings_controller.dart';
  9. import 'package:cardash_launcher/features/home/weather_controller.dart';
  10. import 'package:flutter_test/flutter_test.dart';
  11. import 'package:shared_preferences/shared_preferences.dart';
  12. class _TelemetryPlatform implements TelemetryPlatform {
  13. _TelemetryPlatform({this.locationGranted = true});
  14. final bool locationGranted;
  15. @override
  16. Future<bool> ensureLocationPermission() async => locationGranted;
  17. @override
  18. Future<LocationReading> getLocation() async =>
  19. const LocationReading(latitude: 1, longitude: 2, place: 'Sofia');
  20. @override
  21. Future<List<BluetoothDeviceInfo>> listBondedDevices() async => const [];
  22. @override
  23. Future<bool> isBluetoothEnabled() async => true;
  24. @override
  25. Future<bool> ensureBluetoothPermission() async => true;
  26. @override
  27. Future<bool> openBluetoothSettings() async => true;
  28. @override
  29. Future<void> connectObd(String address) async {}
  30. @override
  31. Future<void> disconnectObd() async {}
  32. @override
  33. Future<ObdState> getObdState() async => const ObdState();
  34. @override
  35. Future<bool> startGpsSpeed() async => false;
  36. @override
  37. Future<void> stopGpsSpeed() async {}
  38. @override
  39. Future<GpsSpeed> getGpsSpeed() async => const GpsSpeed();
  40. }
  41. class _WeatherService extends WeatherService {
  42. @override
  43. Future<double?> temperatureCelsius({
  44. required double latitude,
  45. required double longitude,
  46. }) async => 12;
  47. }
  48. void main() {
  49. TestWidgetsFlutterBinding.ensureInitialized();
  50. test('persists source choices and starts weather when needed', () async {
  51. SharedPreferences.setMockInitialValues({});
  52. final prefs = await SharedPreferences.getInstance();
  53. final settings = SettingsRepository(prefs);
  54. await settings.setTemperatureEnabled(true);
  55. final weather = WeatherController(
  56. _TelemetryPlatform(),
  57. weatherService: _WeatherService(),
  58. );
  59. final controller = TelemetrySettingsController(settings, weather)
  60. ..initialize();
  61. addTearDown(controller.dispose);
  62. addTearDown(weather.dispose);
  63. expect(controller.speedEnabled, isTrue);
  64. expect(controller.speedUseObd, isTrue);
  65. expect(controller.temperatureEnabled, isTrue);
  66. expect(controller.temperatureUseObd, isTrue);
  67. await controller.setSpeedEnabled(false);
  68. await controller.setSpeedUseObd(false);
  69. await controller.setTemperatureUseObd(false);
  70. expect(settings.speedEnabled, isFalse);
  71. expect(settings.speedUseObd, isFalse);
  72. expect(settings.temperatureUseObd, isFalse);
  73. expect(weather.enabled, isTrue);
  74. expect(weather.hasTemperature, isTrue);
  75. expect(settings.weatherLocationTemperature, isTrue);
  76. });
  77. test('turning temperature off stops and clears the weather poller', () async {
  78. SharedPreferences.setMockInitialValues({});
  79. final prefs = await SharedPreferences.getInstance();
  80. final settings = SettingsRepository(prefs);
  81. await settings.setTemperatureEnabled(true);
  82. final weather = WeatherController(
  83. _TelemetryPlatform(),
  84. weatherService: _WeatherService(),
  85. );
  86. final controller = TelemetrySettingsController(settings, weather)
  87. ..initialize();
  88. addTearDown(controller.dispose);
  89. addTearDown(weather.dispose);
  90. await controller.setTemperatureUseObd(false);
  91. expect(weather.hasTemperature, isTrue);
  92. await controller.setTemperatureEnabled(false);
  93. expect(controller.temperatureEnabled, isFalse);
  94. expect(settings.temperatureEnabled, isFalse);
  95. expect(weather.enabled, isFalse);
  96. expect(weather.hasTemperature, isFalse);
  97. expect(settings.weatherLocationTemperature, isFalse);
  98. });
  99. test(
  100. 'denied location leaves the switch on but reports weather failure',
  101. () async {
  102. SharedPreferences.setMockInitialValues({});
  103. final prefs = await SharedPreferences.getInstance();
  104. final settings = SettingsRepository(prefs);
  105. await settings.setTemperatureEnabled(true);
  106. final weather = WeatherController(
  107. _TelemetryPlatform(locationGranted: false),
  108. weatherService: _WeatherService(),
  109. );
  110. final controller = TelemetrySettingsController(settings, weather)
  111. ..initialize();
  112. addTearDown(controller.dispose);
  113. addTearDown(weather.dispose);
  114. final granted = await controller.setTemperatureUseObd(false);
  115. expect(granted, isFalse);
  116. expect(controller.temperatureUseObd, isFalse);
  117. expect(weather.enabled, isFalse);
  118. expect(controller.weatherError, isNotNull);
  119. },
  120. );
  121. }