@@ -162,7 +162,7 @@ describe('Trigger.Basic', () => {
162
162
} ) ;
163
163
164
164
describe ( 'afterPopupVisibleChange can be triggered' , ( ) => {
165
- it ( 'uncontrolled' , ( ) => {
165
+ it ( 'uncontrolled' , async ( ) => {
166
166
let triggered = 0 ;
167
167
const { container } = render (
168
168
< Trigger
@@ -178,22 +178,23 @@ describe('Trigger.Basic', () => {
178
178
) ;
179
179
180
180
trigger ( container , '.target' ) ;
181
+
182
+ await awaitFakeTimer ( ) ;
183
+
181
184
expect ( triggered ) . toBe ( 1 ) ;
182
185
} ) ;
183
186
184
- it ( 'controlled' , ( ) => {
185
- const demoRef = createRef ( ) ;
187
+ it ( 'controlled' , async ( ) => {
186
188
let triggered = 0 ;
187
189
188
- class Demo extends React . Component {
189
- state = {
190
- visible : false ,
191
- } ;
190
+ const Demo = ( ) => {
191
+ const [ visible , setVisible ] = React . useState ( false ) ;
192
192
193
- render ( ) {
194
- return (
193
+ return (
194
+ < >
195
+ < button onClick = { ( ) => setVisible ( ( v ) => ! v ) } />
195
196
< Trigger
196
- popupVisible = { this . state . visible }
197
+ popupVisible = { visible }
197
198
popupAlign = { placementAlignMap . left }
198
199
afterPopupVisibleChange = { ( ) => {
199
200
triggered += 1 ;
@@ -202,21 +203,18 @@ describe('Trigger.Basic', () => {
202
203
>
203
204
< div className = "target" > click</ div >
204
205
</ Trigger >
205
- ) ;
206
- }
207
- }
206
+ </ >
207
+ ) ;
208
+ } ;
208
209
209
- render ( < Demo ref = { demoRef } /> ) ;
210
- act ( ( ) => {
211
- demoRef . current . setState ( { visible : true } ) ;
212
- jest . runAllTimers ( ) ;
213
- } ) ;
210
+ const { container } = render ( < Demo /> ) ;
211
+
212
+ fireEvent . click ( container . querySelector ( 'button' ) ) ;
213
+ await awaitFakeTimer ( ) ;
214
214
expect ( triggered ) . toBe ( 1 ) ;
215
215
216
- act ( ( ) => {
217
- demoRef . current . setState ( { visible : false } ) ;
218
- jest . runAllTimers ( ) ;
219
- } ) ;
216
+ fireEvent . click ( container . querySelector ( 'button' ) ) ;
217
+ await awaitFakeTimer ( ) ;
220
218
expect ( triggered ) . toBe ( 2 ) ;
221
219
} ) ;
222
220
} ) ;
@@ -850,8 +848,10 @@ describe('Trigger.Basic', () => {
850
848
expect ( errorSpy ) . not . toHaveBeenCalled ( ) ;
851
849
errorSpy . mockRestore ( ) ;
852
850
} ) ;
851
+
853
852
it ( 'should trigger align when popupAlign had updated' , async ( ) => {
854
853
const onPopupAlign = jest . fn ( ) ;
854
+
855
855
const App = ( ) => {
856
856
const [ placementAlign , setPlacementAlign ] = React . useState (
857
857
placementAlignMap . leftTop ,
@@ -892,16 +892,21 @@ describe('Trigger.Basic', () => {
892
892
) ;
893
893
} ;
894
894
render ( < App /> ) ;
895
+
896
+ // CSSMotion will trigger `onPrepare` even when motion not support
897
+ // Which means align will trigger twice on `prepare` & `visibleChanged`
895
898
await awaitFakeTimer ( ) ;
896
- expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 1 ) ;
899
+ expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 2 ) ;
897
900
fireEvent . click ( document . querySelector ( '#btn' ) ) ;
901
+
898
902
await awaitFakeTimer ( ) ;
899
- expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 2 ) ;
903
+ expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 3 ) ;
904
+
900
905
fireEvent . click ( document . querySelector ( '#close' ) ) ;
901
906
await awaitFakeTimer ( ) ;
902
907
fireEvent . click ( document . querySelector ( '#btn' ) ) ;
903
908
await awaitFakeTimer ( ) ;
904
- expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 2 ) ;
909
+ expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 3 ) ;
905
910
} ) ;
906
911
907
912
it ( 'popupVisible switch `undefined` and `false` should work' , async ( ) => {
0 commit comments