Commit 7601406

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-11-01 18:37:49
add tests for displaying null values
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 983a0b2
test/ui/components/measurement_list_entry_test.dart
@@ -0,0 +1,79 @@
+import 'package:blood_pressure_app/components/measurement_list/measurement_list_entry.dart';
+import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/ram_only_implementations.dart';
+import 'package:blood_pressure_app/model/storage/intervall_store.dart';
+import 'package:blood_pressure_app/model/storage/settings_store.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:provider/provider.dart';
+
+void main() {
+  group('MeasurementListRow', () {
+    testWidgets('should initialize without errors', (widgetTester) async {
+      await widgetTester.pumpWidget(_materialApp(MeasurementListRow(
+          record: BloodPressureRecord(DateTime(2023), 123, 80, 60, 'test'))));
+      await widgetTester.pumpWidget(_materialApp(MeasurementListRow(
+          record: BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(31279811), null, null, null, 'null test'))));
+      await widgetTester.pumpWidget(_materialApp(MeasurementListRow(
+          record: BloodPressureRecord(DateTime(2023), 124, 85, 63, 'color', needlePin: MeasurementNeedlePin(Colors.cyan)))));
+
+    });
+    testWidgets('should expand correctly', (widgetTester) async {
+      await widgetTester.pumpWidget(_materialApp(MeasurementListRow(
+          record: BloodPressureRecord(DateTime(2023), 123, 78, 56, 'Test texts'))));
+      expect(find.byIcon(Icons.expand_more), findsOneWidget);
+      await widgetTester.tap(find.byIcon(Icons.expand_more));
+      await widgetTester.pumpAndSettle();
+      expect(find.text('Timestamp'), findsOneWidget);
+      expect(find.byIcon(Icons.edit), findsOneWidget);
+      expect(find.byIcon(Icons.delete), findsOneWidget);
+    });
+    testWidgets('should display correct information', (widgetTester) async {
+      await widgetTester.pumpWidget(_materialApp(MeasurementListRow(
+          record: BloodPressureRecord(DateTime(2023), 123, 78, 56, 'Test text'))));
+      expect(find.text('123'), findsOneWidget);
+      expect(find.text('78'), findsOneWidget);
+      expect(find.text('56'), findsOneWidget);
+      expect(find.textContaining('2023'), findsNothing);
+      expect(find.text('Test text'), findsNothing);
+
+      expect(find.byIcon(Icons.expand_more), findsOneWidget);
+      await widgetTester.tap(find.byIcon(Icons.expand_more));
+      await widgetTester.pumpAndSettle();
+
+      expect(find.text('Test text'), findsOneWidget);
+      expect(find.textContaining('2023'), findsOneWidget);
+    });
+    testWidgets('should not display null values', (widgetTester) async {
+      await widgetTester.pumpWidget(_materialApp(MeasurementListRow(
+          record: BloodPressureRecord(DateTime(2023), null, null, null, ''))));
+      expect(find.text('null'), findsNothing);
+      expect(find.byIcon(Icons.expand_more), findsOneWidget);
+      await widgetTester.tap(find.byIcon(Icons.expand_more));
+      await widgetTester.pumpAndSettle();
+      expect(find.text('null'), findsNothing);
+    });
+  });
+}
+
+Widget _materialApp(Widget child) {
+  return MaterialApp(
+    home: Localizations(
+      delegates: AppLocalizations.localizationsDelegates,
+      locale: const Locale('en'),
+      child: MultiProvider(
+          providers: [
+            ChangeNotifierProvider(create: (_) => Settings()),
+            ChangeNotifierProvider(create: (_) => IntervallStoreManager(IntervallStorage(), IntervallStorage(), IntervallStorage())),
+            ChangeNotifierProvider<BloodPressureModel>(create: (_) => RamBloodPressureModel()),
+          ],
+          child: Localizations(
+            delegates: AppLocalizations.localizationsDelegates,
+            locale: const Locale('en'),
+            child: Scaffold(body: child),
+          ),
+      )
+    ),
+  );
+}
\ No newline at end of file
test/ui/navigation_test.dart
@@ -12,15 +12,12 @@ import 'package:blood_pressure_app/screens/statistics.dart';
 import 'package:blood_pressure_app/screens/subsettings/enter_timeformat.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
-import 'package:mockito/mockito.dart';
 import 'package:provider/provider.dart';
 
-class MockNavigatorObserver extends Mock implements NavigatorObserver {}
-
 void main() {
   group('start page', () {
     testWidgets('should navigate to add measurements page', (widgetTester) async {
-      await _pumpAppRoot(widgetTester);
+      await pumpAppRoot(widgetTester);
       expect(find.byIcon(Icons.add), findsOneWidget);
       await widgetTester.tap(find.byIcon(Icons.add));
       await widgetTester.pumpAndSettle();
@@ -28,7 +25,7 @@ void main() {
       expect(find.byType(AddMeasurementPage), findsOneWidget);
     });
     testWidgets('should navigate to settings page', (widgetTester) async {
-      await _pumpAppRoot(widgetTester);
+      await pumpAppRoot(widgetTester);
       expect(find.byIcon(Icons.settings), findsOneWidget);
       await widgetTester.tap(find.byIcon(Icons.settings));
       await widgetTester.pumpAndSettle();
@@ -36,7 +33,7 @@ void main() {
       expect(find.byType(SettingsPage), findsOneWidget);
     });
     testWidgets('should navigate to stats page', (widgetTester) async {
-      await _pumpAppRoot(widgetTester);
+      await pumpAppRoot(widgetTester);
       expect(find.byIcon(Icons.insights), findsOneWidget);
       await widgetTester.tap(find.byIcon(Icons.insights));
       await widgetTester.pumpAndSettle();
@@ -46,7 +43,7 @@ void main() {
   });
   group('add measurement page', () {
     testWidgets('should cancel', (widgetTester) async {
-      await _pumpAppRoot(widgetTester);
+      await pumpAppRoot(widgetTester);
       expect(find.byIcon(Icons.add), findsOneWidget);
       await widgetTester.tap(find.byIcon(Icons.add));
       await widgetTester.pumpAndSettle();
@@ -59,15 +56,15 @@ void main() {
       expect(find.byType(AddMeasurementPage), findsNothing);
     });
     testWidgets('should submit', (widgetTester) async {
-      await _pumpAppRoot(widgetTester);
-      await _addMeasurementThroughPage(widgetTester, 100, 70, 60);
+      await pumpAppRoot(widgetTester);
+      await addMeasurementThroughPage(widgetTester, 100, 70, 60);
 
       expect(find.byType(AddMeasurementPage), findsNothing);
     });
   });
   group('settings page', () {
     testWidgets('open EnterTimeFormatScreen', (widgetTester) async {
-      await _pumpAppRoot(widgetTester);
+      await pumpAppRoot(widgetTester);
       expect(find.byIcon(Icons.settings), findsOneWidget);
       await widgetTester.tap(find.byIcon(Icons.settings));
       await widgetTester.pumpAndSettle();
@@ -84,14 +81,16 @@ void main() {
   });
 }
 
-Future<void> _pumpAppRoot(WidgetTester widgetTester, {
+/// Creates a the same App as the main method 
+Future<void> pumpAppRoot(WidgetTester widgetTester, {
   Settings? settings,
   ExportSettings? exportSettings,
   CsvExportSettings? csvExportSettings,
   PdfExportSettings? pdfExportSettings,
   IntervallStoreManager? intervallStoreManager,
+  BloodPressureModel? model
 }) async {
-  final model = RamBloodPressureModel();
+  model ??= RamBloodPressureModel();
   settings ??= Settings();
   exportSettings ??= ExportSettings();
   csvExportSettings ??= CsvExportSettings();
@@ -104,12 +103,12 @@ Future<void> _pumpAppRoot(WidgetTester widgetTester, {
     ChangeNotifierProvider(create: (_) => csvExportSettings),
     ChangeNotifierProvider(create: (_) => pdfExportSettings),
     ChangeNotifierProvider(create: (_) => intervallStoreManager),
-    ChangeNotifierProvider<BloodPressureModel>(create: (_) => model),
+    ChangeNotifierProvider<BloodPressureModel>(create: (_) => model!),
   ], child: const AppRoot()));
 }
 
 // starts at AppRoot, ends at AppRoot
-Future<void> _addMeasurementThroughPage(WidgetTester widgetTester, int sys, int dia, int pul) async {
+Future<void> addMeasurementThroughPage(WidgetTester widgetTester, int sys, int dia, int pul) async {
   expect(find.byType(AppRoot), findsOneWidget);
   expect(find.byIcon(Icons.add), findsOneWidget);
   await widgetTester.tap(find.byIcon(Icons.add));
test/ui/statistics_test.dart
@@ -30,6 +30,24 @@ void main() {
       expect(find.descendant(of: measurementCountWidget, matching: find.text('51')), findsNothing);
       expect(find.descendant(of: measurementCountWidget, matching: find.text('50')), findsOneWidget);
     });
+    testWidgets("should not display 'null' when filled", (widgetTester) async {
+      await _initStatsPage(widgetTester, [
+        BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(1), 40, 60, null, ''),
+        BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(2), null, null, null, ''),
+        for (int i = 1; i<51; i++) // can't safe entries at or before epoch
+          BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(1582991592 + i), 40+i, 60+i, 30+i, 'Test comment $i'),
+      ],
+          intervallStoreManager: IntervallStoreManager(IntervallStorage(), IntervallStorage(), IntervallStorage(stepSize: TimeStep.lifetime))
+      );
+      expect(find.text('null',findRichText: true, skipOffstage: false), findsNothing);
+    });
+
+    testWidgets("should not display 'null' when empty", (widgetTester) async {
+      await _initStatsPage(widgetTester, [],
+          intervallStoreManager: IntervallStoreManager(IntervallStorage(), IntervallStorage(), IntervallStorage(stepSize: TimeStep.lifetime))
+      );
+      expect(find.text('null',findRichText: true, skipOffstage: false), findsNothing);
+    });
   });
 }