From 41c90acb14c368392f27f551f5cb1b5a48db099b Mon Sep 17 00:00:00 2001 From: Andrei Lesnitsky Date: Thu, 24 Nov 2022 16:50:52 +0100 Subject: [PATCH] fix(firebase_ui_auth): clear the error on ForgotPasswordScreen after submitting a valid email --- .../lib/src/views/forgot_password_view.dart | 6 +- .../test/firebase_ui_test.dart | 2 + .../test/views/forgot_password_view_test.dart | 81 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 packages/firebase_ui_auth/test/views/forgot_password_view_test.dart diff --git a/packages/firebase_ui_auth/lib/src/views/forgot_password_view.dart b/packages/firebase_ui_auth/lib/src/views/forgot_password_view.dart index 772e2aa382eb..eb1884698e79 100644 --- a/packages/firebase_ui_auth/lib/src/views/forgot_password_view.dart +++ b/packages/firebase_ui_auth/lib/src/views/forgot_password_view.dart @@ -53,7 +53,11 @@ class _ForgotPasswordViewState extends State { FirebaseAuthException? exception; Future _submit(String email) async { - setState(() => isLoading = true); + setState(() { + exception = null; + isLoading = true; + }); + try { await auth.sendPasswordResetEmail( email: email, diff --git a/packages/firebase_ui_auth/test/firebase_ui_test.dart b/packages/firebase_ui_auth/test/firebase_ui_test.dart index 0e72490ef115..7b15828fa392 100644 --- a/packages/firebase_ui_auth/test/firebase_ui_test.dart +++ b/packages/firebase_ui_auth/test/firebase_ui_test.dart @@ -4,6 +4,7 @@ import 'flows/universal_email_sign_in_flow_test.dart' as universal_email_sign_in_flow; import 'flows/phone_auth_flow_test.dart' as phone_auth_flow; import 'widgets/email_form_test.dart' as email_form; +import 'views/forgot_password_view_test.dart' as forgot_password_view; void main() { email_auth_flow.main(); @@ -11,4 +12,5 @@ void main() { universal_email_sign_in_flow.main(); phone_auth_flow.main(); email_form.main(); + forgot_password_view.main(); } diff --git a/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart b/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart new file mode 100644 index 000000000000..8f5ab2dfce76 --- /dev/null +++ b/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart @@ -0,0 +1,81 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_ui_auth/firebase_ui_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; + +import '../test_utils.dart'; + +class MockFirebaseAuth extends Mock implements FirebaseAuth { + @override + Future sendPasswordResetEmail({ + String? email, + ActionCodeSettings? actionCodeSettings, + }) { + return super.noSuchMethod( + Invocation.method( + #sendPasswordResetEmail, + [], + { + #email: email, + #actionCodeSettings: actionCodeSettings, + }, + ), + returnValue: Future.value(), + returnValueForMissingStub: Future.value(), + ); + } +} + +void main() { + group('Forgot password view', () { + late Widget widget; + late MockFirebaseAuth auth; + + setUpAll(() { + auth = MockFirebaseAuth(); + + widget = TestMaterialApp( + child: ForgotPasswordView(auth: auth), + ); + + when(auth.sendPasswordResetEmail(email: 'invalid@email')).thenThrow( + FirebaseAuthException( + message: 'invalid-email', + code: 'invalid-email', + ), + ); + + when(auth.sendPasswordResetEmail(email: 'valid@email.com')).thenAnswer( + (_) => Future.value(), + ); + }); + + testWidgets('shows error if sendPasswordResetEmail failed', (tester) async { + await tester.pumpWidget(widget); + + final input = find.byType(TextField); + await tester.enterText(input, 'invalid@email'); + + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + expect(find.text('invalid-email'), findsOneWidget); + }); + + testWidgets( + "doesn't show ana error on next successful attempt after error", + (tester) async { + await tester.pumpWidget(widget); + + final input = find.byType(TextField); + await tester.enterText(input, 'valid@email.com'); + + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + expect(find.byType(ErrorText), findsNothing); + }, + ); + }); +}