From 3c481e1073a5a07ab42b34a5246bffcc75e2134e Mon Sep 17 00:00:00 2001
From: tsutsu3 <tsutsu3prog@gmail.com>
Date: Sun, 26 Jan 2025 18:08:18 +0900
Subject: [PATCH] Add unlock widget tests

---
 test/widgets/helpers.dart                     |   2 +
 .../app_unlock_setup_modal_test.dart          | 274 ++++++++++++++++++
 2 files changed, 276 insertions(+)
 create mode 100644 test/widgets/settings/app_settings/advanced_settings/app_unlock_setup_modal_test.dart

diff --git a/test/widgets/helpers.dart b/test/widgets/helpers.dart
index 2fe88509..51cfe6e6 100644
--- a/test/widgets/helpers.dart
+++ b/test/widgets/helpers.dart
@@ -862,6 +862,8 @@ class TestSetupHelper {
     when(mockConfigProvider.biometricsSupport).thenReturn(true);
     when(mockConfigProvider.setStatisticsVisualizationMode(any))
         .thenAnswer((_) async => true);
+    when(mockConfigProvider.validVibrator).thenReturn(true);
+    when(mockConfigProvider.setPassCode(any)).thenAnswer((_) async => true);
   }
 
   void _initServerProviderMock(String useApiGatewayVersion) {
diff --git a/test/widgets/settings/app_settings/advanced_settings/app_unlock_setup_modal_test.dart b/test/widgets/settings/app_settings/advanced_settings/app_unlock_setup_modal_test.dart
new file mode 100644
index 00000000..70e34247
--- /dev/null
+++ b/test/widgets/settings/app_settings/advanced_settings/app_unlock_setup_modal_test.dart
@@ -0,0 +1,274 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:mockito/mockito.dart';
+import 'package:pi_hole_client/screens/settings/app_settings/advanced_settings/advanced_options.dart';
+import 'package:pi_hole_client/screens/settings/app_settings/advanced_settings/app_lock/create_pass_code_modal.dart';
+import 'package:pi_hole_client/screens/settings/app_settings/advanced_settings/app_lock/remove_passcode_modal.dart';
+import 'package:pi_hole_client/screens/settings/app_settings/advanced_settings/app_unlock_setup_modal.dart';
+import 'package:pi_hole_client/screens/settings/app_settings/advanced_settings/enter_passcode_modal.dart';
+
+import '../../../helpers.dart';
+
+void main() async {
+  await initializeApp();
+
+  group(
+    'App unlock Widget Tests',
+    () {
+      late TestSetupHelper testSetup;
+
+      setUp(() async {
+        testSetup = TestSetupHelper();
+        testSetup.initializeMock(useApiGatewayVersion: 'v6');
+      });
+
+      testWidgets(
+        'should show the app unlock setup modal (passcode not set)',
+        (WidgetTester tester) async {
+          tester.view.physicalSize = const Size(1080, 2400);
+          tester.view.devicePixelRatio = 2.0;
+
+          addTearDown(() {
+            tester.view.resetPhysicalSize();
+            tester.view.resetDevicePixelRatio();
+          });
+
+          await tester.pumpWidget(
+            testSetup.buildTestWidget(const AdvancedOptions()),
+          );
+
+          expect(find.byType(AdvancedOptions), findsOneWidget);
+          expect(find.text('App unlock'), findsOneWidget);
+
+          await tester.tap(find.text('App unlock'));
+          await tester.pumpAndSettle();
+
+          expect(find.byType(AppUnlockSetupModal), findsOneWidget);
+          expect(find.text('Status: disabled'), findsOneWidget);
+          expect(find.text('Setup passcode'), findsOneWidget);
+          expect(find.text('Use fingerprint'), findsOneWidget);
+          expect(find.text('Close'), findsOneWidget);
+
+          await tester.tap(find.text('Close'));
+          await tester.pump();
+          await tester.pumpAndSettle();
+          expect(find.byType(AppUnlockSetupModal), findsNothing);
+        },
+      );
+
+      testWidgets(
+        'should show the numpad (passcode set)',
+        (WidgetTester tester) async {
+          tester.view.physicalSize = const Size(1080, 2400);
+          tester.view.devicePixelRatio = 2.0;
+
+          addTearDown(() {
+            tester.view.resetPhysicalSize();
+            tester.view.resetDevicePixelRatio();
+          });
+
+          when(testSetup.mockConfigProvider.passCode).thenReturn('1234');
+
+          await tester.pumpWidget(
+            testSetup.buildTestWidget(const AdvancedOptions()),
+          );
+
+          expect(find.byType(AdvancedOptions), findsOneWidget);
+          expect(find.text('App unlock'), findsOneWidget);
+
+          await tester.tap(find.text('App unlock'));
+          await tester.pumpAndSettle();
+
+          expect(find.byType(EnterPasscodeModal), findsOneWidget);
+          expect(find.text('Enter passcode'), findsOneWidget);
+        },
+      );
+
+      testWidgets(
+        'should show the app unlock setup modal (passcode set)',
+        (WidgetTester tester) async {
+          tester.view.physicalSize = const Size(1080, 2400);
+          tester.view.devicePixelRatio = 2.0;
+
+          addTearDown(() {
+            tester.view.resetPhysicalSize();
+            tester.view.resetDevicePixelRatio();
+          });
+
+          when(testSetup.mockConfigProvider.passCode).thenReturn('1234');
+
+          await tester.pumpWidget(
+            testSetup.buildTestWidget(
+              const AppUnlockSetupModal(
+                topBarHeight: 0.0,
+                useBiometrics: false,
+                window: false,
+              ),
+            ),
+          );
+
+          expect(find.byType(AppUnlockSetupModal), findsOneWidget);
+          expect(find.text('App unlock'), findsOneWidget);
+          expect(find.text('Status: enabled'), findsOneWidget);
+          expect(find.text('Update passcode'), findsOneWidget);
+          expect(find.text('Remove passcode'), findsOneWidget);
+          expect(find.text('Use fingerprint'), findsOneWidget);
+          expect(find.text('Close'), findsOneWidget);
+        },
+      );
+
+      testWidgets(
+        'should setup a passcode',
+        (WidgetTester tester) async {
+          tester.view.physicalSize = const Size(1080, 2400);
+          tester.view.devicePixelRatio = 2.0;
+
+          addTearDown(() {
+            tester.view.resetPhysicalSize();
+            tester.view.resetDevicePixelRatio();
+          });
+
+          await tester.pumpWidget(
+            testSetup.buildTestWidget(
+              const AppUnlockSetupModal(
+                topBarHeight: 0.0,
+                useBiometrics: false,
+                window: false,
+              ),
+            ),
+          );
+
+          expect(find.byType(AppUnlockSetupModal), findsOneWidget);
+          expect(find.text('Setup passcode'), findsOneWidget);
+
+          await tester.tap(find.text('Setup passcode'));
+          await tester.pumpAndSettle();
+          expect(find.byType(CreatePassCodeModal), findsOneWidget);
+          expect(find.text('Enter passcode'), findsOneWidget);
+          await tester.tap(find.text('1'));
+          await tester.pump();
+          await tester.tap(find.text('2'));
+          await tester.pump();
+          await tester.tap(find.text('3'));
+          await tester.pump();
+          await tester.tap(find.text('4'));
+          await tester.pump();
+          await tester.tap(find.text('Next'));
+          await tester.pumpAndSettle();
+          await tester.tap(find.text('1'));
+          await tester.pump();
+          await tester.tap(find.text('2'));
+          await tester.pump();
+          await tester.tap(find.text('3'));
+          await tester.pump();
+          await tester.tap(find.text('4'));
+          await tester.pump();
+          await tester.tap(find.text('Finish'));
+          await tester.pumpAndSettle();
+          expect(find.text('App unlock'), findsOneWidget);
+        },
+      );
+
+      testWidgets(
+        'should update a passcode',
+        (WidgetTester tester) async {
+          tester.view.physicalSize = const Size(1080, 2400);
+          tester.view.devicePixelRatio = 2.0;
+
+          addTearDown(() {
+            tester.view.resetPhysicalSize();
+            tester.view.resetDevicePixelRatio();
+          });
+
+          when(testSetup.mockConfigProvider.passCode).thenReturn('1234');
+
+          await tester.pumpWidget(
+            testSetup.buildTestWidget(
+              const AppUnlockSetupModal(
+                topBarHeight: 0.0,
+                useBiometrics: false,
+                window: false,
+              ),
+            ),
+          );
+
+          expect(find.byType(AppUnlockSetupModal), findsOneWidget);
+          expect(find.text('Update passcode'), findsOneWidget);
+
+          await tester.tap(find.text('Update passcode'));
+          await tester.pumpAndSettle();
+          expect(find.byType(CreatePassCodeModal), findsOneWidget);
+          expect(find.text('Enter passcode'), findsOneWidget);
+          await tester.tap(find.text('5'));
+          await tester.pump();
+          await tester.tap(find.text('6'));
+          await tester.pump();
+          await tester.tap(find.text('7'));
+          await tester.pump();
+          await tester.tap(find.text('8'));
+          await tester.pump();
+          await tester.tap(find.text('Next'));
+          await tester.pumpAndSettle();
+          await tester.tap(find.text('5'));
+          await tester.pump();
+          await tester.tap(find.text('6'));
+          await tester.pump();
+          await tester.tap(find.text('7'));
+          await tester.pump();
+          await tester.tap(find.text('8'));
+          await tester.pump();
+          await tester.tap(find.text('Finish'));
+          await tester.pumpAndSettle();
+          expect(find.text('App unlock'), findsOneWidget);
+        },
+      );
+
+      testWidgets(
+        'should remove a passcode',
+        (WidgetTester tester) async {
+          tester.view.physicalSize = const Size(1080, 2400);
+          tester.view.devicePixelRatio = 2.0;
+
+          addTearDown(() {
+            tester.view.resetPhysicalSize();
+            tester.view.resetDevicePixelRatio();
+          });
+
+          when(testSetup.mockConfigProvider.passCode).thenReturn('1234');
+
+          await tester.pumpWidget(
+            testSetup.buildTestWidget(
+              const AppUnlockSetupModal(
+                topBarHeight: 0.0,
+                useBiometrics: false,
+                window: false,
+              ),
+            ),
+          );
+
+          expect(find.byType(AppUnlockSetupModal), findsOneWidget);
+
+          // Cancel
+          expect(find.text('Remove passcode'), findsOneWidget);
+          await tester.tap(find.text('Remove passcode'));
+          await tester.pumpAndSettle();
+          expect(find.byType(RemovePasscodeModal), findsOneWidget);
+          expect(find.text('Cancel'), findsOneWidget);
+          await tester.tap(find.text('Cancel'));
+          await tester.pumpAndSettle();
+
+          // Remove
+          expect(find.text('Remove passcode'), findsOneWidget);
+          await tester.tap(find.text('Remove passcode'));
+          await tester.pumpAndSettle();
+          expect(find.byType(RemovePasscodeModal), findsOneWidget);
+          expect(find.text('Remove'), findsOneWidget);
+          await tester.tap(find.text('Remove'));
+          await tester.pumpAndSettle();
+
+          expect(find.byType(AppUnlockSetupModal), findsOneWidget);
+        },
+      );
+    },
+  );
+}