Commit 5f571f6

derdilla <derdilla06@gmail.com>
2023-06-04 08:48:45
add unit test for AddMeasurementPage navigation
1 parent ea36107
Changed files (2)
lib/screens/add_measurement.dart
@@ -102,6 +102,7 @@ class _AddMeasurementPageState extends State<AddMeasurementPage> {
                 Consumer<Settings>(
                   builder: (context, settings, child) {
                     return TextFormField(
+                      key: const Key('txtSys'),
                       initialValue: widget.isEdit ? _systolic.toString() : '',
                       decoration: const InputDecoration(
                           hintText: 'systolic'
@@ -137,6 +138,7 @@ class _AddMeasurementPageState extends State<AddMeasurementPage> {
                 Consumer<Settings>(
                   builder: (context, settings, child) {
                     return TextFormField(
+                      key: const Key('txtDia'),
                       initialValue: widget.isEdit ? _diastolic.toString() : '',
                       decoration: const InputDecoration(
                           hintText: 'diastolic'
@@ -171,6 +173,7 @@ class _AddMeasurementPageState extends State<AddMeasurementPage> {
                 Consumer<Settings>(
                   builder: (context, settings, child) {
                     return TextFormField(
+                      key: const Key('txtPul'),
                       initialValue: widget.isEdit ? _pulse.toString() : '',
                       decoration: const InputDecoration(
                           hintText: 'pulse'
@@ -218,33 +221,35 @@ class _AddMeasurementPageState extends State<AddMeasurementPage> {
                 Row(
                   children: [
                     ElevatedButton(
-                        onPressed: () {
-                          if (widget.isEdit) {
-                            Provider.of<BloodPressureModel>(context, listen: false).add(
-                                BloodPressureRecord(widget.initTime ?? DateTime.now(), widget.initSys, widget.initDia, widget.initPul, widget.initNote)
-                            );
-                          }
-                          Navigator.of(context).pop();
-                        },
-                        style: ElevatedButton.styleFrom(
-                            backgroundColor: Theme.of(context).unselectedWidgetColor
-                        ),
-                        child: const Text('CANCEL')
+                      key: const Key('btnCancel'),
+                      onPressed: () {
+                        if (widget.isEdit) {
+                          Provider.of<BloodPressureModel>(context, listen: false).add(
+                              BloodPressureRecord(widget.initTime ?? DateTime.now(), widget.initSys, widget.initDia, widget.initPul, widget.initNote)
+                          );
+                        }
+                        Navigator.of(context).pop();
+                      },
+                      style: ElevatedButton.styleFrom(
+                          backgroundColor: Theme.of(context).unselectedWidgetColor
+                      ),
+                      child: const Text('CANCEL')
                     ),
                     const Spacer(),
                     ElevatedButton(
-                        onPressed: () {
-                          if (_formKey.currentState!.validate()) {
-                            Provider.of<BloodPressureModel>(context, listen: false).add(
-                                BloodPressureRecord(_time, _systolic, _diastolic, _pulse, _note)
-                            );
-                            Navigator.of(context).pop();
-                          }
-                        },
-                        style: ElevatedButton.styleFrom(
-                            backgroundColor: Theme.of(context).primaryColor
-                        ),
-                        child: const Text('SAVE')
+                      key: const Key('btnSave'),
+                      onPressed: () {
+                        if (_formKey.currentState!.validate()) {
+                          Provider.of<BloodPressureModel>(context, listen: false).add(
+                              BloodPressureRecord(_time, _systolic, _diastolic, _pulse, _note)
+                          );
+                          Navigator.of(context).pop();
+                        }
+                      },
+                      style: ElevatedButton.styleFrom(
+                          backgroundColor: Theme.of(context).primaryColor
+                      ),
+                      child: const Text('SAVE')
                     )
                   ],
                 )
test/ui/navigation_test.dart
@@ -14,8 +14,8 @@ import 'package:mockito/mockito.dart';
 class MockNavigatorObserver extends Mock implements NavigatorObserver {}
 
 void main() {
-  group('navigation', () {
-    testWidgets('should navigate to measurements page', (widgetTester) async {
+  group('start page', () {
+    testWidgets('should navigate to add measurements page', (widgetTester) async {
       await _pumpAppRoot(widgetTester);
       expect(find.byIcon(Icons.add), findsOneWidget);
       await widgetTester.tap(find.byIcon(Icons.add));
@@ -40,6 +40,27 @@ void main() {
       expect(find.byType(StatisticsPage), findsOneWidget);
     });
   });
+  group('add measurement page', () {
+    testWidgets('should cancel', (widgetTester) async {
+      await _pumpAppRoot(widgetTester);
+      expect(find.byIcon(Icons.add), findsOneWidget);
+      await widgetTester.tap(find.byIcon(Icons.add));
+      await widgetTester.pumpAndSettle();
+
+      expect(find.byType(AddMeasurementPage), findsOneWidget);
+      expect(find.byKey(const Key('btnCancel')), findsOneWidget);
+
+      await widgetTester.tap(find.byKey(const Key('btnCancel')));
+      await widgetTester.pumpAndSettle();
+      expect(find.byType(AddMeasurementPage), findsNothing);
+    });
+    testWidgets('should submit', (widgetTester) async {
+      await _pumpAppRoot(widgetTester);
+      await _addMeasurementThroughPage(widgetTester, 100, 70, 60);
+
+      expect(find.byType(AddMeasurementPage), findsNothing);
+    });
+  });
 }
 
 Future<void> _pumpAppRoot(WidgetTester widgetTester) async {
@@ -55,4 +76,26 @@ Future<void> _pumpAppRoot(WidgetTester widgetTester) async {
           child: const AppRoot()
       )
   );
+}
+
+// starts at AppRoot, ends at AppRoot
+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));
+  await widgetTester.pumpAndSettle();
+  
+  expect(find.byType(AddMeasurementPage), findsOneWidget);
+
+  expect(find.byKey(const Key('txtSys')), findsOneWidget);
+  expect(find.byKey(const Key('txtDia')), findsOneWidget);
+  expect(find.byKey(const Key('txtPul')), findsOneWidget);
+  expect(find.byKey(const Key('btnSave')), findsOneWidget);
+
+  await widgetTester.enterText(find.byKey(const Key('txtSys')), sys.toString());
+  await widgetTester.enterText(find.byKey(const Key('txtDia')), dia.toString());
+  await widgetTester.enterText(find.byKey(const Key('txtPul')), pul.toString());
+
+  await widgetTester.tap(find.byKey(const Key('btnSave')));
+  await widgetTester.pumpAndSettle();
 }
\ No newline at end of file