11import { StrictMode , useEffect , useRef , useState } from 'react'
2- import { fireEvent , render , screen } from '@testing-library/react'
2+ import { act , fireEvent , render , screen } from '@testing-library/react'
33import { afterEach , beforeEach , expect , it , vi } from 'vitest'
44import { proxy , snapshot , useSnapshot } from 'valtio'
55
@@ -38,14 +38,11 @@ it('simple counter', async () => {
3838 </ StrictMode > ,
3939 )
4040
41- await vi . waitFor ( async ( ) =>
42- expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( ) ,
43- )
41+ expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
4442
4543 fireEvent . click ( screen . getByText ( 'button' ) )
46- await vi . waitFor ( async ( ) =>
47- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( ) ,
48- )
44+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
45+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
4946 unmount ( )
5047} )
5148
@@ -83,22 +80,18 @@ it('no extra re-renders (commits)', async () => {
8380 </ > ,
8481 )
8582
86- await vi . waitFor ( ( ) => {
87- expect ( screen . getByText ( 'count: 0 (1)' ) ) . toBeInTheDocument ( )
88- expect ( screen . getByText ( 'count2: 0 (1)' ) ) . toBeInTheDocument ( )
89- } )
83+ expect ( screen . getByText ( 'count: 0 (1)' ) ) . toBeInTheDocument ( )
84+ expect ( screen . getByText ( 'count2: 0 (1)' ) ) . toBeInTheDocument ( )
9085
9186 fireEvent . click ( screen . getByText ( 'button' ) )
92- await vi . waitFor ( ( ) => {
93- expect ( screen . getByText ( 'count: 1 (2)' ) ) . toBeInTheDocument ( )
94- expect ( screen . getByText ( 'count2: 0 (1)' ) ) . toBeInTheDocument ( )
95- } )
87+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
88+ expect ( screen . getByText ( 'count: 1 (2)' ) ) . toBeInTheDocument ( )
89+ expect ( screen . getByText ( 'count2: 0 (1)' ) ) . toBeInTheDocument ( )
9690
9791 fireEvent . click ( screen . getByText ( 'button2' ) )
98- await vi . waitFor ( ( ) => {
99- expect ( screen . getByText ( 'count: 1 (2)' ) ) . toBeInTheDocument ( )
100- expect ( screen . getByText ( 'count2: 1 (2)' ) ) . toBeInTheDocument ( )
101- } )
92+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
93+ expect ( screen . getByText ( 'count: 1 (2)' ) ) . toBeInTheDocument ( )
94+ expect ( screen . getByText ( 'count2: 1 (2)' ) ) . toBeInTheDocument ( )
10295} )
10396
10497it ( 'no extra re-renders (render func calls in non strict mode)' , async ( ) => {
@@ -135,50 +128,44 @@ it('no extra re-renders (render func calls in non strict mode)', async () => {
135128 </ > ,
136129 )
137130
138- await vi . waitFor ( ( ) => {
139- expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
140- expect ( screen . getByText ( 'count2: 0' ) ) . toBeInTheDocument ( )
141- } )
131+ expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
132+ expect ( screen . getByText ( 'count2: 0' ) ) . toBeInTheDocument ( )
142133 expect ( renderFn ) . toBeCalledTimes ( 1 )
143134 expect ( renderFn ) . lastCalledWith ( 0 )
144135 expect ( renderFn2 ) . toBeCalledTimes ( 1 )
145136 expect ( renderFn2 ) . lastCalledWith ( 0 )
146137
147138 fireEvent . click ( screen . getByText ( 'button' ) )
148- await vi . waitFor ( ( ) => {
149- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
150- expect ( screen . getByText ( 'count2: 0' ) ) . toBeInTheDocument ( )
151- } )
139+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
140+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
141+ expect ( screen . getByText ( 'count2: 0' ) ) . toBeInTheDocument ( )
152142 expect ( renderFn ) . toBeCalledTimes ( 2 )
153143 expect ( renderFn ) . lastCalledWith ( 1 )
154144 expect ( renderFn2 ) . toBeCalledTimes ( 1 )
155145 expect ( renderFn2 ) . lastCalledWith ( 0 )
156146
157147 fireEvent . click ( screen . getByText ( 'button2' ) )
158- await vi . waitFor ( ( ) => {
159- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
160- expect ( screen . getByText ( 'count2: 1' ) ) . toBeInTheDocument ( )
161- } )
148+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
149+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
150+ expect ( screen . getByText ( 'count2: 1' ) ) . toBeInTheDocument ( )
162151 expect ( renderFn ) . toBeCalledTimes ( 2 )
163152 expect ( renderFn ) . lastCalledWith ( 1 )
164153 expect ( renderFn2 ) . toBeCalledTimes ( 2 )
165154 expect ( renderFn2 ) . lastCalledWith ( 1 )
166155
167156 fireEvent . click ( screen . getByText ( 'button2' ) )
168- await vi . waitFor ( ( ) => {
169- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
170- expect ( screen . getByText ( 'count2: 2' ) ) . toBeInTheDocument ( )
171- } )
157+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
158+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
159+ expect ( screen . getByText ( 'count2: 2' ) ) . toBeInTheDocument ( )
172160 expect ( renderFn ) . toBeCalledTimes ( 2 )
173161 expect ( renderFn ) . lastCalledWith ( 1 )
174162 expect ( renderFn2 ) . toBeCalledTimes ( 3 )
175163 expect ( renderFn2 ) . lastCalledWith ( 2 )
176164
177165 fireEvent . click ( screen . getByText ( 'button' ) )
178- await vi . waitFor ( ( ) => {
179- expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( )
180- expect ( screen . getByText ( 'count2: 2' ) ) . toBeInTheDocument ( )
181- } )
166+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
167+ expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( )
168+ expect ( screen . getByText ( 'count2: 2' ) ) . toBeInTheDocument ( )
182169 expect ( renderFn ) . toBeCalledTimes ( 3 )
183170 expect ( renderFn ) . lastCalledWith ( 2 )
184171 expect ( renderFn2 ) . toBeCalledTimes ( 3 )
@@ -204,14 +191,11 @@ it('object in object', async () => {
204191 </ StrictMode > ,
205192 )
206193
207- await vi . waitFor ( ( ) =>
208- expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( ) ,
209- )
194+ expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
210195
211196 fireEvent . click ( screen . getByText ( 'button' ) )
212- await vi . waitFor ( ( ) =>
213- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( ) ,
214- )
197+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
198+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
215199} )
216200
217201it ( 'array in object' , async ( ) => {
@@ -235,14 +219,11 @@ it('array in object', async () => {
235219 </ StrictMode > ,
236220 )
237221
238- await vi . waitFor ( ( ) =>
239- expect ( screen . getByText ( 'counts: 0,1,2' ) ) . toBeInTheDocument ( ) ,
240- )
222+ expect ( screen . getByText ( 'counts: 0,1,2' ) ) . toBeInTheDocument ( )
241223
242224 fireEvent . click ( screen . getByText ( 'button' ) )
243- await vi . waitFor ( ( ) =>
244- expect ( screen . getByText ( 'counts: 0,1,2,3' ) ) . toBeInTheDocument ( ) ,
245- )
225+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
226+ expect ( screen . getByText ( 'counts: 0,1,2,3' ) ) . toBeInTheDocument ( )
246227} )
247228
248229it ( 'array pop and splice' , async ( ) => {
@@ -265,19 +246,15 @@ it('array pop and splice', async () => {
265246 </ StrictMode > ,
266247 )
267248
268- await vi . waitFor ( ( ) =>
269- expect ( screen . getByText ( 'counts: 0,1,2' ) ) . toBeInTheDocument ( ) ,
270- )
249+ expect ( screen . getByText ( 'counts: 0,1,2' ) ) . toBeInTheDocument ( )
271250
272251 fireEvent . click ( screen . getByText ( 'button' ) )
273- await vi . waitFor ( ( ) =>
274- expect ( screen . getByText ( 'counts: 0,1' ) ) . toBeInTheDocument ( ) ,
275- )
252+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
253+ expect ( screen . getByText ( 'counts: 0,1' ) ) . toBeInTheDocument ( )
276254
277255 fireEvent . click ( screen . getByText ( 'button2' ) )
278- await vi . waitFor ( ( ) =>
279- expect ( screen . getByText ( 'counts: 0,10,11,1' ) ) . toBeInTheDocument ( ) ,
280- )
256+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
257+ expect ( screen . getByText ( 'counts: 0,10,11,1' ) ) . toBeInTheDocument ( )
281258} )
282259
283260it ( 'array length after direct assignment' , async ( ) => {
@@ -311,19 +288,15 @@ it('array length after direct assignment', async () => {
311288 </ StrictMode > ,
312289 )
313290
314- await vi . waitFor ( ( ) =>
315- expect ( screen . getByText ( 'counts: 0,1,2' ) ) . toBeInTheDocument ( ) ,
316- )
291+ expect ( screen . getByText ( 'counts: 0,1,2' ) ) . toBeInTheDocument ( )
317292
318293 fireEvent . click ( screen . getByText ( 'increment' ) )
319- await vi . waitFor ( ( ) =>
320- expect ( screen . getByText ( 'counts: 0,1,2,3' ) ) . toBeInTheDocument ( ) ,
321- )
294+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
295+ expect ( screen . getByText ( 'counts: 0,1,2,3' ) ) . toBeInTheDocument ( )
322296
323297 fireEvent . click ( screen . getByText ( 'jump' ) )
324- await vi . waitFor ( ( ) =>
325- expect ( screen . getByText ( 'counts: 0,1,2,3,,,,,,9' ) ) . toBeInTheDocument ( ) ,
326- )
298+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
299+ expect ( screen . getByText ( 'counts: 0,1,2,3,,,,,,9' ) ) . toBeInTheDocument ( )
327300} )
328301
329302it ( 'deleting property' , async ( ) => {
@@ -345,14 +318,11 @@ it('deleting property', async () => {
345318 </ StrictMode > ,
346319 )
347320
348- await vi . waitFor ( ( ) =>
349- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( ) ,
350- )
321+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
351322
352323 fireEvent . click ( screen . getByText ( 'button' ) )
353- await vi . waitFor ( ( ) =>
354- expect ( screen . getByText ( 'count: none' ) ) . toBeInTheDocument ( ) ,
355- )
324+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
325+ expect ( screen . getByText ( 'count: none' ) ) . toBeInTheDocument ( )
356326} )
357327
358328it ( 'circular object' , async ( ) => {
@@ -376,14 +346,11 @@ it('circular object', async () => {
376346 </ StrictMode > ,
377347 )
378348
379- await vi . waitFor ( ( ) => {
380- expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
381- } )
349+ expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
382350
383351 fireEvent . click ( screen . getByText ( 'button' ) )
384- await vi . waitFor ( ( ) => {
385- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
386- } )
352+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
353+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
387354} )
388355
389356it ( 'circular object with non-proxy object (#375)' , async ( ) => {
@@ -402,9 +369,7 @@ it('circular object with non-proxy object (#375)', async () => {
402369 </ StrictMode > ,
403370 )
404371
405- await vi . waitFor ( ( ) =>
406- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( ) ,
407- )
372+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
408373} )
409374
410375it ( 'render from outside' , async ( ) => {
@@ -432,15 +397,12 @@ it('render from outside', async () => {
432397 </ StrictMode > ,
433398 )
434399
435- await vi . waitFor ( ( ) =>
436- expect ( screen . getByText ( 'anotherCount: 0' ) ) . toBeInTheDocument ( ) ,
437- )
400+ expect ( screen . getByText ( 'anotherCount: 0' ) ) . toBeInTheDocument ( )
438401
439402 fireEvent . click ( screen . getByText ( 'button' ) )
440403 fireEvent . click ( screen . getByText ( 'toggle' ) )
441- await vi . waitFor ( ( ) =>
442- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( ) ,
443- )
404+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
405+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
444406} )
445407
446408it ( 'counter with sync option' , async ( ) => {
@@ -464,19 +426,15 @@ it('counter with sync option', async () => {
464426 </ > ,
465427 )
466428
467- await vi . waitFor ( ( ) =>
468- expect ( screen . getByText ( 'count: 0 (1)' ) ) . toBeInTheDocument ( ) ,
469- )
429+ expect ( screen . getByText ( 'count: 0 (1)' ) ) . toBeInTheDocument ( )
470430
471431 fireEvent . click ( screen . getByText ( 'button' ) )
472- await vi . waitFor ( ( ) =>
473- expect ( screen . getByText ( 'count: 1 (2)' ) ) . toBeInTheDocument ( ) ,
474- )
432+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
433+ expect ( screen . getByText ( 'count: 1 (2)' ) ) . toBeInTheDocument ( )
475434
476435 fireEvent . click ( screen . getByText ( 'button' ) )
477- await vi . waitFor ( ( ) =>
478- expect ( screen . getByText ( 'count: 2 (3)' ) ) . toBeInTheDocument ( ) ,
479- )
436+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
437+ expect ( screen . getByText ( 'count: 2 (3)' ) ) . toBeInTheDocument ( )
480438} )
481439
482440it ( 'support undefined property (#439)' , async ( ) => {
@@ -495,9 +453,7 @@ it('support undefined property (#439)', async () => {
495453 </ StrictMode > ,
496454 )
497455
498- await vi . waitFor ( ( ) =>
499- expect ( screen . getByText ( 'has prop: true' ) ) . toBeInTheDocument ( ) ,
500- )
456+ expect ( screen . getByText ( 'has prop: true' ) ) . toBeInTheDocument ( )
501457} )
502458
503459it ( 'sync snapshot between nested components (#460)' , async ( ) => {
@@ -534,20 +490,18 @@ it('sync snapshot between nested components (#460)', async () => {
534490 </ StrictMode > ,
535491 )
536492
537- await vi . waitFor ( ( ) => {
538- expect ( screen . getByText ( 'Parent: value1' ) ) . toBeInTheDocument ( )
539- expect ( screen . getByText ( 'Child: value1' ) ) . toBeInTheDocument ( )
540- } )
493+ expect ( screen . getByText ( 'Parent: value1' ) ) . toBeInTheDocument ( )
494+ expect ( screen . getByText ( 'Child: value1' ) ) . toBeInTheDocument ( )
541495
542496 fireEvent . click ( screen . getByText ( 'button' ) )
543- await vi . waitFor ( ( ) => {
544- expect ( screen . getByText ( 'Parent: value2' ) ) . toBeInTheDocument ( )
545- expect ( screen . getByText ( 'Child: value2' ) ) . toBeInTheDocument ( )
546- } )
497+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
498+ expect ( screen . getByText ( 'Parent: value2' ) ) . toBeInTheDocument ( )
499+ expect ( screen . getByText ( 'Child: value2' ) ) . toBeInTheDocument ( )
547500} )
548501
549502it ( 'respects property enumerability (#726)' , async ( ) => {
550503 const x = proxy ( Object . defineProperty ( { a : 1 } , 'b' , { value : 2 } ) )
504+
551505 expect ( Object . keys ( snapshot ( x ) ) ) . toEqual ( Object . keys ( x ) )
552506} )
553507
@@ -571,20 +525,16 @@ it('stable snapshot object (#985)', async () => {
571525
572526 render ( < TestComponent /> )
573527
574- await vi . waitFor ( ( ) =>
575- expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( ) ,
576- )
528+ expect ( screen . getByText ( 'count: 0' ) ) . toBeInTheDocument ( )
577529 expect ( effectCount ) . toBe ( 1 )
578530
579531 fireEvent . click ( screen . getByText ( 'button' ) )
580- await vi . waitFor ( ( ) =>
581- expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( ) ,
582- )
532+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
533+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
583534 expect ( effectCount ) . toBe ( 1 )
584535
585536 fireEvent . click ( screen . getByText ( 'button' ) )
586- await vi . waitFor ( ( ) =>
587- expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( ) ,
588- )
537+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
538+ expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( )
589539 expect ( effectCount ) . toBe ( 1 )
590540} )
0 commit comments