obd_settings_card_test.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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/repositories/settings_repository.dart';
  8. import 'package:cardash_launcher/data/services/telemetry_bridge.dart';
  9. import 'package:cardash_launcher/features/home/obd_controller.dart';
  10. import 'package:cardash_launcher/features/settings/obd_settings_card.dart';
  11. import 'package:flutter/material.dart';
  12. import 'package:flutter_test/flutter_test.dart';
  13. import 'package:provider/provider.dart';
  14. import 'package:shared_preferences/shared_preferences.dart';
  15. const _obd = BluetoothDeviceInfo(
  16. name: 'ELM327',
  17. address: 'AA:BB:CC:DD:EE:01',
  18. deviceClass: 0x1F00,
  19. );
  20. const _phone = BluetoothDeviceInfo(
  21. name: 'Pixel 8',
  22. address: 'AA:BB:CC:DD:EE:02',
  23. deviceClass: 0x0200,
  24. );
  25. class _CardTelemetry implements TelemetryPlatform {
  26. @override
  27. Future<List<BluetoothDeviceInfo>> listBondedDevices() async => const [
  28. _obd,
  29. _phone,
  30. ];
  31. @override
  32. Future<BluetoothPowerState> bluetoothState() async => BluetoothPowerState.on;
  33. @override
  34. Future<bool> ensureBluetoothPermission() async => true;
  35. @override
  36. Future<bool> openBluetoothSettings() async => true;
  37. @override
  38. Future<bool> ensureLocationPermission() async => true;
  39. @override
  40. Future<LocationReading> getLocation() async =>
  41. const LocationReading(latitude: 0, longitude: 0, place: '');
  42. @override
  43. Future<void> connectObd(String address) async {}
  44. @override
  45. Future<void> disconnectObd() async {}
  46. @override
  47. Future<ObdState> getObdState() async => const ObdState();
  48. @override
  49. Future<bool> startGpsSpeed() async => false;
  50. @override
  51. Future<void> stopGpsSpeed() async {}
  52. @override
  53. Future<GpsSpeed> getGpsSpeed() async => const GpsSpeed();
  54. }
  55. void main() {
  56. testWidgets('OBD card hides phones until Show all paired devices is tapped', (
  57. tester,
  58. ) async {
  59. await tester.binding.setSurfaceSize(const Size(900, 700));
  60. addTearDown(() => tester.binding.setSurfaceSize(null));
  61. SharedPreferences.setMockInitialValues({});
  62. final prefs = await SharedPreferences.getInstance();
  63. final controller = ObdController(
  64. _CardTelemetry(),
  65. SettingsRepository(prefs),
  66. );
  67. addTearDown(controller.dispose);
  68. await tester.pumpWidget(
  69. MaterialApp(
  70. theme: AppTheme.light(),
  71. home: ChangeNotifierProvider<ObdController>.value(
  72. value: controller,
  73. child: const Scaffold(
  74. body: SizedBox(
  75. width: 560,
  76. child: Padding(
  77. padding: EdgeInsets.all(24),
  78. child: ObdSettingsCard(),
  79. ),
  80. ),
  81. ),
  82. ),
  83. ),
  84. );
  85. await tester.pumpAndSettle();
  86. expect(find.text('ELM327 · AA:BB:CC:DD:EE:01'), findsNothing);
  87. expect(find.text('Show all paired devices'), findsOneWidget);
  88. await tester.tap(find.text('None').first);
  89. await tester.pumpAndSettle();
  90. expect(find.text('ELM327 · AA:BB:CC:DD:EE:01'), findsOneWidget);
  91. expect(find.text('Pixel 8 · AA:BB:CC:DD:EE:02'), findsNothing);
  92. await tester.tap(find.text('None').last);
  93. await tester.pumpAndSettle();
  94. await tester.tap(find.text('Show all paired devices'));
  95. await tester.pumpAndSettle();
  96. await tester.tap(find.text('None').first);
  97. await tester.pumpAndSettle();
  98. expect(find.text('Pixel 8 · AA:BB:CC:DD:EE:02'), findsOneWidget);
  99. });
  100. }