11import * as React from 'react'
2- import { render , waitForElementToBeRemoved , screen } from '../'
2+ import { render , waitForElementToBeRemoved , screen , waitFor } from '../'
33
44const fetchAMessage = ( ) =>
55 new Promise ( resolve => {
@@ -11,27 +11,63 @@ const fetchAMessage = () =>
1111 } , randomTimeout )
1212 } )
1313
14- class ComponentWithLoader extends React . Component {
15- state = { loading : true }
16- async componentDidMount ( ) {
17- const data = await fetchAMessage ( )
18- this . setState ( { data, loading : false } ) // eslint-disable-line
19- }
20- render ( ) {
21- if ( this . state . loading ) {
22- return < div > Loading...</ div >
14+ function ComponentWithLoader ( ) {
15+ const [ state , setState ] = React . useState ( { data : undefined , loading : true } )
16+ React . useEffect ( ( ) => {
17+ let cancelled = false
18+ fetchAMessage ( ) . then ( data => {
19+ if ( ! cancelled ) {
20+ setState ( { data, loading : false } )
21+ }
22+ } )
23+
24+ return ( ) => {
25+ cancelled = true
2326 }
24- return (
25- < div data-testid = "message" >
26- Loaded this message: { this . state . data . returnedMessage } !
27- </ div >
28- )
27+ } , [ ] )
28+
29+ if ( state . loading ) {
30+ return < div > Loading...</ div >
2931 }
32+
33+ return (
34+ < div data-testid = "message" >
35+ Loaded this message: { state . data . returnedMessage } !
36+ </ div >
37+ )
3038}
3139
32- test ( 'it waits for the data to be loaded' , async ( ) => {
33- render ( < ComponentWithLoader /> )
34- const loading = ( ) => screen . getByText ( 'Loading...' )
35- await waitForElementToBeRemoved ( loading )
36- expect ( screen . getByTestId ( 'message' ) ) . toHaveTextContent ( / H e l l o W o r l d / )
40+ describe . each ( [
41+ [ 'real timers' , ( ) => jest . useRealTimers ( ) ] ,
42+ [ 'fake legacy timers' , ( ) => jest . useFakeTimers ( 'legacy' ) ] ,
43+ [ 'fake modern timers' , ( ) => jest . useFakeTimers ( 'modern' ) ] ,
44+ ] ) ( 'it waits for the data to be loaded using %s' , ( label , useTimers ) => {
45+ beforeEach ( ( ) => {
46+ useTimers ( )
47+ } )
48+
49+ afterEach ( ( ) => {
50+ jest . useRealTimers ( )
51+ } )
52+
53+ test ( 'waitForElementToBeRemoved' , async ( ) => {
54+ render ( < ComponentWithLoader /> )
55+ const loading = ( ) => screen . getByText ( 'Loading...' )
56+ await waitForElementToBeRemoved ( loading )
57+ expect ( screen . getByTestId ( 'message' ) ) . toHaveTextContent ( / H e l l o W o r l d / )
58+ } )
59+
60+ test ( 'waitFor' , async ( ) => {
61+ render ( < ComponentWithLoader /> )
62+ const message = ( ) => screen . getByText ( / L o a d e d t h i s m e s s a g e : / )
63+ await waitFor ( message )
64+ expect ( screen . getByTestId ( 'message' ) ) . toHaveTextContent ( / H e l l o W o r l d / )
65+ } )
66+
67+ test ( 'findBy' , async ( ) => {
68+ render ( < ComponentWithLoader /> )
69+ await expect ( screen . findByTestId ( 'message' ) ) . resolves . toHaveTextContent (
70+ / H e l l o W o r l d / ,
71+ )
72+ } )
3773} )
0 commit comments