settings_screen_test.dart 6.5 KB

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