From 3868c160d3ed0db670e345743d57749d6c8f3cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bot=20of=20Thomas=20G=C3=BCttler?= Date: Mon, 25 May 2026 14:30:13 +0200 Subject: [PATCH] fix: disable Try connection button when no password is available (#235) (#247) --- lib/ui/screens/edit_account_screen.dart | 6 +++- test/widget/edit_account_screen_test.dart | 39 ++++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib/ui/screens/edit_account_screen.dart b/lib/ui/screens/edit_account_screen.dart index a479f89..69ce0f2 100644 --- a/lib/ui/screens/edit_account_screen.dart +++ b/lib/ui/screens/edit_account_screen.dart @@ -51,6 +51,7 @@ class _EditAccountScreenState extends ConsumerState { _smtpHostCtrl.addListener(_rebuild); _sieveHostCtrl.addListener(_rebuild); _imapHostCtrl.addListener(_rebuild); + _passwordCtrl.addListener(_rebuild); unawaited(_load()); } @@ -90,6 +91,7 @@ class _EditAccountScreenState extends ConsumerState { _smtpHostCtrl.removeListener(_rebuild); _sieveHostCtrl.removeListener(_rebuild); _imapHostCtrl.removeListener(_rebuild); + _passwordCtrl.removeListener(_rebuild); for (final c in [ _displayNameCtrl, _usernameCtrl, @@ -353,7 +355,9 @@ class _EditAccountScreenState extends ConsumerState { testing: _tryTesting, okMessage: _tryOk, errorMessage: _tryErr, - onPressed: _tryConnection, + onPressed: _hasStoredPassword || _passwordCtrl.text.isNotEmpty + ? _tryConnection + : null, ), const SizedBox(height: 8), FilledButton(onPressed: _save, child: const Text('Save')), diff --git a/test/widget/edit_account_screen_test.dart b/test/widget/edit_account_screen_test.dart index 816ad96..6178474 100644 --- a/test/widget/edit_account_screen_test.dart +++ b/test/widget/edit_account_screen_test.dart @@ -106,7 +106,8 @@ void main() { }); testWidgets( - 'try connection shows password required when no password stored', ( + 'try connection button is disabled when no password stored or entered', + ( tester, ) async { tester.view.physicalSize = const Size(800, 1400); @@ -125,11 +126,41 @@ void main() { ); await tester.pumpAndSettle(); - await tester.tap(find.byKey(const Key('editTryConnectionButton'))); + final button = tester.widget( + find.byKey(const Key('editTryConnectionButton')), + ); + expect(button.onPressed, isNull); + }); + + testWidgets( + 'try connection button is enabled after typing password with no stored password', + (tester) async { + tester.view.physicalSize = const Size(800, 1400); + tester.view.devicePixelRatio = 1.0; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + + await tester.pumpWidget( + buildApp( + initialLocation: '/accounts/acc-1/edit', + overrides: baseOverrides( + accounts: [kTestAccount], + hasStoredPassword: false, + ), + ), + ); await tester.pumpAndSettle(); - // App must not crash; password field shows a validation error. - expect(find.text('Required'), findsOneWidget); + await tester.enterText( + find.byKey(const Key('editPasswordField')), + 'mypassword', + ); + await tester.pump(); + + final button = tester.widget( + find.byKey(const Key('editTryConnectionButton')), + ); + expect(button.onPressed, isNotNull); }); testWidgets('connection error shows error message', (tester) async {