|
11 | 11 | */ |
12 | 12 |
|
13 | 13 | jest.mock('@react-aria/live-announcer'); |
14 | | -import {act, pointerMap, render, setupIntersectionObserverMock, within} from '@react-spectrum/test-utils-internal'; |
| 14 | +import {act, fireEvent, pointerMap, render, setupIntersectionObserverMock, within} from '@react-spectrum/test-utils-internal'; |
15 | 15 | import {announce} from '@react-aria/live-announcer'; |
16 | | -import {ComboBox, ComboBoxItem, Content, ContextualHelp, Heading, Text} from '../src'; |
| 16 | +import {Button, ComboBox, ComboBoxItem, Content, ContextualHelp, Dialog, DialogTrigger, Heading, Text} from '../src'; |
17 | 17 | import React from 'react'; |
18 | 18 | import {User} from '@react-aria/test-utils'; |
19 | 19 | import userEvent from '@testing-library/user-event'; |
@@ -213,4 +213,55 @@ describe('Combobox', () => { |
213 | 213 | expect(tree.getAllByText('Contents')[1]).toBeVisible(); |
214 | 214 | warn.mockRestore(); |
215 | 215 | }); |
| 216 | + |
| 217 | + it('should close the combobox when clicking outside the combobox on a dialog backdrop', async () => { |
| 218 | + let tree = render( |
| 219 | + <DialogTrigger> |
| 220 | + <Button>Open</Button> |
| 221 | + <Dialog isDismissible> |
| 222 | + <Heading>Combo Box in a Dialog</Heading> |
| 223 | + <Content> |
| 224 | + <ComboBox label="test"> |
| 225 | + <ComboBoxItem>Aardvark</ComboBoxItem> |
| 226 | + <ComboBoxItem>Cat</ComboBoxItem> |
| 227 | + <ComboBoxItem>Dog</ComboBoxItem> |
| 228 | + <ComboBoxItem>Kangaroo</ComboBoxItem> |
| 229 | + <ComboBoxItem>Panda</ComboBoxItem> |
| 230 | + <ComboBoxItem>Snake</ComboBoxItem> |
| 231 | + </ComboBox> |
| 232 | + </Content> |
| 233 | + </Dialog> |
| 234 | + </DialogTrigger> |
| 235 | + ); |
| 236 | + |
| 237 | + let dialogTester = testUtilUser.createTester('Dialog', {root: tree.container, interactionType: 'mouse'}); |
| 238 | + await dialogTester.open(); |
| 239 | + expect(dialogTester.dialog).toBeVisible(); |
| 240 | + act(() => { |
| 241 | + jest.runAllTimers(); |
| 242 | + }); |
| 243 | + let comboboxTester = testUtilUser.createTester('ComboBox', {root: dialogTester.dialog!, interactionType: 'mouse'}); |
| 244 | + await comboboxTester.open(); |
| 245 | + |
| 246 | + expect(comboboxTester.listbox).toBeVisible(); |
| 247 | + act(() => { |
| 248 | + jest.runAllTimers(); |
| 249 | + }); |
| 250 | + let backdrop = document.querySelector('[style*="--visual-viewport-height"]'); |
| 251 | + // can't use userEvent here for some reason |
| 252 | + fireEvent.mouseDown(backdrop!, {button: 0}); |
| 253 | + fireEvent.mouseUp(backdrop!, {button: 0}); |
| 254 | + act(() => { |
| 255 | + jest.runAllTimers(); |
| 256 | + }); |
| 257 | + expect(comboboxTester.listbox).toBeNull(); |
| 258 | + |
| 259 | + |
| 260 | + fireEvent.mouseDown(backdrop!, {button: 0}); |
| 261 | + fireEvent.mouseUp(backdrop!, {button: 0}); |
| 262 | + act(() => { |
| 263 | + jest.runAllTimers(); |
| 264 | + }); |
| 265 | + expect(dialogTester.dialog).toBeNull(); |
| 266 | + }); |
216 | 267 | }); |
0 commit comments