@@ -85,6 +85,44 @@ test.describe('Mouse Behavior', () => {
85
85
await expect ( secondPopover ) . toBeVisible ( ) ;
86
86
} ) ;
87
87
88
+ test ( `GIVEN a pair of manual popovers
89
+ WHEN clicking the first trigger on the page
90
+ AND clicking the second trigger
91
+ THEN the seconf popover should overlap the first` , async ( { page } ) => {
92
+ const { driver : d } = await setup ( page , 'test-popover-overlap' ) ;
93
+
94
+ const [ firstTrigger , secondTrigger ] = await d . getAllTriggers ( ) ;
95
+ const [ firstPopover , secondPopover ] = await d . getAllPopovers ( ) ;
96
+
97
+ firstTrigger . click ( ) ;
98
+ secondTrigger . click ( ) ;
99
+
100
+ const topPopover = page . locator (
101
+ `[popover]:above(:text("${ await firstPopover . innerText ( ) } "))` ,
102
+ ) ;
103
+
104
+ expect ( await topPopover . innerText ( ) ) . toBe ( await secondPopover . innerText ( ) ) ;
105
+ } ) ;
106
+
107
+ test ( `GIVEN a pair of manual popovers
108
+ WHEN clicking the second trigger on the page
109
+ AND clicking the first trigger
110
+ THEN the first popover should overlap the second` , async ( { page } ) => {
111
+ const { driver : d } = await setup ( page , 'test-popover-overlap' ) ;
112
+
113
+ const [ firstTrigger , secondTrigger ] = await d . getAllTriggers ( ) ;
114
+ const [ firstPopover , secondPopover ] = await d . getAllPopovers ( ) ;
115
+
116
+ firstTrigger . click ( ) ;
117
+ secondTrigger . click ( ) ;
118
+
119
+ const topPopover = page . locator (
120
+ `[popover]:above(:text("${ await secondPopover . innerText ( ) } "))` ,
121
+ ) ;
122
+
123
+ expect ( await topPopover . innerText ( ) ) . toBe ( await firstPopover . innerText ( ) ) ;
124
+ } ) ;
125
+
88
126
test ( `GIVEN a pair of manual opened popovers
89
127
WHEN clicking the first trigger on the page
90
128
AND clicking the second trigger
@@ -110,6 +148,43 @@ test.describe('Mouse Behavior', () => {
110
148
await expect ( secondPopover ) . toBeHidden ( ) ;
111
149
} ) ;
112
150
151
+ test ( `GIVEN a popover with hover enabled
152
+ WHEN hovering over the popover
153
+ THEN the popover should appear above the trigger` , async ( { page } ) => {
154
+ const { driver : d } = await setup ( page , 'hover' ) ;
155
+
156
+ const popover = d . getPopover ( ) ;
157
+ const trigger = d . getTrigger ( ) ;
158
+
159
+ await trigger . hover ( ) ;
160
+
161
+ await expect ( popover ) . toBeVisible ( ) ;
162
+
163
+ const popoverBoundingBox = await popover . boundingBox ( ) ;
164
+ const triggerBoundingBox = await trigger . boundingBox ( ) ;
165
+
166
+ const triggerTopEdge = triggerBoundingBox ?. y ?? Number . MAX_VALUE ;
167
+
168
+ expect ( popoverBoundingBox ?. y ) . toBeLessThan ( triggerTopEdge ) ;
169
+ } ) ;
170
+
171
+ test ( `GIVEN an open popover with hover enabled
172
+ WHEN hovering await from the popover
173
+ THEN the popover should disappear` , async ( { page } ) => {
174
+ const { driver : d } = await setup ( page , 'hover' ) ;
175
+
176
+ const popover = d . getPopover ( ) ;
177
+ const trigger = d . getTrigger ( ) ;
178
+
179
+ await trigger . hover ( ) ;
180
+
181
+ await expect ( popover ) . toBeVisible ( ) ;
182
+
183
+ await page . mouse . move ( 0 , 0 ) ;
184
+
185
+ await expect ( popover ) . toBeHidden ( ) ;
186
+ } ) ;
187
+
113
188
test ( `GIVEN a popover with placement set to right
114
189
WHEN hovering over the popover
115
190
THEN the popover should appear to the right of the trigger` , async ( { page } ) => {
@@ -193,6 +268,45 @@ test.describe('Mouse Behavior', () => {
193
268
yDiff = await calculateYDiff ( ) ;
194
269
expect ( yDiff ) . toBeLessThan ( 0 ) ;
195
270
} ) ;
271
+
272
+ test . describe ( 'Programmatic functionality' , ( ) => {
273
+ test ( `GIVEN a programmatic popover
274
+ WHEN the showPopover function is called
275
+ THEN the popover should be open` , async ( { page } ) => {
276
+ const { driver : d } = await setup ( page , 'test-show' ) ;
277
+ await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
278
+ const programmaticTrigger = page . getByRole ( 'button' , { name : 'show popover' } ) ;
279
+ await programmaticTrigger . click ( ) ;
280
+ await expect ( d . getPopover ( ) ) . toBeVisible ( ) ;
281
+ } ) ;
282
+
283
+ test ( `GIVEN an open programmatic popover
284
+ WHEN the hidePopover function is called
285
+ THEN the popover should be hidden` , async ( { page } ) => {
286
+ const { driver : d } = await setup ( page , 'test-hide' ) ;
287
+ const programmaticTrigger = page . getByRole ( 'button' , { name : 'hide popover' } ) ;
288
+ // initial open
289
+ await d . openPopover ( 'click' ) ;
290
+ await programmaticTrigger . click ( { position : { x : 0 , y : 0 } } ) ;
291
+ await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
292
+ } ) ;
293
+
294
+ test ( `GIVEN a progrmmatic popover
295
+ WHEN focusing on the button and pressing the 'o' key
296
+ THEN the popover should be programmatically opened` , async ( { page } ) => {
297
+ const { driver : d } = await setup ( page , 'programmatic' ) ;
298
+
299
+ await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
300
+
301
+ const programmaticTrigger = page . getByRole ( 'button' ) ;
302
+
303
+ // Using `page` here because driver is scoped to the popover
304
+ await expect ( programmaticTrigger ) . toBeVisible ( ) ;
305
+ await programmaticTrigger . click ( ) ;
306
+
307
+ await expect ( d . getPopover ( ) ) . toBeVisible ( ) ;
308
+ } ) ;
309
+ } ) ;
196
310
} ) ;
197
311
198
312
test . describe ( 'Keyboard Behavior' , ( ) => {
@@ -235,25 +349,6 @@ test.describe('Keyboard Behavior', () => {
235
349
await expect ( d . getTrigger ( ) ) . toBeFocused ( ) ;
236
350
} ) ;
237
351
238
- test ( `GIVEN a popover
239
- WHEN focusing on the button and pressing the 'o' key
240
- THEN the popover should be programmatically opened` , async ( { page } ) => {
241
- const { driver : d } = await setup ( page , 'programmatic' ) ;
242
-
243
- await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
244
-
245
- const programmaticTrigger = page . getByRole ( 'button' , {
246
- name : "Focus me and press the 'o'" ,
247
- } ) ;
248
-
249
- // Using `page` here because driver is scoped to the popover
250
- await expect ( programmaticTrigger ) . toBeVisible ( ) ;
251
- await programmaticTrigger . focus ( ) ;
252
- await programmaticTrigger . press ( 'o' ) ;
253
-
254
- await expect ( d . getPopover ( ) ) . toBeVisible ( ) ;
255
- } ) ;
256
-
257
352
test . describe ( 'auto' , ( ) => {
258
353
test ( `GIVEN a pair of auto popovers
259
354
WHEN one popover is open with the enter key
@@ -345,4 +440,54 @@ test.describe('Keyboard Behavior', () => {
345
440
( triggerBoundingBox ?. width ?? Number . MAX_VALUE ) ,
346
441
) ;
347
442
} ) ;
443
+
444
+ test . describe ( 'Programmatic functionality' , ( ) => {
445
+ test ( `GIVEN a programmatic popover
446
+ WHEN the showPopover function is called
447
+ THEN the popover should be open` , async ( { page } ) => {
448
+ const { driver : d } = await setup ( page , 'test-show' ) ;
449
+ await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
450
+ const programmaticTrigger = page . getByRole ( 'button' , { name : 'show popover' } ) ;
451
+
452
+ await programmaticTrigger . focus ( ) ;
453
+ await programmaticTrigger . press ( 'Enter' ) ;
454
+
455
+ await expect ( d . getPopover ( ) ) . toBeVisible ( ) ;
456
+ } ) ;
457
+
458
+ test ( `GIVEN an open programmatic popover
459
+ WHEN the hidePopover function is called
460
+ THEN the popover should be hidden` , async ( { page } ) => {
461
+ const { driver : d } = await setup ( page , 'test-hide' ) ;
462
+
463
+ // Initial open
464
+ await d . getTrigger ( ) . click ( ) ;
465
+ await expect ( d . getPopover ( ) ) . toBeVisible ( ) ;
466
+
467
+ const programmaticTrigger = page . getByRole ( 'button' , { name : 'hide popover' } ) ;
468
+ await programmaticTrigger . focus ( ) ;
469
+ await programmaticTrigger . press ( 'Enter' ) ;
470
+
471
+ await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
472
+ } ) ;
473
+
474
+ test ( `GIVEN a progrmmatic popover
475
+ WHEN focusing on the button and pressing the 'o' key
476
+ THEN the popover should be programmatically opened` , async ( { page } ) => {
477
+ const { driver : d } = await setup ( page , 'programmatic' ) ;
478
+
479
+ await expect ( d . getPopover ( ) ) . toBeHidden ( ) ;
480
+
481
+ const programmaticTrigger = page . getByRole ( 'button' , {
482
+ name : "Focus me and press the 'o'" ,
483
+ } ) ;
484
+
485
+ // Using `page` here because driver is scoped to the popover
486
+ await expect ( programmaticTrigger ) . toBeVisible ( ) ;
487
+ await programmaticTrigger . focus ( ) ;
488
+ await programmaticTrigger . press ( 'o' ) ;
489
+
490
+ await expect ( d . getPopover ( ) ) . toBeVisible ( ) ;
491
+ } ) ;
492
+ } ) ;
348
493
} ) ;
0 commit comments