1
1
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
import React from 'react' ;
4
- import { act , fireEvent , render } from '@testing-library/react' ;
4
+ import { act , fireEvent , render , waitFor } from '@testing-library/react' ;
5
5
6
6
import { KeyCode } from '@cloudscape-design/test-utils-core/utils.js' ;
7
7
@@ -32,9 +32,11 @@ jest.mock('@cloudscape-design/component-toolkit', () => ({
32
32
} ) ) ;
33
33
34
34
describeEachAppLayout ( ( { size, theme } ) => {
35
- test ( `should not render drawer when it is not defined` , ( ) => {
35
+ test ( `should not render drawer when it is not defined` , async ( ) => {
36
36
const { wrapper, rerender } = renderComponent ( < AppLayout toolsHide = { true } drawers = { [ testDrawer ] } /> ) ;
37
- expect ( wrapper . findDrawersTriggers ( ) ) . toHaveLength ( 1 ) ;
37
+ await waitFor ( ( ) => {
38
+ expect ( wrapper . findDrawersTriggers ( ) ) . toHaveLength ( 1 ) ;
39
+ } ) ;
38
40
rerender ( < AppLayout /> ) ;
39
41
40
42
expect ( wrapper . findDrawersTriggers ( ) ) . toHaveLength ( 0 ) ;
@@ -48,67 +50,77 @@ describeEachAppLayout(({ size, theme }) => {
48
50
expect ( wrapper . findToolsToggle ( ) ) . toBeFalsy ( ) ;
49
51
} ) ;
50
52
51
- test ( 'ignores tools when drawers API is used' , ( ) => {
53
+ test ( 'ignores tools when drawers API is used' , async ( ) => {
52
54
const { wrapper } = renderComponent ( < AppLayout tools = "Test" drawers = { [ testDrawer ] } /> ) ;
53
55
54
- expect ( wrapper . findToolsToggle ( ) ) . toBeFalsy ( ) ;
56
+ await waitFor ( ( ) => {
57
+ expect ( wrapper . findToolsToggle ( ) ) . toBeFalsy ( ) ;
58
+ } ) ;
55
59
expect ( wrapper . findDrawersTriggers ( ) ) . toHaveLength ( 1 ) ;
56
60
} ) ;
57
61
58
- test ( 'should open active drawer on click of overflow item' , ( ) => {
62
+ test ( 'should open active drawer on click of overflow item' , async ( ) => {
59
63
const { wrapper } = renderComponent ( < AppLayout drawers = { manyDrawers } /> ) ;
60
- const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
61
64
62
- expect ( wrapper . findActiveDrawer ( ) ) . toBeFalsy ( ) ;
63
- buttonDropdown ! . openDropdown ( ) ;
64
- buttonDropdown ! . findItemById ( '5' ) ! . click ( ) ;
65
- expect ( wrapper . findActiveDrawer ( ) ) . toBeTruthy ( ) ;
65
+ await waitFor ( ( ) => {
66
+ const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
67
+ expect ( wrapper . findActiveDrawer ( ) ) . toBeFalsy ( ) ;
68
+ buttonDropdown ! . openDropdown ( ) ;
69
+ buttonDropdown ! . findItemById ( '5' ) ! . click ( ) ;
70
+ expect ( wrapper . findActiveDrawer ( ) ) . toBeTruthy ( ) ;
71
+ } ) ;
66
72
} ) ;
67
73
68
- test ( 'renders correct aria-label on overflow menu' , ( ) => {
74
+ test ( 'renders correct aria-label on overflow menu' , async ( ) => {
69
75
const ariaLabels : AppLayoutProps . Labels = {
70
76
drawersOverflow : 'Overflow drawers' ,
71
77
drawersOverflowWithBadge : 'Overflow drawers (Unread notifications)' ,
72
78
} ;
73
79
const { wrapper, rerender } = renderComponent ( < AppLayout drawers = { manyDrawers } ariaLabels = { ariaLabels } /> ) ;
74
- const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
75
80
76
- expect ( buttonDropdown ! . findNativeButton ( ) . getElement ( ) ) . toHaveAttribute ( 'aria-label' , 'Overflow drawers' ) ;
81
+ await waitFor ( ( ) => {
82
+ const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
83
+ expect ( buttonDropdown ! . findNativeButton ( ) . getElement ( ) ) . toHaveAttribute ( 'aria-label' , 'Overflow drawers' ) ;
84
+ } ) ;
77
85
86
+ const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
78
87
rerender ( < AppLayout drawers = { manyDrawersWithBadges } ariaLabels = { ariaLabels } /> ) ;
79
88
expect ( buttonDropdown ! . findNativeButton ( ) . getElement ( ) ) . toHaveAttribute (
80
89
'aria-label' ,
81
90
'Overflow drawers (Unread notifications)'
82
91
) ;
83
92
} ) ;
84
93
85
- test ( 'overflow menu item have aria-role set to `menuitem`' , ( ) => {
94
+ test ( 'overflow menu item have aria-role set to `menuitem`' , async ( ) => {
86
95
const { wrapper } = renderComponent ( < AppLayout drawers = { manyDrawers } /> ) ;
87
- const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
88
-
89
- buttonDropdown ! . openDropdown ( ) ;
90
96
91
- const countItems = buttonDropdown ! . findItems ( ) ;
92
- const countRoleMenuItemRole = buttonDropdown !
93
- . findOpenDropdown ( ) !
94
- . find ( '[role="menu"]' ) !
95
- . findAll ( '[role="menuitem"]' ) ;
97
+ await waitFor ( ( ) => {
98
+ const buttonDropdown = wrapper . findDrawersOverflowTrigger ( ) ;
99
+ buttonDropdown ! . openDropdown ( ) ;
100
+ const countItems = buttonDropdown ! . findItems ( ) ;
101
+ const countRoleMenuItemRole = buttonDropdown !
102
+ . findOpenDropdown ( ) !
103
+ . find ( '[role="menu"]' ) !
104
+ . findAll ( '[role="menuitem"]' ) ;
96
105
97
- expect ( countItems . length ) . toBe ( countRoleMenuItemRole . length ) ;
106
+ expect ( countItems . length ) . toBe ( countRoleMenuItemRole . length ) ;
107
+ } ) ;
98
108
} ) ;
99
109
100
- test ( 'renders aria-labels' , ( ) => {
110
+ test ( 'renders aria-labels' , async ( ) => {
101
111
const { wrapper } = renderComponent ( < AppLayout drawers = { [ testDrawer ] } /> ) ;
102
- expect ( wrapper . findDrawerTriggerById ( 'security' ) ! . getElement ( ) ) . toHaveAttribute (
103
- 'aria-label' ,
104
- 'Security trigger button'
105
- ) ;
112
+ await waitFor ( ( ) => {
113
+ expect ( wrapper . findDrawerTriggerById ( 'security' ) ! . getElement ( ) ) . toHaveAttribute (
114
+ 'aria-label' ,
115
+ 'Security trigger button'
116
+ ) ;
117
+ } ) ;
106
118
wrapper . findDrawerTriggerById ( 'security' ) ! . click ( ) ;
107
119
expect ( findActiveDrawerLandmark ( wrapper ) ! . getElement ( ) ) . toHaveAttribute ( 'aria-label' , 'Security drawer content' ) ;
108
120
expect ( wrapper . findActiveDrawerCloseButton ( ) ! . getElement ( ) ) . toHaveAttribute ( 'aria-label' , 'Security close button' ) ;
109
121
} ) ;
110
122
111
- test ( 'renders resize only on resizable drawer' , ( ) => {
123
+ test ( 'renders resize only on resizable drawer' , async ( ) => {
112
124
const { wrapper } = renderComponent (
113
125
< AppLayout
114
126
drawers = { [
@@ -122,7 +134,9 @@ describeEachAppLayout(({ size, theme }) => {
122
134
/>
123
135
) ;
124
136
125
- wrapper . findDrawerTriggerById ( 'security' ) ! . click ( ) ;
137
+ await waitFor ( ( ) => {
138
+ wrapper . findDrawerTriggerById ( 'security' ) ! . click ( ) ;
139
+ } ) ;
126
140
expect ( wrapper . findActiveDrawerResizeHandle ( ) ) . toBeFalsy ( ) ;
127
141
128
142
wrapper . findDrawerTriggerById ( 'security-resizable' ) ! . click ( ) ;
@@ -137,7 +151,7 @@ describeEachAppLayout(({ size, theme }) => {
137
151
}
138
152
} ) ;
139
153
140
- test ( 'focuses drawer close button' , ( ) => {
154
+ test ( 'focuses drawer close button' , async ( ) => {
141
155
let ref : AppLayoutProps . Ref | null = null ;
142
156
const { wrapper } = renderComponent (
143
157
< AppLayout
@@ -147,7 +161,9 @@ describeEachAppLayout(({ size, theme }) => {
147
161
onDrawerChange = { ( ) => { } }
148
162
/>
149
163
) ;
150
- expect ( wrapper . findActiveDrawer ( ) ) . toBeTruthy ( ) ;
164
+ await waitFor ( ( ) => {
165
+ expect ( wrapper . findActiveDrawer ( ) ) . toBeTruthy ( ) ;
166
+ } ) ;
151
167
act ( ( ) => ref ! . focusActiveDrawer ( ) ) ;
152
168
expect ( wrapper . findActiveDrawerCloseButton ( ) ! . getElement ( ) ) . toHaveFocus ( ) ;
153
169
} ) ;
@@ -178,23 +194,31 @@ describeEachAppLayout(({ size, theme }) => {
178
194
expect ( wrapper . findActiveDrawerCloseButton ( ) ! . getElement ( ) ) . toHaveFocus ( ) ;
179
195
} ) ;
180
196
181
- test ( 'registers public drawers api' , ( ) => {
197
+ test ( 'registers public drawers api' , async ( ) => {
182
198
const { wrapper } = renderComponent ( < AppLayout drawers = { [ testDrawer ] } /> ) ;
183
- expect ( wrapper . findDrawersTriggers ( ) ) . toHaveLength ( 1 ) ;
199
+ await waitFor ( ( ) => {
200
+ expect ( wrapper . findDrawersTriggers ( ) ) . toHaveLength ( 1 ) ;
201
+ } ) ;
184
202
} ) ;
185
203
186
- testIf ( size !== 'mobile' ) ( 'aria-controls points to an existing drawer id' , ( ) => {
204
+ testIf ( size !== 'mobile' ) ( 'aria-controls points to an existing drawer id' , async ( ) => {
187
205
const { wrapper } = renderComponent ( < AppLayout drawers = { [ testDrawer ] } /> ) ;
188
- const drawerTrigger = wrapper . findDrawerTriggerById ( 'security' ) ! ;
189
- expect ( drawerTrigger ! . getElement ( ) ) . not . toHaveAttribute ( 'aria-controls' ) ;
206
+ await waitFor ( ( ) => {
207
+ const drawerTrigger = wrapper . findDrawerTriggerById ( 'security' ) ! ;
208
+ expect ( drawerTrigger ! . getElement ( ) ) . not . toHaveAttribute ( 'aria-controls' ) ;
209
+ } ) ;
190
210
211
+ const drawerTrigger = wrapper . findDrawerTriggerById ( 'security' ) ! ;
191
212
drawerTrigger . click ( ) ;
192
213
expect ( drawerTrigger ! . getElement ( ) ) . toHaveAttribute ( 'aria-controls' , 'security' ) ;
193
214
expect ( wrapper . findActiveDrawer ( ) ! . getElement ( ) ) . toHaveAttribute ( 'id' , 'security' ) ;
194
215
} ) ;
195
216
196
- testIf ( size !== 'mobile' && theme !== 'classic' ) ( 'shows trigger button as selected when drawer opened' , ( ) => {
217
+ testIf ( size !== 'mobile' && theme !== 'classic' ) ( 'shows trigger button as selected when drawer opened' , async ( ) => {
197
218
const { wrapper } = renderComponent ( < AppLayout drawers = { [ testDrawer ] } /> ) ;
219
+ await waitFor ( ( ) => {
220
+ expect ( wrapper . findDrawerTriggerById ( 'security' ) ! ) . toBeTruthy ( ) ;
221
+ } ) ;
198
222
const drawerTrigger = wrapper . findDrawerTriggerById ( 'security' ) ! ;
199
223
const selectedClass = theme === 'refresh' ? visualRefreshStyles . selected : toolbarTriggerButtonStyles . selected ;
200
224
expect ( drawerTrigger ! . getElement ( ) ) . not . toHaveClass ( selectedClass ) ;
@@ -207,46 +231,55 @@ describeEachAppLayout(({ size, theme }) => {
207
231
expect ( drawerTrigger ! . getElement ( ) ) . not . toHaveClass ( selectedClass ) ;
208
232
} ) ;
209
233
210
- testIf ( theme === 'refresh-toolbar' ) ( 'tooltip renders correctly on focus, blur, and escape key press events' , ( ) => {
211
- const mockDrawers = [ testDrawer ] ;
212
- const result = render ( < AppLayout drawers = { mockDrawers } /> ) ;
213
- const wrapper = createWrapper ( result . container ) . findAppLayout ( ) ;
214
- expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
215
- expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
234
+ testIf ( theme === 'refresh-toolbar' ) (
235
+ 'tooltip renders correctly on focus, blur, and escape key press events' ,
236
+ async ( ) => {
237
+ const mockDrawers = [ testDrawer ] ;
238
+ const result = render ( < AppLayout drawers = { mockDrawers } /> ) ;
239
+ const wrapper = createWrapper ( result . container ) . findAppLayout ( ) ;
240
+ expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
241
+ expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
216
242
217
- const items = wrapper ! . findDrawersTriggers ( ) ;
218
- expect ( items . length ) . toEqual ( mockDrawers . length ) ;
243
+ await waitFor ( ( ) => {
244
+ expect ( wrapper ! . findDrawersTriggers ( ) ) . toBeTruthy ( ) ;
245
+ } ) ;
246
+ const items = wrapper ! . findDrawersTriggers ( ) ;
247
+ expect ( items . length ) . toEqual ( mockDrawers . length ) ;
219
248
220
- fireEvent . focus ( items ! [ 0 ] . getElement ( ) ) ;
221
- expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeTruthy ( ) ;
222
- expect ( result . getByText ( testDrawer . ariaLabels . drawerName ) ) . toBeTruthy ( ) ;
249
+ fireEvent . focus ( items ! [ 0 ] . getElement ( ) ) ;
250
+ expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeTruthy ( ) ;
251
+ expect ( result . getByText ( testDrawer . ariaLabels . drawerName ) ) . toBeTruthy ( ) ;
223
252
224
- fireEvent . blur ( items ! [ 0 ] . getElement ( ) ) ;
225
- expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
226
- expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
253
+ fireEvent . blur ( items ! [ 0 ] . getElement ( ) ) ;
254
+ expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
255
+ expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
227
256
228
- fireEvent . focus ( items ! [ 0 ] . getElement ( ) ) ;
229
- expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeTruthy ( ) ;
230
- expect ( result . getByText ( testDrawer . ariaLabels . drawerName ) ) . toBeTruthy ( ) ;
257
+ fireEvent . focus ( items ! [ 0 ] . getElement ( ) ) ;
258
+ expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeTruthy ( ) ;
259
+ expect ( result . getByText ( testDrawer . ariaLabels . drawerName ) ) . toBeTruthy ( ) ;
231
260
232
- fireEvent . keyDown ( items ! [ 0 ] . getElement ( ) , {
233
- ...mockEventBubble ,
234
- key : 'Escape' ,
235
- code : KeyCode . escape ,
236
- } ) ;
237
- expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
238
- expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
239
- } ) ;
261
+ fireEvent . keyDown ( items ! [ 0 ] . getElement ( ) , {
262
+ ...mockEventBubble ,
263
+ key : 'Escape' ,
264
+ code : KeyCode . escape ,
265
+ } ) ;
266
+ expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
267
+ expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
268
+ }
269
+ ) ;
240
270
241
271
testIf ( theme === 'refresh-toolbar' ) (
242
272
'tooltip renders correctly on pointer events and is removed on escape key press' ,
243
- ( ) => {
273
+ async ( ) => {
244
274
const mockDrawers = [ testDrawer ] ;
245
275
const result = render ( < AppLayout drawers = { mockDrawers } /> ) ;
246
276
const wrapper = createWrapper ( result . container ) . findAppLayout ( ) ;
247
277
expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
248
278
expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
249
279
280
+ await waitFor ( ( ) => {
281
+ expect ( wrapper ! . findDrawersTriggers ( ) ) . toBeTruthy ( ) ;
282
+ } ) ;
250
283
const items = wrapper ! . findDrawersTriggers ( ) ;
251
284
expect ( items ?. length ) . toEqual ( mockDrawers . length ) ;
252
285
@@ -272,12 +305,15 @@ describeEachAppLayout(({ size, theme }) => {
272
305
}
273
306
) ;
274
307
275
- testIf ( theme === 'refresh-toolbar' ) ( 'tooltip does not render on trigger focus via close button' , ( ) => {
308
+ testIf ( theme === 'refresh-toolbar' ) ( 'tooltip does not render on trigger focus via close button' , async ( ) => {
276
309
const mockDrawers = [ testDrawer ] ;
277
310
const result = render ( < AppLayout drawers = { mockDrawers } /> ) ;
278
311
const wrapper = createWrapper ( result . container ) . findAppLayout ( ) ;
279
312
expect ( wrapper ! . findDrawerTriggerTooltip ( ) ) . toBeNull ( ) ;
280
313
expect ( ( ) => result . getByTestId ( testDrawer . ariaLabels . drawerName ) ) . toThrow ( ) ;
314
+ await waitFor ( ( ) => {
315
+ expect ( wrapper ?. findDrawerTriggerById ( testDrawer . id ) ! . getElement ( ) ) . toBeTruthy ( ) ;
316
+ } ) ;
281
317
wrapper ?. findDrawerTriggerById ( testDrawer . id ) ! . click ( ) ;
282
318
expect ( wrapper ?. findActiveDrawer ( ) ) . toBeTruthy ( ) ;
283
319
wrapper ?. findActiveDrawerCloseButton ( ) ! . click ( ) ;
0 commit comments