@@ -16,6 +16,7 @@ import {Provider} from '@react-spectrum/provider';
16
16
import React from 'react' ;
17
17
import { theme } from '@react-spectrum/theme-default' ;
18
18
import { Tooltip , TooltipTrigger } from '../' ;
19
+ import { triggerPress } from '@react-spectrum/test-utils' ;
19
20
20
21
// Sync with useTooltipTriggerState.ts
21
22
const TOOLTIP_DELAY = 1500 ;
@@ -87,6 +88,8 @@ describe('TooltipTrigger', function () {
87
88
</ TooltipTrigger >
88
89
</ Provider >
89
90
) ;
91
+ fireEvent . mouseDown ( document . body ) ;
92
+ fireEvent . mouseUp ( document . body ) ;
90
93
91
94
let button = getByLabelText ( 'trigger' ) ;
92
95
fireEvent . mouseEnter ( button ) ;
@@ -104,7 +107,7 @@ describe('TooltipTrigger', function () {
104
107
expect ( tooltip ) . not . toBeInTheDocument ( ) ;
105
108
} ) ;
106
109
107
- it ( 'if hovered and focused, will not hide if hover leaves' , ( ) => {
110
+ it ( 'if hovered and focused, will hide if hover leaves' , ( ) => {
108
111
let { getByRole, getByLabelText} = render (
109
112
< Provider theme = { theme } >
110
113
< TooltipTrigger onOpenChange = { onOpenChange } delay = { 0 } >
@@ -133,11 +136,11 @@ describe('TooltipTrigger', function () {
133
136
134
137
// remove hover
135
138
fireEvent . mouseLeave ( button ) ;
136
- expect ( onOpenChange ) . toHaveBeenCalledTimes ( 1 ) ;
139
+ expect ( onOpenChange ) . toHaveBeenCalledTimes ( 2 ) ;
137
140
act ( ( ) => {
138
141
jest . runAllTimers ( ) ;
139
142
} ) ;
140
- expect ( tooltip ) . toBeVisible ( ) ;
143
+ expect ( tooltip ) . not . toBeInTheDocument ( ) ;
141
144
142
145
// remove focus
143
146
act ( ( ) => {
@@ -151,7 +154,7 @@ describe('TooltipTrigger', function () {
151
154
expect ( tooltip ) . not . toBeInTheDocument ( ) ;
152
155
} ) ;
153
156
154
- it ( 'if hovered and focused, will not hide if focus leaves' , ( ) => {
157
+ it ( 'if hovered and focused, will hide if focus leaves' , ( ) => {
155
158
let { getByRole, getByLabelText} = render (
156
159
< Provider theme = { theme } >
157
160
< TooltipTrigger onOpenChange = { onOpenChange } delay = { 0 } >
@@ -182,11 +185,11 @@ describe('TooltipTrigger', function () {
182
185
act ( ( ) => {
183
186
button . blur ( ) ;
184
187
} ) ;
185
- expect ( onOpenChange ) . toHaveBeenCalledTimes ( 1 ) ;
188
+ expect ( onOpenChange ) . toHaveBeenCalledTimes ( 2 ) ;
186
189
act ( ( ) => {
187
190
jest . runAllTimers ( ) ;
188
191
} ) ;
189
- expect ( tooltip ) . toBeVisible ( ) ;
192
+ expect ( tooltip ) . not . toBeInTheDocument ( ) ;
190
193
191
194
// remove hover
192
195
fireEvent . mouseLeave ( button ) ;
@@ -241,6 +244,8 @@ describe('TooltipTrigger', function () {
241
244
< input type = "text" />
242
245
</ Provider >
243
246
) ;
247
+ fireEvent . mouseDown ( document . body ) ;
248
+ fireEvent . mouseUp ( document . body ) ;
244
249
245
250
let button = getByLabelText ( 'trigger' ) ;
246
251
let input = getByRole ( 'textbox' ) ;
@@ -278,16 +283,15 @@ describe('TooltipTrigger', function () {
278
283
</ TooltipTrigger >
279
284
</ Provider >
280
285
) ;
286
+ fireEvent . mouseDown ( document . body ) ;
287
+ fireEvent . mouseUp ( document . body ) ;
281
288
282
289
let button = getByLabelText ( 'trigger' ) ;
283
- act ( ( ) => {
284
- button . focus ( ) ;
285
- } ) ;
290
+ fireEvent . mouseEnter ( button ) ;
286
291
expect ( onOpenChange ) . toHaveBeenCalledWith ( true ) ;
287
292
let tooltip = getByRole ( 'tooltip' ) ;
288
293
expect ( tooltip ) . toBeVisible ( ) ;
289
- fireEvent . mouseDown ( document . activeElement , { button : 0 } ) ;
290
- fireEvent . mouseUp ( document . activeElement , { button : 0 } ) ;
294
+ triggerPress ( button ) ;
291
295
expect ( onOpenChange ) . toHaveBeenCalledWith ( false ) ;
292
296
act ( ( ) => {
293
297
jest . advanceTimersByTime ( CLOSE_TIME ) ;
@@ -303,6 +307,39 @@ describe('TooltipTrigger', function () {
303
307
} ) ;
304
308
} ) ;
305
309
310
+ it ( 'is closed if the trigger is clicked with the keyboard' , ( ) => {
311
+ let { getByRole, getByLabelText} = render (
312
+ < Provider theme = { theme } >
313
+ < TooltipTrigger onOpenChange = { onOpenChange } delay = { 0 } >
314
+ < ActionButton aria-label = "trigger" />
315
+ < Tooltip > Helpful information.</ Tooltip >
316
+ </ TooltipTrigger >
317
+ </ Provider >
318
+ ) ;
319
+
320
+ let button = getByLabelText ( 'trigger' ) ;
321
+ act ( ( ) => {
322
+ button . focus ( ) ;
323
+ } ) ;
324
+ expect ( onOpenChange ) . toHaveBeenCalledWith ( true ) ;
325
+ let tooltip = getByRole ( 'tooltip' ) ;
326
+ expect ( tooltip ) . toBeVisible ( ) ;
327
+ fireEvent . keyDown ( button , { key : 'Enter' } ) ;
328
+ fireEvent . keyUp ( button , { key : 'Enter' } ) ;
329
+ expect ( onOpenChange ) . toHaveBeenCalledWith ( false ) ;
330
+ act ( ( ) => {
331
+ jest . advanceTimersByTime ( CLOSE_TIME ) ;
332
+ } ) ;
333
+ expect ( tooltip ) . not . toBeInTheDocument ( ) ;
334
+ act ( ( ) => {
335
+ button . blur ( ) ;
336
+ } ) ;
337
+ act ( ( ) => {
338
+ jest . runAllTimers ( ) ;
339
+ } ) ;
340
+ expect ( ( ) => getByRole ( 'tooltip' ) ) . toThrow ( ) ;
341
+ } ) ;
342
+
306
343
describe ( 'delay' , ( ) => {
307
344
it ( 'opens immediately for focus' , ( ) => {
308
345
let { getByRole, getByLabelText} = render (
@@ -340,6 +377,8 @@ describe('TooltipTrigger', function () {
340
377
</ TooltipTrigger >
341
378
</ Provider >
342
379
) ;
380
+ fireEvent . mouseDown ( document . body ) ;
381
+ fireEvent . mouseUp ( document . body ) ;
343
382
344
383
let button = getByLabelText ( 'trigger' ) ;
345
384
fireEvent . mouseEnter ( button ) ;
@@ -439,6 +478,8 @@ describe('TooltipTrigger', function () {
439
478
</ TooltipTrigger >
440
479
</ Provider >
441
480
) ;
481
+ fireEvent . mouseDown ( document . body ) ;
482
+ fireEvent . mouseUp ( document . body ) ;
442
483
443
484
let button = getByLabelText ( 'trigger' ) ;
444
485
fireEvent . mouseEnter ( button ) ;
@@ -701,6 +742,7 @@ describe('TooltipTrigger', function () {
701
742
} ) ;
702
743
expect ( getByText ( helpfulText ) ) . toBeVisible ( ) ;
703
744
745
+ fireEvent . mouseMove ( document . body ) ;
704
746
// we've used focus to open one, now we can use hover to try and open a second one
705
747
fireEvent . mouseEnter ( badButton ) ;
706
748
fireEvent . mouseMove ( badButton ) ;
@@ -728,6 +770,7 @@ describe('TooltipTrigger', function () {
728
770
let badButton = getByLabelText ( 'bad-trigger' ) ;
729
771
expect ( getByText ( helpfulText ) ) . toBeVisible ( ) ;
730
772
773
+ fireEvent . mouseMove ( document . body ) ;
731
774
// open a second one through interaction
732
775
fireEvent . mouseEnter ( badButton ) ;
733
776
fireEvent . mouseMove ( badButton ) ;
@@ -786,6 +829,7 @@ describe('TooltipTrigger', function () {
786
829
</ TooltipTrigger >
787
830
</ Provider >
788
831
) ;
832
+ fireEvent . mouseMove ( document . body ) ;
789
833
let button = getByLabelText ( 'trigger' ) ;
790
834
fireEvent . mouseEnter ( button ) ;
791
835
fireEvent . mouseMove ( button ) ;
0 commit comments