settings_screen_test.dart 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import 'package:cardash_launcher/core/display_controller.dart';
  2. import 'package:cardash_launcher/core/theme/app_theme.dart';
  3. import 'package:cardash_launcher/core/theme/theme_controller.dart';
  4. import 'package:cardash_launcher/core/theme/theme_preference.dart';
  5. import 'package:cardash_launcher/data/models/app_entry.dart';
  6. import 'package:cardash_launcher/data/models/bluetooth_device_info.dart';
  7. import 'package:cardash_launcher/data/models/bluetooth_power_state.dart';
  8. import 'package:cardash_launcher/data/models/gps_speed.dart';
  9. import 'package:cardash_launcher/data/models/location_reading.dart';
  10. import 'package:cardash_launcher/data/models/media_playback.dart';
  11. import 'package:cardash_launcher/data/models/obd_state.dart';
  12. import 'package:cardash_launcher/data/models/system_status.dart';
  13. import 'package:cardash_launcher/data/models/update_info.dart';
  14. import 'package:cardash_launcher/data/repositories/settings_repository.dart';
  15. import 'package:cardash_launcher/data/services/native_bridge.dart';
  16. import 'package:cardash_launcher/data/services/pin_service.dart';
  17. import 'package:cardash_launcher/data/services/secure_store.dart';
  18. import 'package:cardash_launcher/data/services/telemetry_bridge.dart';
  19. import 'package:cardash_launcher/features/home/launcher_controller.dart';
  20. import 'package:cardash_launcher/features/home/obd_controller.dart';
  21. import 'package:cardash_launcher/features/home/system_controller.dart';
  22. import 'package:cardash_launcher/features/home/telemetry_settings_controller.dart';
  23. import 'package:cardash_launcher/features/home/weather_controller.dart';
  24. import 'package:cardash_launcher/features/lock/lock_controller.dart';
  25. import 'package:cardash_launcher/features/settings/settings_screen.dart';
  26. import 'package:cardash_launcher/features/settings/update_controller.dart';
  27. import 'package:flutter/material.dart';
  28. import 'package:flutter_test/flutter_test.dart';
  29. import 'package:provider/provider.dart';
  30. import 'package:shared_preferences/shared_preferences.dart';
  31. class _LauncherPlatform implements LauncherPlatform {
  32. @override
  33. Future<List<AppEntry>> listApps() async => const [];
  34. @override
  35. Future<void> launchApp({
  36. required String packageName,
  37. required String activityName,
  38. }) async {}
  39. @override
  40. Future<bool> isDefaultHome() async => true;
  41. @override
  42. Future<bool> requestDefaultHome() async => true;
  43. @override
  44. Future<SystemStatus> getStatus() async => const SystemStatus();
  45. @override
  46. Future<VolumeInfo> getVolume() async => const VolumeInfo();
  47. @override
  48. Future<void> setVolume(int index) async {}
  49. @override
  50. Future<bool> isMusicPlaying() async => false;
  51. @override
  52. Future<bool> sendMediaKey(String action) async => true;
  53. @override
  54. Future<MediaPlayback> getMediaState() async => const MediaPlayback();
  55. @override
  56. Future<bool> openNotificationAccessSettings() async => true;
  57. @override
  58. Future<void> setKeepScreenOn(bool enabled) async {}
  59. @override
  60. Future<bool> openUrl(String url) async => true;
  61. @override
  62. Future<UpdateInstallResult> downloadAndInstallUpdate(String url) async {
  63. return const UpdateInstallResult(started: false, permissionRequired: false);
  64. }
  65. }
  66. class _TelemetryPlatform implements TelemetryPlatform {
  67. @override
  68. Future<List<BluetoothDeviceInfo>> listBondedDevices() async => const [];
  69. @override
  70. Future<BluetoothPowerState> bluetoothState() async => BluetoothPowerState.on;
  71. @override
  72. Future<bool> ensureBluetoothPermission() async => true;
  73. @override
  74. Future<bool> openBluetoothSettings() async => true;
  75. @override
  76. Future<bool> ensureLocationPermission() async => true;
  77. @override
  78. Future<LocationReading> getLocation() async =>
  79. const LocationReading(latitude: 0, longitude: 0, place: 'Home');
  80. @override
  81. Future<void> connectObd(String address) async {}
  82. @override
  83. Future<void> disconnectObd() async {}
  84. @override
  85. Future<ObdState> getObdState() async => const ObdState();
  86. @override
  87. Future<bool> startGpsSpeed() async => false;
  88. @override
  89. Future<void> stopGpsSpeed() async {}
  90. @override
  91. Future<GpsSpeed> getGpsSpeed() async => const GpsSpeed();
  92. }
  93. class _SecureStore implements SecureStore {
  94. @override
  95. Future<String?> read(String key) async => null;
  96. @override
  97. Future<void> write(String key, String value) async {}
  98. @override
  99. Future<void> delete(String key) async {}
  100. }
  101. void main() {
  102. TestWidgetsFlutterBinding.ensureInitialized();
  103. testWidgets('settings shows the OBD-II, Speed and Temperature cards', (
  104. tester,
  105. ) async {
  106. await tester.binding.setSurfaceSize(const Size(1280, 800));
  107. addTearDown(() => tester.binding.setSurfaceSize(null));
  108. SharedPreferences.setMockInitialValues({});
  109. final prefs = await SharedPreferences.getInstance();
  110. final settings = SettingsRepository(prefs);
  111. await settings.setThemePreference(ThemePreference.light);
  112. final platform = _LauncherPlatform();
  113. final telemetry = _TelemetryPlatform();
  114. final theme = ThemeController(settings);
  115. addTearDown(theme.dispose);
  116. final display = DisplayController(platform, settings);
  117. await display.initialize();
  118. final launcher = LauncherController(platform, settings);
  119. final system = SystemController(platform);
  120. final obd = ObdController(telemetry, settings)..initialize();
  121. final weather = WeatherController(telemetry);
  122. final telemetrySettings = TelemetrySettingsController(settings, weather)
  123. ..initialize();
  124. final update = UpdateController(platform);
  125. final lock = LockController(PinService(_SecureStore(), iterations: 10));
  126. await lock.initialize();
  127. await tester.pumpWidget(
  128. MultiProvider(
  129. providers: [
  130. ChangeNotifierProvider.value(value: theme),
  131. ChangeNotifierProvider.value(value: display),
  132. ChangeNotifierProvider.value(value: launcher),
  133. ChangeNotifierProvider.value(value: system),
  134. ChangeNotifierProvider.value(value: obd),
  135. ChangeNotifierProvider.value(value: weather),
  136. ChangeNotifierProvider.value(value: telemetrySettings),
  137. ChangeNotifierProvider.value(value: update),
  138. ChangeNotifierProvider.value(value: lock),
  139. ],
  140. child: MaterialApp(
  141. theme: AppTheme.light(),
  142. home: const SettingsScreen(),
  143. ),
  144. ),
  145. );
  146. await tester.pumpAndSettle();
  147. expect(find.text('OBD-II'), findsOneWidget);
  148. expect(find.text('Speed'), findsOneWidget);
  149. expect(find.text('Temperature'), findsOneWidget);
  150. expect(find.text('Show speed'), findsOneWidget);
  151. expect(find.text('Show temperature'), findsOneWidget);
  152. expect(tester.takeException(), isNull);
  153. obd.dispose();
  154. weather.dispose();
  155. telemetrySettings.dispose();
  156. });
  157. }