@@ -3,14 +3,12 @@ import {waitForElement, wait} from '../'
33import 'jest-dom/extend-expect'
44import { render } from './helpers/test-utils'
55
6- async function skipSomeTime ( delayMs ) {
7- await new Promise ( resolve => setTimeout ( resolve , delayMs ) )
8- }
6+ const skipSomeTime = delayMs =>
7+ new Promise ( resolve => setTimeout ( resolve , delayMs ) )
98
10- async function skipSomeTimeForMutationObserver ( delayMs = 50 ) {
11- // Using `setTimeout` >30ms instead of `wait` here because `mutationobserver-shim` uses `setTimeout` ~30ms.
12- await skipSomeTime ( delayMs , 50 )
13- }
9+ // Using `setTimeout` >30ms instead of `wait` here because `mutationobserver-shim` uses `setTimeout` ~30ms.
10+ const skipSomeTimeForMutationObserver = ( delayMs = 50 ) =>
11+ skipSomeTime ( delayMs , 50 )
1412
1513test ( 'it waits for the callback to return a value and only reacts to DOM mutations' , async ( ) => {
1614 const { container, getByTestId} = render (
@@ -66,10 +64,7 @@ test('it waits for the callback to return a value and only reacts to DOM mutatio
6664 const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
6765 const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
6866
69- const promise = waitForElement ( callback , { container} ) . then (
70- successHandler ,
71- errorHandler ,
72- )
67+ waitForElement ( callback , { container} ) . then ( successHandler , errorHandler )
7368
7469 // One synchronous `callback` call is expected.
7570 expect ( callback ) . toHaveBeenCalledTimes ( 1 )
@@ -96,37 +91,6 @@ test('it waits for the callback to return a value and only reacts to DOM mutatio
9691 expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
9792 expect ( container ) . toMatchSnapshot ( )
9893 expect ( testEl . parentNode ) . toBe ( container )
99-
100- return promise
101- } )
102-
103- test ( 'it waits for the next DOM mutation with default callback' , async ( ) => {
104- const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
105- const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
106-
107- const promise = waitForElement ( ) . then ( successHandler , errorHandler )
108-
109- // Promise callbacks are always asynchronous.
110- expect ( successHandler ) . toHaveBeenCalledTimes ( 0 )
111- expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
112-
113- await skipSomeTimeForMutationObserver ( )
114-
115- // No more expected calls without DOM mutations.
116- expect ( successHandler ) . toHaveBeenCalledTimes ( 0 )
117- expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
118-
119- document . body . appendChild ( document . createElement ( 'div' ) )
120- expect ( document . body ) . toMatchSnapshot ( )
121-
122- await skipSomeTimeForMutationObserver ( )
123-
124- expect ( successHandler ) . toHaveBeenCalledTimes ( 1 )
125- expect ( successHandler ) . toHaveBeenCalledWith ( undefined )
126- expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
127- expect ( document . body ) . toMatchSnapshot ( )
128-
129- return promise
13094} )
13195
13296test ( 'it waits characterData mutation' , async ( ) => {
@@ -138,10 +102,7 @@ test('it waits characterData mutation', async () => {
138102 const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
139103 const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
140104
141- const promise = waitForElement ( callback , { container} ) . then (
142- successHandler ,
143- errorHandler ,
144- )
105+ waitForElement ( callback , { container} ) . then ( successHandler , errorHandler )
145106
146107 // Promise callbacks are always asynchronous.
147108 expect ( successHandler ) . toHaveBeenCalledTimes ( 0 )
@@ -162,8 +123,6 @@ test('it waits characterData mutation', async () => {
162123 expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
163124 expect ( callback ) . toHaveBeenCalledTimes ( 2 )
164125 expect ( container ) . toMatchSnapshot ( )
165-
166- return promise
167126} )
168127
169128test ( 'it waits for the attributes mutation' , async ( ) => {
@@ -175,7 +134,7 @@ test('it waits for the attributes mutation', async () => {
175134 const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
176135 const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
177136
178- const promise = waitForElement ( callback , {
137+ waitForElement ( callback , {
179138 container,
180139 } ) . then ( successHandler , errorHandler )
181140
@@ -196,8 +155,6 @@ test('it waits for the attributes mutation', async () => {
196155 expect ( successHandler ) . toHaveBeenCalledTimes ( 1 )
197156 expect ( successHandler ) . toHaveBeenCalledWith ( 'PASSED' )
198157 expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
199-
200- return promise
201158} )
202159
203160test ( 'it throws if timeout is exceeded' , async ( ) => {
@@ -207,7 +164,7 @@ test('it throws if timeout is exceeded', async () => {
207164 const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
208165 const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
209166
210- const promise = waitForElement ( callback , {
167+ waitForElement ( callback , {
211168 container,
212169 timeout : 70 ,
213170 mutationObserverOptions : { attributes : true } ,
@@ -232,8 +189,6 @@ test('it throws if timeout is exceeded', async () => {
232189 expect ( errorHandler ) . toHaveBeenCalledTimes ( 1 )
233190 expect ( errorHandler . mock . calls [ 0 ] ) . toMatchSnapshot ( )
234191 expect ( container ) . toMatchSnapshot ( )
235-
236- return promise
237192} )
238193
239194test ( 'it throws the same error that the callback has thrown if timeout is exceeded' , async ( ) => {
@@ -243,7 +198,7 @@ test('it throws the same error that the callback has thrown if timeout is exceed
243198 const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
244199 const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
245200
246- const promise = waitForElement ( callback , {
201+ waitForElement ( callback , {
247202 container,
248203 timeout : 70 ,
249204 mutationObserverOptions : { attributes : true } ,
@@ -268,8 +223,6 @@ test('it throws the same error that the callback has thrown if timeout is exceed
268223 expect ( errorHandler ) . toHaveBeenCalledTimes ( 1 )
269224 expect ( errorHandler . mock . calls [ 0 ] ) . toMatchSnapshot ( )
270225 expect ( container ) . toMatchSnapshot ( )
271-
272- return promise
273226} )
274227
275228test ( 'it returns immediately if the callback returns the value before any mutations' , async ( ) => {
@@ -283,7 +236,7 @@ test('it returns immediately if the callback returns the value before any mutati
283236 const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
284237 const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
285238
286- const promise = waitForElement ( callback , {
239+ waitForElement ( callback , {
287240 container,
288241 timeout : 70 ,
289242 mutationObserverOptions : { attributes : true } ,
@@ -309,8 +262,6 @@ test('it returns immediately if the callback returns the value before any mutati
309262 expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
310263
311264 expect ( container ) . toMatchSnapshot ( )
312-
313- return promise
314265} )
315266
316267test ( 'does not get into infinite setTimeout loop after MutationObserver notification' , async ( ) => {
@@ -356,4 +307,47 @@ test('does not get into infinite setTimeout loop after MutationObserver notifica
356307 // Expect no more setTimeout calls
357308 jest . advanceTimersByTime ( 100 )
358309 expect ( setTimeout ) . toHaveBeenCalledTimes ( 3 )
310+ jest . useRealTimers ( )
311+ } )
312+
313+ test ( 'works if a container is not defined' , async ( ) => {
314+ render ( `` )
315+ const el = document . createElement ( 'p' )
316+ document . body . appendChild ( el )
317+ const callback = jest
318+ . fn ( ( ) => el . textContent === 'I changed!' )
319+ . mockName ( 'callback' )
320+ const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
321+ const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
322+
323+ waitForElement ( callback ) . then ( successHandler , errorHandler )
324+
325+ await skipSomeTimeForMutationObserver ( )
326+
327+ expect ( callback ) . toHaveBeenCalledTimes ( 1 )
328+ expect ( successHandler ) . toHaveBeenCalledTimes ( 0 )
329+ expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
330+
331+ el . innerHTML = 'I changed!'
332+ await skipSomeTimeForMutationObserver ( )
333+
334+ expect ( callback ) . toHaveBeenCalledTimes ( 2 )
335+ expect ( successHandler ) . toHaveBeenCalledTimes ( 1 )
336+ expect ( errorHandler ) . toHaveBeenCalledTimes ( 0 )
337+
338+ document . getElementsByTagName ( 'html' ) [ 0 ] . innerHTML = '' // cleans the document
339+ } )
340+
341+ test ( 'throws an error if callback is not a function' , async ( ) => {
342+ const successHandler = jest . fn ( ) . mockName ( 'successHandler' )
343+ const errorHandler = jest . fn ( ) . mockName ( 'errorHandler' )
344+
345+ waitForElement ( ) . then ( successHandler , errorHandler )
346+
347+ await skipSomeTimeForMutationObserver ( )
348+
349+ expect ( errorHandler ) . toHaveBeenLastCalledWith (
350+ 'waitForElement requires a callback as the first parameter' ,
351+ )
352+ expect ( successHandler ) . toHaveBeenCalledTimes ( 0 )
359353} )
0 commit comments