telemetry_settings_controller_test.dart 5.0 KB

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