@@ -162,7 +162,7 @@ describe('Trigger.Basic', () => {
162162 } ) ;
163163
164164 describe ( 'afterPopupVisibleChange can be triggered' , ( ) => {
165- it ( 'uncontrolled' , ( ) => {
165+ it ( 'uncontrolled' , async ( ) => {
166166 let triggered = 0 ;
167167 const { container } = render (
168168 < Trigger
@@ -178,22 +178,23 @@ describe('Trigger.Basic', () => {
178178 ) ;
179179
180180 trigger ( container , '.target' ) ;
181+
182+ await awaitFakeTimer ( ) ;
183+
181184 expect ( triggered ) . toBe ( 1 ) ;
182185 } ) ;
183186
184- it ( 'controlled' , ( ) => {
185- const demoRef = createRef ( ) ;
187+ it ( 'controlled' , async ( ) => {
186188 let triggered = 0 ;
187189
188- class Demo extends React . Component {
189- state = {
190- visible : false ,
191- } ;
190+ const Demo = ( ) => {
191+ const [ visible , setVisible ] = React . useState ( false ) ;
192192
193- render ( ) {
194- return (
193+ return (
194+ < >
195+ < button onClick = { ( ) => setVisible ( ( v ) => ! v ) } />
195196 < Trigger
196- popupVisible = { this . state . visible }
197+ popupVisible = { visible }
197198 popupAlign = { placementAlignMap . left }
198199 afterPopupVisibleChange = { ( ) => {
199200 triggered += 1 ;
@@ -202,21 +203,18 @@ describe('Trigger.Basic', () => {
202203 >
203204 < div className = "target" > click</ div >
204205 </ Trigger >
205- ) ;
206- }
207- }
206+ </ >
207+ ) ;
208+ } ;
208209
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 ( ) ;
214214 expect ( triggered ) . toBe ( 1 ) ;
215215
216- act ( ( ) => {
217- demoRef . current . setState ( { visible : false } ) ;
218- jest . runAllTimers ( ) ;
219- } ) ;
216+ fireEvent . click ( container . querySelector ( 'button' ) ) ;
217+ await awaitFakeTimer ( ) ;
220218 expect ( triggered ) . toBe ( 2 ) ;
221219 } ) ;
222220 } ) ;
@@ -850,8 +848,10 @@ describe('Trigger.Basic', () => {
850848 expect ( errorSpy ) . not . toHaveBeenCalled ( ) ;
851849 errorSpy . mockRestore ( ) ;
852850 } ) ;
851+
853852 it ( 'should trigger align when popupAlign had updated' , async ( ) => {
854853 const onPopupAlign = jest . fn ( ) ;
854+
855855 const App = ( ) => {
856856 const [ placementAlign , setPlacementAlign ] = React . useState (
857857 placementAlignMap . leftTop ,
@@ -892,16 +892,21 @@ describe('Trigger.Basic', () => {
892892 ) ;
893893 } ;
894894 render ( < App /> ) ;
895+
896+ // CSSMotion will trigger `onPrepare` even when motion not support
897+ // Which means align will trigger twice on `prepare` & `visibleChanged`
895898 await awaitFakeTimer ( ) ;
896- expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 1 ) ;
899+ expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 2 ) ;
897900 fireEvent . click ( document . querySelector ( '#btn' ) ) ;
901+
898902 await awaitFakeTimer ( ) ;
899- expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 2 ) ;
903+ expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 3 ) ;
904+
900905 fireEvent . click ( document . querySelector ( '#close' ) ) ;
901906 await awaitFakeTimer ( ) ;
902907 fireEvent . click ( document . querySelector ( '#btn' ) ) ;
903908 await awaitFakeTimer ( ) ;
904- expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 2 ) ;
909+ expect ( onPopupAlign ) . toHaveBeenCalledTimes ( 3 ) ;
905910 } ) ;
906911
907912 it ( 'popupVisible switch `undefined` and `false` should work' , async ( ) => {
0 commit comments