|
1 | 1 | // Imports |
2 | 2 | import React from 'react'; |
3 | | -import { act, render, screen } from '@testing-library/react'; |
| 3 | +import { fireEvent, render, screen } from '@testing-library/react'; |
4 | 4 | import userEvent from '@testing-library/user-event'; |
5 | 5 | import TestComponent from './test-component'; |
6 | 6 |
|
@@ -49,21 +49,21 @@ it('Moves the focus to the first menu item after clicking the menu to open it, t |
49 | 49 | expect(screen.getByText('Item 1')).toHaveFocus(); |
50 | 50 | }); |
51 | 51 |
|
52 | | -/* |
53 | 52 | it('Moves the focus to the first menu item after clicking the menu to open it, then pressing arrow down while focused on the menu button', () => { |
54 | 53 | render(<TestComponent />); |
55 | 54 |
|
56 | 55 | userEvent.click(screen.getByText('Primary')); |
57 | 56 |
|
58 | 57 | expect(screen.getByText('Primary')).toHaveFocus(); |
59 | 58 |
|
60 | | - userEvent.type(screen.getByText('Primary'), '{arrowdown}', { |
61 | | - skipClick: true, |
62 | | - }); |
| 59 | + fireEvent(screen.getByText('Primary'), new KeyboardEvent('keydown', { |
| 60 | + key: 'ArrowDown', |
| 61 | + bubbles: true, |
| 62 | + cancelable: true, |
| 63 | + })); |
63 | 64 |
|
64 | 65 | expect(screen.getByText('Item 1')).toHaveFocus(); |
65 | 66 | }); |
66 | | -*/ |
67 | 67 |
|
68 | 68 | it('Sets isOpen to true after pressing enter while focused on the menu button', () => { |
69 | 69 | render(<TestComponent />); |
@@ -106,60 +106,101 @@ it('Sets isOpen to false after clicking a menu item that calls the state change |
106 | 106 | expect(screen.getByTestId('is-open-indicator')).toHaveTextContent('false'); |
107 | 107 | }); |
108 | 108 |
|
109 | | -/* |
110 | 109 | it('Moves the focus to the next element in the menu after pressing the down arrow', () => { |
111 | | - const component = render(<TestComponent />); |
112 | | - const button = component.find('#menu-button'); |
113 | | - const firstMenuItem = component.find('#menu-item-1'); |
114 | | - const secondMenuItem = component.find('#menu-item-2'); |
| 110 | + render(<TestComponent />); |
115 | 111 |
|
116 | | - button.getDOMNode<HTMLButtonElement>().focus(); |
117 | | - button.simulate('keydown', { key: 'Enter' }); |
118 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
119 | | - expect(document.activeElement?.id).toBe('menu-item-2'); |
| 112 | + userEvent.tab(); |
120 | 113 |
|
121 | | - secondMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
122 | | - expect(document.activeElement?.id).toBe('menu-item-3'); |
| 114 | + userEvent.type(screen.getByText('Primary'), '{enter}', { |
| 115 | + skipClick: true, |
| 116 | + }); |
| 117 | + |
| 118 | + expect(screen.getByText('Item 1')).toHaveFocus(); |
| 119 | + |
| 120 | + fireEvent(screen.getByText('Item 1'), new KeyboardEvent('keydown', { |
| 121 | + key: 'ArrowDown', |
| 122 | + bubbles: true, |
| 123 | + cancelable: true, |
| 124 | + })); |
| 125 | + |
| 126 | + expect(screen.getByText('Item 2')).toHaveFocus(); |
123 | 127 | }); |
124 | 128 |
|
125 | 129 | it('Moves the focus to the previous element in the menu after pressing the up arrow', () => { |
126 | | - const component = render(<TestComponent />); |
127 | | - const button = component.find('#menu-button'); |
128 | | - const firstMenuItem = component.find('#menu-item-1'); |
129 | | - const secondMenuItem = component.find('#menu-item-2'); |
| 130 | + render(<TestComponent />); |
| 131 | + |
| 132 | + userEvent.tab(); |
| 133 | + |
| 134 | + userEvent.type(screen.getByText('Primary'), '{enter}', { |
| 135 | + skipClick: true, |
| 136 | + }); |
| 137 | + |
| 138 | + expect(screen.getByText('Item 1')).toHaveFocus(); |
130 | 139 |
|
131 | | - button.getDOMNode<HTMLButtonElement>().focus(); |
132 | | - button.simulate('keydown', { key: 'Enter' }); |
133 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
| 140 | + fireEvent(screen.getByText('Item 1'), new KeyboardEvent('keydown', { |
| 141 | + key: 'ArrowDown', |
| 142 | + bubbles: true, |
| 143 | + cancelable: true, |
| 144 | + })); |
| 145 | + |
| 146 | + expect(screen.getByText('Item 2')).toHaveFocus(); |
134 | 147 |
|
135 | | - secondMenuItem.simulate('keydown', { key: 'ArrowUp' }); |
136 | | - expect(document.activeElement?.id).toBe('menu-item-1'); |
| 148 | + fireEvent(screen.getByText('Item 2'), new KeyboardEvent('keydown', { |
| 149 | + key: 'ArrowUp', |
| 150 | + bubbles: true, |
| 151 | + cancelable: true, |
| 152 | + })); |
| 153 | + |
| 154 | + expect(screen.getByText('Item 1')).toHaveFocus(); |
137 | 155 | }); |
138 | 156 |
|
139 | 157 | it('Wraps the focus to the last element when pressing the up arrow at the beginning of the menu', () => { |
140 | | - const component = render(<TestComponent />); |
141 | | - const button = component.find('#menu-button'); |
142 | | - const firstMenuItem = component.find('#menu-item-1'); |
| 158 | + render(<TestComponent />); |
143 | 159 |
|
144 | | - button.getDOMNode<HTMLButtonElement>().focus(); |
145 | | - button.simulate('keydown', { key: 'Enter' }); |
146 | | - firstMenuItem.simulate('keydown', { key: 'ArrowUp' }); |
147 | | - expect(document.activeElement?.id).toBe('menu-item-3'); |
| 160 | + userEvent.tab(); |
| 161 | + |
| 162 | + userEvent.type(screen.getByText('Primary'), '{enter}', { |
| 163 | + skipClick: true, |
| 164 | + }); |
| 165 | + |
| 166 | + expect(screen.getByText('Item 1')).toHaveFocus(); |
| 167 | + |
| 168 | + fireEvent(screen.getByText('Item 1'), new KeyboardEvent('keydown', { |
| 169 | + key: 'ArrowUp', |
| 170 | + bubbles: true, |
| 171 | + cancelable: true, |
| 172 | + })); |
| 173 | + |
| 174 | + expect(screen.getByText('Item 3')).toHaveFocus(); |
148 | 175 | }); |
149 | 176 |
|
150 | 177 | it('Wraps the focus to the first element when pressing the down arrow at the end of the menu', () => { |
151 | | - const component = render(<TestComponent />); |
152 | | - const button = component.find('#menu-button'); |
153 | | - const firstMenuItem = component.find('#menu-item-1'); |
| 178 | + render(<TestComponent />); |
154 | 179 |
|
155 | | - button.getDOMNode<HTMLButtonElement>().focus(); |
156 | | - button.simulate('keydown', { key: 'Enter' }); |
157 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
158 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
159 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
160 | | - expect(document.activeElement?.id).toBe('menu-item-1'); |
| 180 | + userEvent.tab(); |
| 181 | + |
| 182 | + userEvent.type(screen.getByText('Primary'), '{enter}', { |
| 183 | + skipClick: true, |
| 184 | + }); |
| 185 | + |
| 186 | + expect(screen.getByText('Item 1')).toHaveFocus(); |
| 187 | + |
| 188 | + fireEvent(screen.getByText('Item 1'), new KeyboardEvent('keydown', { |
| 189 | + key: 'ArrowUp', |
| 190 | + bubbles: true, |
| 191 | + cancelable: true, |
| 192 | + })); |
| 193 | + |
| 194 | + expect(screen.getByText('Item 3')).toHaveFocus(); |
| 195 | + |
| 196 | + fireEvent(screen.getByText('Item 3'), new KeyboardEvent('keydown', { |
| 197 | + key: 'ArrowDown', |
| 198 | + bubbles: true, |
| 199 | + cancelable: true, |
| 200 | + })); |
| 201 | + |
| 202 | + expect(screen.getByText('Item 1')).toHaveFocus(); |
161 | 203 | }); |
162 | | -*/ |
163 | 204 |
|
164 | 205 | it('Sets isOpen to false after pressing escape while focused on a menu item', () => { |
165 | 206 | render(<TestComponent />); |
@@ -234,22 +275,36 @@ it('Adds properties to items added after mount', () => { |
234 | 275 | expect(screen.getByText('Item 4')).toHaveAttribute('role', 'menuitem'); |
235 | 276 | }); |
236 | 277 |
|
237 | | -/* |
238 | 278 | it('Can navigate to a dynamically-added item', () => { |
239 | | - const component = render(<TestComponent />); |
240 | | - const addItemButton = component.find('#add-item'); |
241 | | - const menuButton = component.find('#menu-button'); |
242 | | - const firstMenuItem = component.find('#menu-item-1'); |
243 | | -
|
244 | | - addItemButton.simulate('click'); |
| 279 | + render(<TestComponent />); |
245 | 280 |
|
246 | | - menuButton.getDOMNode<HTMLButtonElement>().focus(); |
247 | | - menuButton.simulate('keydown', { key: 'Enter' }); |
| 281 | + userEvent.click(screen.getByText('Add Item')); |
248 | 282 |
|
249 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
250 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
251 | | - firstMenuItem.simulate('keydown', { key: 'ArrowDown' }); |
| 283 | + userEvent.click(screen.getByText('Primary')); |
252 | 284 |
|
253 | | - expect(document.activeElement?.id).toBe('menu-item-4'); |
| 285 | + fireEvent(screen.getByText('Primary'), new KeyboardEvent('keydown', { |
| 286 | + key: 'ArrowDown', |
| 287 | + bubbles: true, |
| 288 | + cancelable: true, |
| 289 | + })); |
| 290 | + |
| 291 | + fireEvent(screen.getByText('Item 1'), new KeyboardEvent('keydown', { |
| 292 | + key: 'ArrowDown', |
| 293 | + bubbles: true, |
| 294 | + cancelable: true, |
| 295 | + })); |
| 296 | + |
| 297 | + fireEvent(screen.getByText('Item 2'), new KeyboardEvent('keydown', { |
| 298 | + key: 'ArrowDown', |
| 299 | + bubbles: true, |
| 300 | + cancelable: true, |
| 301 | + })); |
| 302 | + |
| 303 | + fireEvent(screen.getByText('Item 3'), new KeyboardEvent('keydown', { |
| 304 | + key: 'ArrowDown', |
| 305 | + bubbles: true, |
| 306 | + cancelable: true, |
| 307 | + })); |
| 308 | + |
| 309 | + expect(screen.getByText('Item 4')).toHaveFocus(); |
254 | 310 | }); |
255 | | -*/ |
|
0 commit comments