@@ -140,6 +140,106 @@ describe('modules/createDOMProps', () => {
140
140
} ) ;
141
141
} ) ;
142
142
143
+ describe ( 'prop "onClick"' , ( ) => {
144
+ const callsOnClick = ( component , accessibilityRole , disabled = false ) => {
145
+ const onClick = jest . fn ( ) ;
146
+ const event = { stopPropagation : jest . fn ( ) } ;
147
+ const finalProps = createDOMProps ( component , { accessibilityRole, disabled, onClick } ) ;
148
+ finalProps . onClick ( event ) ;
149
+ return onClick . mock . calls . length === 1 ;
150
+ } ;
151
+
152
+ test ( 'is called for various roles' , ( ) => {
153
+ expect ( callsOnClick ( 'div' , 'link' ) ) . toBe ( true ) ;
154
+ expect ( callsOnClick ( 'div' , 'button' ) ) . toBe ( true ) ;
155
+ expect ( callsOnClick ( 'div' , 'textbox' ) ) . toBe ( true ) ;
156
+ expect ( callsOnClick ( 'div' , 'menuitem' ) ) . toBe ( true ) ;
157
+ expect ( callsOnClick ( 'div' , 'bogus' ) ) . toBe ( true ) ;
158
+ expect ( callsOnClick ( 'a' ) ) . toBe ( true ) ;
159
+ expect ( callsOnClick ( 'button' ) ) . toBe ( true ) ;
160
+ expect ( callsOnClick ( 'input' ) ) . toBe ( true ) ;
161
+ expect ( callsOnClick ( 'select' ) ) . toBe ( true ) ;
162
+ expect ( callsOnClick ( 'textarea' ) ) . toBe ( true ) ;
163
+ expect ( callsOnClick ( 'h1' ) ) . toBe ( true ) ;
164
+ } ) ;
165
+
166
+ test ( 'is not called when disabled is true' , ( ) => {
167
+ expect ( callsOnClick ( 'div' , 'link' , true ) ) . toBe ( false ) ;
168
+ expect ( callsOnClick ( 'div' , 'button' , true ) ) . toBe ( false ) ;
169
+ expect ( callsOnClick ( 'div' , 'menuitem' , true ) ) . toBe ( false ) ;
170
+ expect ( callsOnClick ( 'a' , undefined , true ) ) . toBe ( false ) ;
171
+ expect ( callsOnClick ( 'button' , undefined , true ) ) . toBe ( false ) ;
172
+ expect ( callsOnClick ( 'input' , undefined , true ) ) . toBe ( false ) ;
173
+ expect ( callsOnClick ( 'select' , undefined , true ) ) . toBe ( false ) ;
174
+ expect ( callsOnClick ( 'textarea' , undefined , true ) ) . toBe ( false ) ;
175
+
176
+ expect ( callsOnClick ( 'div' , 'textbox' , true ) ) . toBe ( true ) ;
177
+ expect ( callsOnClick ( 'div' , 'bogus' , true ) ) . toBe ( true ) ;
178
+ expect ( callsOnClick ( 'h1' , undefined , true ) ) . toBe ( true ) ;
179
+ } ) ;
180
+ } ) ;
181
+
182
+ describe ( 'prop "onKeyDown"' , ( ) => {
183
+ const callsOnClick = key => ( component , accessibilityRole , disabled = false ) => {
184
+ const onClick = jest . fn ( ) ;
185
+ const onKeyDown = jest . fn ( ) ;
186
+ const event = { key, preventDefault : jest . fn ( ) } ;
187
+ const finalProps = createDOMProps ( component , {
188
+ accessibilityRole,
189
+ disabled,
190
+ onClick,
191
+ onKeyDown
192
+ } ) ;
193
+ finalProps . onKeyDown ( event ) ;
194
+ // The original onKeyDown should always be called
195
+ expect ( onKeyDown ) . toHaveBeenCalled ( ) ;
196
+ return onClick . mock . calls . length === 1 ;
197
+ } ;
198
+
199
+ const respondsToEnter = callsOnClick ( 'Enter' ) ;
200
+ const respondsToSpace = callsOnClick ( ' ' ) ;
201
+
202
+ test ( 'does not emulate "onClick" when disabled' , ( ) => {
203
+ expect ( respondsToEnter ( 'div' , 'link' , true ) ) . toBe ( false ) ;
204
+ expect ( respondsToEnter ( 'div' , 'button' , true ) ) . toBe ( false ) ;
205
+ expect ( respondsToEnter ( 'div' , 'textbox' , true ) ) . toBe ( false ) ;
206
+ expect ( respondsToEnter ( 'div' , 'menuitem' , true ) ) . toBe ( false ) ;
207
+ expect ( respondsToEnter ( 'div' , 'bogus' , true ) ) . toBe ( false ) ;
208
+ } ) ;
209
+
210
+ test ( 'does not emulate "onClick" for native elements' , ( ) => {
211
+ expect ( respondsToEnter ( 'a' ) ) . toBe ( false ) ;
212
+ expect ( respondsToEnter ( 'button' ) ) . toBe ( false ) ;
213
+ expect ( respondsToEnter ( 'input' ) ) . toBe ( false ) ;
214
+ expect ( respondsToEnter ( 'select' ) ) . toBe ( false ) ;
215
+ expect ( respondsToEnter ( 'textarea' ) ) . toBe ( false ) ;
216
+ expect ( respondsToEnter ( 'h1' ) ) . toBe ( false ) ;
217
+ expect ( respondsToEnter ( 'div' , 'link' ) ) . toBe ( false ) ;
218
+
219
+ expect ( respondsToSpace ( 'a' ) ) . toBe ( false ) ;
220
+ expect ( respondsToSpace ( 'button' ) ) . toBe ( false ) ;
221
+ expect ( respondsToSpace ( 'input' ) ) . toBe ( false ) ;
222
+ expect ( respondsToSpace ( 'select' ) ) . toBe ( false ) ;
223
+ expect ( respondsToSpace ( 'textarea' ) ) . toBe ( false ) ;
224
+ expect ( respondsToSpace ( 'h1' ) ) . toBe ( false ) ;
225
+ expect ( respondsToSpace ( 'div' , 'link' ) ) . toBe ( false ) ;
226
+ } ) ;
227
+
228
+ test ( 'emulates "onClick" for "Enter" for certain roles' , ( ) => {
229
+ expect ( respondsToEnter ( 'div' , 'button' ) ) . toBe ( true ) ;
230
+ expect ( respondsToEnter ( 'div' , 'menuitem' ) ) . toBe ( true ) ;
231
+ expect ( respondsToEnter ( 'div' , 'textbox' ) ) . toBe ( false ) ;
232
+ expect ( respondsToEnter ( 'div' , 'bogus' ) ) . toBe ( false ) ;
233
+ } ) ;
234
+
235
+ test ( 'emulates "onClick" for "Space" for certain roles' , ( ) => {
236
+ expect ( respondsToSpace ( 'div' , 'button' ) ) . toBe ( true ) ;
237
+ expect ( respondsToSpace ( 'div' , 'menuitem' ) ) . toBe ( true ) ;
238
+ expect ( respondsToSpace ( 'div' , 'textbox' ) ) . toBe ( false ) ;
239
+ expect ( respondsToSpace ( 'div' , 'bogus' ) ) . toBe ( false ) ;
240
+ } ) ;
241
+ } ) ;
242
+
143
243
test ( 'prop "accessibilityLabel" becomes "aria-label"' , ( ) => {
144
244
const accessibilityLabel = 'accessibilityLabel' ;
145
245
const props = createProps ( { accessibilityLabel } ) ;
0 commit comments