You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ForgotPasswordForm and ResetPasswordForm have the identical shape that #857 just fixed in SignInForm and SignUpForm: field-specific validation funnelled into a single form-level alert with no id, and no input carrying aria-invalid or aria-describedby.
file
line
what is set
field it is really about
ForgotPasswordForm.tsx
:145
form-level error
email validation
ResetPasswordForm.tsx
:36
setError(passwordValidation.error)
password
ResetPasswordForm.tsx
:41
'Passwords do not match'
confirm-password
They were deliberately left out of #866 rather than silently widening its scope — but they are the same defect, and leaving two of four forms behind is worse than either doing all four or none.
findByRole('alert') resolves to an EMPTY live region on these forms. The assertion then reads Received: <empty> and tells you nothing. Follow the association instead: read aria-describedby, then look up that id.
A value the browser rejects never reaches React.type="email" inputs need something like a@b — accepted by native validation, rejected by validateEmail (which requires a dot in the domain and a 2+ alpha TLD).
Assert that the OTHER fields stay clean. An implementation that marks every input invalid satisfies "the error is associated" and still tells the user nothing. That check is what caught a deliberately mis-routed error in fix(#857): auth errors now say which field they are about #866.
Both *.accessibility.test.tsx files for these forms are likely to contain the same generator stub — a should have proper ARIA attributes case with only example comments and no assertions. Check before adding new files; that is the natural home.
ForgotPasswordFormandResetPasswordFormhave the identical shape that #857 just fixed inSignInFormandSignUpForm: field-specific validation funnelled into a single form-level alert with noid, and no input carryingaria-invalidoraria-describedby.ForgotPasswordForm.tsx:145errorResetPasswordForm.tsx:36setError(passwordValidation.error)ResetPasswordForm.tsx:41'Passwords do not match'They were deliberately left out of #866 rather than silently widening its scope — but they are the same defect, and leaving two of four forms behind is worse than either doing all four or none.
The pattern to copy
#866 established it in both directions:
aria-invalid+aria-describedbypointing at anid'd slot containing arole="alert"spanContactForm.tsx:262-278remains the reference implementation.Testing notes, learned the hard way in #866
findByRole('alert')resolves to an EMPTY live region on these forms. The assertion then readsReceived: <empty>and tells you nothing. Follow the association instead: readaria-describedby, then look up that id.type="email"inputs need something likea@b— accepted by native validation, rejected byvalidateEmail(which requires a dot in the domain and a 2+ alpha TLD).*.accessibility.test.tsxfiles for these forms are likely to contain the same generator stub — ashould have proper ARIA attributescase with only example comments and no assertions. Check before adding new files; that is the natural home.Refs #857, #396