11import { expect , test , vi } from 'vitest' ;
2- import { axe } from 'vitest-axe' ;
32import { z } from 'zod' ;
43
5- import { render , screen , setupUser } from '@/tests/utils' ;
4+ import {
5+ FAILED_CLICK_TIMEOUT_MS ,
6+ page ,
7+ render ,
8+ setupUser ,
9+ } from '@/tests/utils' ;
610
711import { FormField , FormFieldController , FormFieldLabel } from '..' ;
812import { FormMocked } from '../form-test-utils' ;
@@ -27,36 +31,6 @@ const options = [
2731 } ,
2832] ;
2933
30- test ( 'should have no a11y violations' , async ( ) => {
31- const mockedSubmit = vi . fn ( ) ;
32-
33- HTMLCanvasElement . prototype . getContext = vi . fn ( ) ;
34-
35- const { container } = render (
36- < FormMocked
37- schema = { z . object ( { bear : z . string ( ) } ) }
38- useFormOptions = { { defaultValues : { bear : undefined } } }
39- onSubmit = { mockedSubmit }
40- >
41- { ( { form } ) => (
42- < FormField >
43- < FormFieldLabel > Bearstronaut</ FormFieldLabel >
44- < FormFieldController
45- type = "radio-group"
46- control = { form . control }
47- name = "bear"
48- options = { options }
49- />
50- </ FormField >
51- ) }
52- </ FormMocked >
53- ) ;
54-
55- const results = await axe ( container ) ;
56-
57- expect ( results ) . toHaveNoViolations ( ) ;
58- } ) ;
59-
6034test ( 'should select radio on button click' , async ( ) => {
6135 const user = setupUser ( ) ;
6236 const mockedSubmit = vi . fn ( ) ;
@@ -81,13 +55,13 @@ test('should select radio on button click', async () => {
8155 </ FormMocked >
8256 ) ;
8357
84- const radio = screen . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
85- expect ( radio ) . not . toBeChecked ( ) ;
58+ const radio = page . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
59+ await expect . element ( radio ) . not . toBeChecked ( ) ;
8660
8761 await user . click ( radio ) ;
88- expect ( radio ) . toBeChecked ( ) ;
62+ await expect . element ( radio ) . toBeChecked ( ) ;
8963
90- await user . click ( screen . getByRole ( 'button' , { name : 'Submit' } ) ) ;
64+ await user . click ( page . getByRole ( 'button' , { name : 'Submit' } ) ) ;
9165 expect ( mockedSubmit ) . toHaveBeenCalledWith ( { bear : 'pawdrin' } ) ;
9266} ) ;
9367
@@ -115,16 +89,16 @@ test('should select radio on label click', async () => {
11589 </ FormMocked >
11690 ) ;
11791
118- const radio = screen . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
119- const label = screen . getByText ( 'Buzz Pawdrin' ) ;
92+ const radio = page . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
93+ const label = page . getByText ( 'Buzz Pawdrin' ) ;
12094
121- expect ( radio ) . not . toBeChecked ( ) ;
95+ await expect . element ( radio ) . not . toBeChecked ( ) ;
12296
12397 // Test clicking the label specifically
12498 await user . click ( label ) ;
125- expect ( radio ) . toBeChecked ( ) ;
99+ await expect . element ( radio ) . toBeChecked ( ) ;
126100
127- await user . click ( screen . getByRole ( 'button' , { name : 'Submit' } ) ) ;
101+ await user . click ( page . getByRole ( 'button' , { name : 'Submit' } ) ) ;
128102 expect ( mockedSubmit ) . toHaveBeenCalledWith ( { bear : 'pawdrin' } ) ;
129103} ) ;
130104
@@ -152,26 +126,26 @@ test('should handle keyboard navigation', async () => {
152126 </ FormMocked >
153127 ) ;
154128
155- const firstRadio = screen . getByRole ( 'radio' , { name : 'Bearstrong' } ) ;
156- const secondRadio = screen . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
157- const thirdRadio = screen . getByRole ( 'radio' , { name : 'Yuri Grizzlyrin' } ) ;
129+ const firstRadio = page . getByRole ( 'radio' , { name : 'Bearstrong' } ) ;
130+ const secondRadio = page . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
131+ const thirdRadio = page . getByRole ( 'radio' , { name : 'Yuri Grizzlyrin' } ) ;
158132
159133 await user . tab ( ) ;
160- expect ( firstRadio ) . toHaveFocus ( ) ;
134+ await expect . element ( firstRadio ) . toHaveFocus ( ) ;
161135
162136 await user . keyboard ( '{ArrowDown}' ) ;
163- expect ( secondRadio ) . toHaveFocus ( ) ;
137+ await expect . element ( secondRadio ) . toHaveFocus ( ) ;
164138 await user . keyboard ( ' ' ) ;
165- expect ( secondRadio ) . toBeChecked ( ) ;
139+ await expect . element ( secondRadio ) . toBeChecked ( ) ;
166140
167141 await user . keyboard ( '{ArrowDown}' ) ;
168- expect ( thirdRadio ) . toHaveFocus ( ) ;
142+ await expect . element ( thirdRadio ) . toHaveFocus ( ) ;
169143
170144 await user . keyboard ( '{ArrowUp}' ) ;
171- expect ( secondRadio ) . toHaveFocus ( ) ;
172- expect ( secondRadio ) . toBeChecked ( ) ; // Second radio should still be checked
145+ await expect . element ( secondRadio ) . toHaveFocus ( ) ;
146+ await expect . element ( secondRadio ) . toBeChecked ( ) ; // Second radio should still be checked
173147
174- await user . click ( screen . getByRole ( 'button' , { name : 'Submit' } ) ) ;
148+ await user . click ( page . getByRole ( 'button' , { name : 'Submit' } ) ) ;
175149 expect ( mockedSubmit ) . toHaveBeenCalledWith ( { bear : 'pawdrin' } ) ;
176150} ) ;
177151
@@ -202,10 +176,10 @@ test('default value', async () => {
202176 </ FormMocked >
203177 ) ;
204178
205- const radio = screen . getByRole ( 'radio' , { name : 'Yuri Grizzlyrin' } ) ;
206- expect ( radio ) . toBeChecked ( ) ;
179+ const radio = page . getByRole ( 'radio' , { name : 'Yuri Grizzlyrin' } ) ;
180+ await expect . element ( radio ) . toBeChecked ( ) ;
207181
208- await user . click ( screen . getByRole ( 'button' , { name : 'Submit' } ) ) ;
182+ await user . click ( page . getByRole ( 'button' , { name : 'Submit' } ) ) ;
209183 expect ( mockedSubmit ) . toHaveBeenCalledWith ( { bear : 'grizzlyrin' } ) ;
210184} ) ;
211185
@@ -237,10 +211,10 @@ test('disabled', async () => {
237211 </ FormMocked >
238212 ) ;
239213
240- const radio = screen . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
241- expect ( radio ) . toBeDisabled ( ) ;
214+ const radio = page . getByRole ( 'radio' , { name : 'Buzz Pawdrin' } ) ;
215+ await expect . element ( radio ) . toBeDisabled ( ) ;
242216
243- await user . click ( screen . getByRole ( 'button' , { name : 'Submit' } ) ) ;
217+ await user . click ( page . getByRole ( 'button' , { name : 'Submit' } ) ) ;
244218 expect ( mockedSubmit ) . toHaveBeenCalledWith ( { bear : undefined } ) ;
245219} ) ;
246220
@@ -271,12 +245,16 @@ test('disabled option', async () => {
271245 </ FormMocked >
272246 ) ;
273247
274- const disabledRadio = screen . getByRole ( 'radio' , { name : 'Mae Jemibear' } ) ;
275- expect ( disabledRadio ) . toBeDisabled ( ) ;
248+ const disabledRadio = page . getByRole ( 'radio' , { name : 'Mae Jemibear' } ) ;
249+ await expect . element ( disabledRadio ) . toBeDisabled ( ) ;
276250
277- await user . click ( disabledRadio ) ;
278- expect ( disabledRadio ) . not . toBeChecked ( ) ;
251+ try {
252+ await user . click ( disabledRadio , { timeout : FAILED_CLICK_TIMEOUT_MS } ) ;
253+ } catch {
254+ // Expected to fail since input is disabled
255+ }
256+ await expect . element ( disabledRadio ) . not . toBeChecked ( ) ;
279257
280- await user . click ( screen . getByRole ( 'button' , { name : 'Submit' } ) ) ;
258+ await user . click ( page . getByRole ( 'button' , { name : 'Submit' } ) ) ;
281259 expect ( mockedSubmit ) . toHaveBeenCalledWith ( { bear : '' } ) ;
282260} ) ;
0 commit comments