Skip to content

Commit 247962a

Browse files
fix(authenticator): date validator (#3766)
* fix: authenticator date validator * chore: formatting * chore: fix comment
1 parent 0c8214a commit 247962a

File tree

4 files changed

+75
-0
lines changed

4 files changed

+75
-0
lines changed

packages/authenticator/amplify_authenticator/lib/src/widgets/form_fields/sign_up_form_field.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,9 @@ class _SignUpDateFieldState extends _SignUpFormFieldState<String>
780780

781781
@override
782782
FormFieldValidator<String> get validator {
783+
if (widget.validatorOverride != null) {
784+
return widget.validatorOverride!;
785+
}
783786
return simpleValidator(
784787
stringResolver.inputs.resolve(
785788
context,

packages/authenticator/amplify_authenticator/test/sign_up_form_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,53 @@ void main() {
7373
},
7474
);
7575

76+
testWidgets(
77+
'displays message when submitted with invalid birth date',
78+
(tester) async {
79+
await tester.pumpWidget(
80+
MockAuthenticatorApp(
81+
initialStep: AuthenticatorStep.signUp,
82+
signUpForm: SignUpForm.custom(
83+
fields: [
84+
SignUpFormField.username(),
85+
SignUpFormField.birthdate(
86+
validator: (value) {
87+
if (value == null || value.isEmpty) return null;
88+
final age = DateTime.now().difference(
89+
DateTime.parse(value),
90+
);
91+
if (age < const Duration(days: 365 * 18)) {
92+
return 'You must be 18 years or older.';
93+
}
94+
return null;
95+
},
96+
),
97+
SignUpFormField.password(),
98+
SignUpFormField.passwordConfirmation(),
99+
],
100+
),
101+
),
102+
);
103+
await tester.pumpAndSettle();
104+
105+
final signUpPage = SignUpPage(tester: tester);
106+
107+
await signUpPage.enterUsername('user123');
108+
await signUpPage.enterBirthDate('01/01/2020');
109+
await signUpPage.enterPassword('Password123');
110+
await signUpPage.enterPasswordConfirmation('Password123');
111+
112+
await signUpPage.submitSignUp();
113+
114+
final usernameFieldError = find.descendant(
115+
of: signUpPage.birthdateField,
116+
matching: find.text('You must be 18 years or older.'),
117+
);
118+
119+
expect(usernameFieldError, findsOneWidget);
120+
},
121+
);
122+
76123
testWidgets(
77124
'displays message when password does not meet requirements',
78125
(tester) async {

packages/authenticator/amplify_authenticator_test/lib/src/mock_authenticator_app.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class MockAuthenticatorApp extends StatefulWidget {
2222
this.darkTheme,
2323
this.initialStep = AuthenticatorStep.signIn,
2424
this.authPlugin,
25+
this.signInForm,
26+
this.signUpForm,
2527
this.child,
2628
});
2729

@@ -30,6 +32,8 @@ class MockAuthenticatorApp extends StatefulWidget {
3032
final ThemeData? darkTheme;
3133
final AuthenticatorStep initialStep;
3234
final AuthPluginInterface? authPlugin;
35+
final SignInForm? signInForm;
36+
final SignUpForm? signUpForm;
3337
final Widget? child;
3438

3539
@override
@@ -102,6 +106,8 @@ class _MockAuthenticatorAppState extends State<MockAuthenticatorApp> {
102106
return Authenticator(
103107
key: authenticatorKey,
104108
authBlocOverride: _authBloc,
109+
signInForm: widget.signInForm,
110+
signUpForm: widget.signUpForm,
105111
child: widget.child ??
106112
MaterialApp(
107113
debugShowCheckedModeBanner: false,

packages/authenticator/amplify_authenticator_test/lib/src/pages/sign_up_page.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ class SignUpPage extends AuthenticatorPage {
2121
Finder get phoneField => find.byKey(keyPhoneNumberSignUpFormField);
2222
Finder get preferredUsernameField =>
2323
find.byKey(keyPreferredUsernameSignUpFormField);
24+
Finder get birthdateField => find.byKey(keyBirthdateSignUpFormField);
25+
Finder get datePickerTextField => find.descendant(
26+
of: find.byType(InputDatePickerFormField),
27+
matching: find.byType(TextFormField),
28+
);
29+
Finder get datePickerOkayButton => find.descendant(
30+
of: find.byType(DatePickerDialog),
31+
matching: find.byType(TextButton).at(1),
32+
);
2433
Finder get signUpButton => find.byKey(keySignUpButton);
2534

2635
Finder get selectEmailButton => find.byKey(keyEmailUsernameToggleButton);
@@ -67,6 +76,16 @@ class SignUpPage extends AuthenticatorPage {
6776
await tester.enterText(preferredUsernameField, username);
6877
}
6978

79+
/// When I type a new "birth date"
80+
Future<void> enterBirthDate(String value) async {
81+
await tester.ensureVisible(birthdateField);
82+
await tester.tap(birthdateField);
83+
await tester.pumpAndSettle();
84+
await tester.enterText(datePickerTextField, value);
85+
await tester.tap(datePickerOkayButton);
86+
await tester.pumpAndSettle();
87+
}
88+
7089
/// When I click the "Create Account" button
7190
Future<void> submitSignUp() async {
7291
await tester.ensureVisible(signUpButton);

0 commit comments

Comments
 (0)