1
1
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
import React , { useState } from 'react' ;
4
- import { screen } from '@testing-library/react' ;
4
+ import { screen , waitFor } from '@testing-library/react' ;
5
5
6
6
import AppLayout from '../../../lib/components/app-layout' ;
7
7
import { AppLayoutProps } from '../../../lib/components/app-layout/interfaces' ;
@@ -55,7 +55,7 @@ afterEach(() => {
55
55
} ) ;
56
56
57
57
describeEachAppLayout ( { sizes : [ 'desktop' ] } , ( { theme } ) => {
58
- test ( 'should render split panel in bottom position' , ( ) => {
58
+ test ( 'should render split panel in bottom position' , async ( ) => {
59
59
const { wrapper } = renderComponent (
60
60
< AppLayout
61
61
splitPanel = { defaultSplitPanel }
@@ -65,10 +65,13 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
65
65
onSplitPanelPreferencesChange = { noop }
66
66
/>
67
67
) ;
68
- expect ( wrapper . findSplitPanel ( ) ! . findOpenPanelBottom ( ) ) . not . toBeNull ( ) ;
68
+
69
+ await waitFor ( ( ) => {
70
+ expect ( wrapper . findSplitPanel ( ) ! . findOpenPanelBottom ( ) ) . not . toBeNull ( ) ;
71
+ } ) ;
69
72
} ) ;
70
73
71
- test ( 'should render split panel in side position' , ( ) => {
74
+ test ( 'should render split panel in side position' , async ( ) => {
72
75
isMocked = true ;
73
76
const { wrapper } = renderComponent (
74
77
< AppLayout
@@ -79,20 +82,27 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
79
82
onSplitPanelPreferencesChange = { noop }
80
83
/>
81
84
) ;
82
- expect ( wrapper . findSplitPanel ( ) ! . findOpenPanelSide ( ) ) . not . toBeNull ( ) ;
85
+
86
+ await waitFor ( ( ) => {
87
+ expect ( wrapper . findSplitPanel ( ) ! . findOpenPanelSide ( ) ) . not . toBeNull ( ) ;
88
+ } ) ;
83
89
isMocked = false ;
84
90
} ) ;
85
91
86
92
describe . each ( [ 'bottom' , 'side' ] as const ) ( '%s position' , position => {
87
- test ( 'split panel can open and close' , ( ) => {
93
+ test ( 'split panel can open and close' , async ( ) => {
88
94
const { wrapper } = renderComponent (
89
95
< AppLayout
90
96
splitPanel = { defaultSplitPanel }
91
97
splitPanelPreferences = { { position } }
92
98
onSplitPanelPreferencesChange = { noop }
93
99
/>
94
100
) ;
95
- expect ( wrapper . findSplitPanelOpenButton ( ) ) . not . toBeNull ( ) ;
101
+
102
+ await waitFor ( ( ) => {
103
+ expect ( wrapper . findSplitPanelOpenButton ( ) ) . not . toBeNull ( ) ;
104
+ } ) ;
105
+
96
106
wrapper . findSplitPanelOpenButton ( ) ! . click ( ) ;
97
107
if ( theme === 'classic' || ( theme === 'refresh' && position === 'bottom' ) ) {
98
108
expect ( wrapper . findSplitPanelOpenButton ( ) ) . toBeNull ( ) ;
@@ -103,27 +113,34 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
103
113
expect ( wrapper . findSplitPanelOpenButton ( ) ) . not . toBeNull ( ) ;
104
114
} ) ;
105
115
106
- test ( 'Moves focus to slider when opened' , ( ) => {
116
+ test ( 'Moves focus to slider when opened' , async ( ) => {
107
117
const { wrapper } = renderComponent (
108
118
< AppLayout
109
119
splitPanel = { defaultSplitPanel }
110
120
splitPanelPreferences = { { position } }
111
121
onSplitPanelPreferencesChange = { noop }
112
122
/>
113
123
) ;
114
- wrapper . findSplitPanelOpenButton ( ) ! . click ( ) ;
124
+
125
+ await waitFor ( ( ) => {
126
+ wrapper . findSplitPanelOpenButton ( ) ! . click ( ) ;
127
+ } ) ;
128
+
115
129
expect ( wrapper . findSplitPanel ( ) ! . findSlider ( ) ! . getElement ( ) ) . toHaveFocus ( ) ;
116
130
} ) ;
117
131
118
- test ( 'Moves focus to open button when closed' , ( ) => {
132
+ test ( 'Moves focus to open button when closed' , async ( ) => {
119
133
const { wrapper } = renderComponent (
120
134
< AppLayout
121
135
splitPanel = { defaultSplitPanel }
122
136
splitPanelPreferences = { { position } }
123
137
onSplitPanelPreferencesChange = { noop }
124
138
/>
125
139
) ;
126
- wrapper . findSplitPanelOpenButton ( ) ! . click ( ) ;
140
+
141
+ await waitFor ( ( ) => {
142
+ wrapper . findSplitPanelOpenButton ( ) ! . click ( ) ;
143
+ } ) ;
127
144
wrapper . findSplitPanel ( ) ! . findCloseButton ( ) ! . click ( ) ;
128
145
const button =
129
146
position === 'side'
@@ -132,7 +149,7 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
132
149
expect ( button ! . getElement ( ) ) . toHaveFocus ( ) ;
133
150
} ) ;
134
151
135
- test ( `Moves focus to the slider when focusSplitPanel() is called` , ( ) => {
152
+ test ( `Moves focus to the slider when focusSplitPanel() is called` , async ( ) => {
136
153
const ref : React . MutableRefObject < AppLayoutProps . Ref | null > = React . createRef ( ) ;
137
154
const { wrapper } = renderComponent (
138
155
< AppLayout
@@ -143,8 +160,11 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
143
160
onSplitPanelPreferencesChange = { noop }
144
161
/>
145
162
) ;
146
- ref . current ! . focusSplitPanel ( ) ;
147
- expect ( wrapper . findSplitPanel ( ) ! . findSlider ( ) ! . getElement ( ) ) . toHaveFocus ( ) ;
163
+
164
+ await waitFor ( ( ) => {
165
+ ref . current ! . focusSplitPanel ( ) ;
166
+ expect ( wrapper . findSplitPanel ( ) ! . findSlider ( ) ! . getElement ( ) ) . toHaveFocus ( ) ;
167
+ } ) ;
148
168
} ) ;
149
169
150
170
test ( `Does nothing when focusSplitPanel() is called but split panel is closed` , ( ) => {
@@ -163,14 +183,16 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
163
183
} ) ;
164
184
} ) ;
165
185
166
- test ( 'should not render split panel when it is not defined' , ( ) => {
186
+ test ( 'should not render split panel when it is not defined' , async ( ) => {
167
187
const { wrapper, rerender } = renderComponent ( < AppLayout splitPanel = { defaultSplitPanel } /> ) ;
168
- expect ( wrapper . findSplitPanel ( ) ) . toBeTruthy ( ) ;
188
+ await waitFor ( ( ) => {
189
+ expect ( wrapper . findSplitPanel ( ) ) . toBeTruthy ( ) ;
190
+ } ) ;
169
191
rerender ( < AppLayout /> ) ;
170
192
expect ( wrapper . findSplitPanel ( ) ) . toBeFalsy ( ) ;
171
193
} ) ;
172
194
173
- test ( 'should fire split panel toggle event' , ( ) => {
195
+ test ( 'should fire split panel toggle event' , async ( ) => {
174
196
const onSplitPanelToggle = jest . fn ( ) ;
175
197
const { wrapper } = renderComponent (
176
198
< AppLayout
@@ -180,14 +202,16 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
180
202
onSplitPanelPreferencesChange = { noop }
181
203
/>
182
204
) ;
183
- wrapper . findSplitPanel ( ) ! . findOpenButton ( ) ! . click ( ) ;
205
+ await waitFor ( ( ) => {
206
+ wrapper . findSplitPanel ( ) ! . findOpenButton ( ) ! . click ( ) ;
207
+ } ) ;
184
208
expect ( onSplitPanelToggle ) . toHaveBeenCalledWith ( { open : true } ) ;
185
209
onSplitPanelToggle . mockClear ( ) ;
186
210
wrapper . findSplitPanel ( ) ! . findCloseButton ( ) ! . click ( ) ;
187
211
expect ( onSplitPanelToggle ) . toHaveBeenCalledWith ( { open : false } ) ;
188
212
} ) ;
189
213
190
- test ( 'should change split panel position in uncontrolled mode' , ( ) => {
214
+ test ( 'should change split panel position in uncontrolled mode' , async ( ) => {
191
215
const onPreferencesChange = jest . fn ( ) ;
192
216
const { wrapper } = renderComponent (
193
217
< AppLayout
@@ -197,7 +221,9 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
197
221
onSplitPanelPreferencesChange = { event => onPreferencesChange ( event . detail ) }
198
222
/>
199
223
) ;
200
- expect ( wrapper . findSplitPanel ( ) ! . findOpenPanelBottom ( ) ) . not . toBeNull ( ) ;
224
+ await waitFor ( ( ) => {
225
+ expect ( wrapper . findSplitPanel ( ) ! . findOpenPanelBottom ( ) ) . not . toBeNull ( ) ;
226
+ } ) ;
201
227
wrapper . findSplitPanel ( ) ! . findPreferencesButton ( ) ! . click ( ) ;
202
228
expect ( screen . getByRole ( 'radio' , { name : 'Bottom' } ) ) . toBeChecked ( ) ;
203
229
expect ( screen . getByRole ( 'radio' , { name : 'Side' } ) ) . toBeEnabled ( ) ;
@@ -207,7 +233,7 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
207
233
expect ( onPreferencesChange ) . toHaveBeenCalledWith ( { position : 'side' } ) ;
208
234
} ) ;
209
235
210
- test ( 'should fire split panel resize event' , ( ) => {
236
+ test ( 'should fire split panel resize event' , async ( ) => {
211
237
const onSplitPanelResize = jest . fn ( ) ;
212
238
const { wrapper } = renderComponent (
213
239
< AppLayout
@@ -217,11 +243,13 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
217
243
onSplitPanelResize = { event => onSplitPanelResize ( event . detail ) }
218
244
/>
219
245
) ;
220
- wrapper . findSplitPanel ( ) ! . findSlider ( ) ! . keydown ( KeyCode . pageUp ) ;
246
+ await waitFor ( ( ) => {
247
+ wrapper . findSplitPanel ( ) ! . findSlider ( ) ! . keydown ( KeyCode . pageUp ) ;
248
+ } ) ;
221
249
expect ( onSplitPanelResize ) . toHaveBeenCalled ( ) ;
222
250
} ) ;
223
251
224
- test ( 'should dynamically show and hide split panel based on "splitPanel" prop' , ( ) => {
252
+ test ( 'should dynamically show and hide split panel based on "splitPanel" prop' , async ( ) => {
225
253
const CustomAppLayout = ( ) => {
226
254
const [ splitPanelEnabled , setSplitPanelEnabled ] = useState ( true ) ;
227
255
return (
@@ -237,7 +265,9 @@ describeEachAppLayout({ sizes: ['desktop'] }, ({ theme }) => {
237
265
} ;
238
266
const { wrapper } = renderComponent ( < CustomAppLayout /> ) ;
239
267
240
- expect ( wrapper . findSplitPanelOpenButton ( ) ! . getElement ( ) ) . toBeInTheDocument ( ) ;
268
+ await waitFor ( ( ) => {
269
+ expect ( wrapper . findSplitPanelOpenButton ( ) ! . getElement ( ) ) . toBeInTheDocument ( ) ;
270
+ } ) ;
241
271
242
272
wrapper . find ( '[data-testid="toggle-split-panel"]' ) ! . click ( ) ;
243
273
0 commit comments