From 0008eff1b87e10de33292a6e1828616b74b7e7e8 Mon Sep 17 00:00:00 2001 From: Janez T Date: Sun, 26 Apr 2026 08:24:07 +0200 Subject: [PATCH] fix: Stabilize reported tests #31 ref: #32 #37 --- lib/providers/contacts_provider.dart | 10 ++++-- .../messages/recipient_selector_sheet.dart | 13 ++++++-- .../sensors/sensor_telemetry_card.dart | 32 ++++++++++++++++--- ...messages_provider_retransmission_test.dart | 4 ++- test/widgets/connection_dialog_test.dart | 5 ++- .../traffic_stats_reporting_section_test.dart | 22 ++++++------- 6 files changed, 63 insertions(+), 23 deletions(-) diff --git a/lib/providers/contacts_provider.dart b/lib/providers/contacts_provider.dart index 2072988..c000a00 100644 --- a/lib/providers/contacts_provider.dart +++ b/lib/providers/contacts_provider.dart @@ -1263,11 +1263,17 @@ class ContactsProvider with ChangeNotifier { Map? existingExtraSensorData, Map? incomingExtraSensorData, ) { - final merged = {...?existingExtraSensorData}; if (incomingExtraSensorData == null || incomingExtraSensorData.isEmpty) { - return merged; + return {...?existingExtraSensorData}; } + final isFullTelemetryRefresh = incomingExtraSensorData.containsKey( + _rawTelemetryHexKey, + ); + final merged = { + if (!isFullTelemetryRefresh) ...?existingExtraSensorData, + }; + final incomingMetricFamilies = incomingExtraSensorData.keys .map(_telemetryMetricFamilyForKey) .whereType() diff --git a/lib/widgets/messages/recipient_selector_sheet.dart b/lib/widgets/messages/recipient_selector_sheet.dart index 09e7657..0653b62 100644 --- a/lib/widgets/messages/recipient_selector_sheet.dart +++ b/lib/widgets/messages/recipient_selector_sheet.dart @@ -328,9 +328,16 @@ class _RecipientSelectorSheetState extends State { MessagesProvider? messagesProvider, ) { final previewData = _channelPreviewData(context, channel, messagesProvider); - final sharingMode = context.watch().channelLocationSharingModeForChannel( - channel.publicKey.length > 1 ? channel.publicKey[1] : 0, - ); + ChannelLocationSharingMode? sharingMode; + try { + sharingMode = context + .watch() + .channelLocationSharingModeForChannel( + channel.publicKey.length > 1 ? channel.publicKey[1] : 0, + ); + } on ProviderNotFoundException { + sharingMode = null; + } return _buildRecipientCard( context: context, diff --git a/lib/widgets/sensors/sensor_telemetry_card.dart b/lib/widgets/sensors/sensor_telemetry_card.dart index 22503f1..a811791 100644 --- a/lib/widgets/sensors/sensor_telemetry_card.dart +++ b/lib/widgets/sensors/sensor_telemetry_card.dart @@ -238,15 +238,27 @@ List sensorMetricOptionsFor( final coreFieldKeys = { if (batteryMilliVolts != null || batteryPercentage != null) ...extraSensorData?.keys.where( - (k) => k.startsWith('voltage_') || k.startsWith('analog_input_'), + (k) => + _isSourceChannelMetric(extraSensorData, 'voltage', k) || + _isSourceChannelMetric(extraSensorData, 'battery', k) || + k.startsWith('analog_input_'), ) ?? [], if (temperature != null) - ...extraSensorData?.keys.where((k) => k.startsWith('temperature_')) ?? [], + ...extraSensorData?.keys.where( + (k) => _isSourceChannelMetric(extraSensorData, 'temperature', k), + ) ?? + [], if (humidity != null) - ...extraSensorData?.keys.where((k) => k.startsWith('humidity_')) ?? [], + ...extraSensorData?.keys.where( + (k) => _isSourceChannelMetric(extraSensorData, 'humidity', k), + ) ?? + [], if (pressure != null) - ...extraSensorData?.keys.where((k) => k.startsWith('pressure_')) ?? [], + ...extraSensorData?.keys.where( + (k) => _isSourceChannelMetric(extraSensorData, 'pressure', k), + ) ?? + [], }; if (extraSensorData != null) { @@ -3117,6 +3129,18 @@ int? _sourceChannelForField( return null; } +bool _isSourceChannelMetric( + Map? extraSensorData, + String fieldKey, + String metricKey, +) { + final sourceChannel = _sourceChannelForField(extraSensorData, fieldKey); + if (sourceChannel == null) { + return false; + } + return metricKey == '${fieldKey}_$sourceChannel'; +} + String _resolvedMetricLabel( String fieldKey, String defaultLabel, { diff --git a/test/providers/messages_provider_retransmission_test.dart b/test/providers/messages_provider_retransmission_test.dart index d5f60ad..0b6b189 100644 --- a/test/providers/messages_provider_retransmission_test.dart +++ b/test/providers/messages_provider_retransmission_test.dart @@ -926,7 +926,9 @@ void main() { ); provider.markMessageSent('m2', 88, 10); - async.elapse(const Duration(milliseconds: 11)); + final timeoutMs = provider.messages.single.suggestedTimeoutMs!; + + async.elapse(Duration(milliseconds: timeoutMs + 1)); async.flushMicrotasks(); expect(provider.messages.single.retryAttempt, 1); diff --git a/test/widgets/connection_dialog_test.dart b/test/widgets/connection_dialog_test.dart index 9122c64..41f5bdd 100644 --- a/test/widgets/connection_dialog_test.dart +++ b/test/widgets/connection_dialog_test.dart @@ -201,7 +201,10 @@ void main() { addTearDown(tester.view.reset); final connectionProvider = _TcpConnectableFakeConnectionProvider(); - final networkScanner = _FakeNetworkScannerService(initiallyScanning: true); + final networkScanner = _FakeNetworkScannerService( + initiallyScanning: true, + keepScanning: true, + ); await tester.pumpWidget( ChangeNotifierProvider.value( diff --git a/test/widgets/traffic_stats_reporting_section_test.dart b/test/widgets/traffic_stats_reporting_section_test.dart index 7865e84..9f939c9 100644 --- a/test/widgets/traffic_stats_reporting_section_test.dart +++ b/test/widgets/traffic_stats_reporting_section_test.dart @@ -5,6 +5,7 @@ import 'package:http/http.dart' as http; import 'package:http/testing.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:meshcore_sar_app/l10n/app_localizations.dart'; import 'package:meshcore_sar_app/services/traffic_stats_reporting_service.dart'; import 'package:meshcore_sar_app/widgets/settings/traffic_stats_reporting_section.dart'; @@ -57,6 +58,8 @@ void main() { await tester.pumpWidget( MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, home: Scaffold( body: ListenableBuilder( listenable: service, @@ -68,27 +71,22 @@ void main() { ), ); - expect(find.text('Anonymous RX stats reporting'), findsOneWidget); - expect( - find.text( - 'Upload RX live-traffic packet type and path mode totals to the fixed Cloudflare worker every 5 minutes.', - ), - findsOneWidget, - ); + expect(find.text('Anonymous RX stats'), findsOneWidget); + expect(find.text('Upload packet totals every 5 min'), findsOneWidget); expect(find.text('Reporting interval'), findsNothing); expect(service.isEnabled, isTrue); + await tester.tap(find.widgetWithText(TextButton, 'View')); + await tester.pump(); + + expect(launchedUrls, ['https://mcstats.dz0ny.dev']); + await tester.tap(find.byType(Switch)); await tester.pumpAndSettle(); expect(service.isEnabled, isFalse); expect(service.intervalMinutes, 5); - await tester.tap(find.widgetWithText(TextButton, 'View public stats')); - await tester.pump(); - - expect(launchedUrls, ['https://mcstats.dz0ny.dev']); - service.dispose(); }); }