1
1
import { StrictMode , Suspense } from 'react'
2
- import { act , render , screen } from '@testing-library/react'
3
- import userEventOrig from '@testing-library/user-event'
4
- import { expect , it } from 'vitest'
2
+ import { act , fireEvent , render , screen } from '@testing-library/react'
3
+ import { afterEach , beforeEach , expect , it , vi } from 'vitest'
5
4
import { useAtom } from 'jotai/react'
6
5
import { atomWithRefresh } from 'jotai/vanilla/utils'
7
6
8
- const userEvent = {
9
- click : ( element : Element ) => act ( ( ) => userEventOrig . click ( element ) ) ,
10
- }
7
+ beforeEach ( ( ) => {
8
+ vi . useFakeTimers ( )
9
+ } )
10
+
11
+ afterEach ( ( ) => {
12
+ vi . useRealTimers ( )
13
+ } )
11
14
12
- it ( 'sync counter' , async ( ) => {
15
+ it ( 'sync counter' , ( ) => {
13
16
let counter = 0
14
17
const countAtom = atomWithRefresh ( ( ) => ++ counter )
15
18
@@ -29,22 +32,21 @@ it('sync counter', async () => {
29
32
</ StrictMode > ,
30
33
)
31
34
32
- expect ( await screen . findByText ( 'count: 1' ) ) . toBeInTheDocument ( )
35
+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
33
36
34
- await userEvent . click ( screen . getByText ( 'button' ) )
35
- expect ( await screen . findByText ( 'count: 2' ) ) . toBeInTheDocument ( )
37
+ fireEvent . click ( screen . getByText ( 'button' ) )
38
+ expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( )
36
39
37
- await userEvent . click ( screen . getByText ( 'button' ) )
38
- expect ( await screen . findByText ( 'count: 3' ) ) . toBeInTheDocument ( )
40
+ fireEvent . click ( screen . getByText ( 'button' ) )
41
+ expect ( screen . getByText ( 'count: 3' ) ) . toBeInTheDocument ( )
39
42
40
43
expect ( counter ) . toBe ( 3 )
41
44
} )
42
45
43
46
it ( 'async counter' , async ( ) => {
44
- let resolve = ( ) => { }
45
47
let counter = 0
46
48
const countAtom = atomWithRefresh ( async ( ) => {
47
- await new Promise < void > ( ( r ) => ( resolve = r ) )
49
+ await new Promise < void > ( ( resolve ) => setTimeout ( resolve , 100 ) )
48
50
return ++ counter
49
51
} )
50
52
@@ -58,33 +60,34 @@ it('async counter', async () => {
58
60
)
59
61
}
60
62
61
- await act ( async ( ) => {
63
+ await act ( ( ) =>
62
64
render (
63
65
< StrictMode >
64
66
< Suspense fallback = "loading" >
65
67
< Counter />
66
68
</ Suspense >
67
69
</ StrictMode > ,
68
- )
69
- } )
70
+ ) ,
71
+ )
70
72
71
- expect ( await screen . findByText ( 'loading' ) ) . toBeInTheDocument ( )
72
- resolve ( )
73
- expect ( await screen . findByText ( 'count: 1' ) ) . toBeInTheDocument ( )
73
+ expect ( screen . getByText ( 'loading' ) ) . toBeInTheDocument ( )
74
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 100 ) )
75
+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
74
76
75
- await userEvent . click ( screen . getByText ( 'button' ) )
76
- expect ( await screen . findByText ( 'loading' ) ) . toBeInTheDocument ( )
77
- resolve ( )
78
- expect ( await screen . findByText ( 'count: 2' ) ) . toBeInTheDocument ( )
77
+ await act ( ( ) => fireEvent . click ( screen . getByText ( 'button' ) ) )
78
+ expect ( screen . getByText ( 'loading' ) ) . toBeInTheDocument ( )
79
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 100 ) )
80
+ expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( )
79
81
80
- await userEvent . click ( screen . getByText ( 'button' ) )
81
- resolve ( )
82
- expect ( await screen . findByText ( 'count: 3' ) ) . toBeInTheDocument ( )
82
+ await act ( ( ) => fireEvent . click ( screen . getByText ( 'button' ) ) )
83
+ expect ( screen . getByText ( 'loading' ) ) . toBeInTheDocument ( )
84
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 100 ) )
85
+ expect ( screen . getByText ( 'count: 3' ) ) . toBeInTheDocument ( )
83
86
84
87
expect ( counter ) . toBe ( 3 )
85
88
} )
86
89
87
- it ( 'writable counter' , async ( ) => {
90
+ it ( 'writable counter' , ( ) => {
88
91
let counter = 0
89
92
const countAtom = atomWithRefresh (
90
93
( ) => ++ counter ,
@@ -110,17 +113,17 @@ it('writable counter', async () => {
110
113
</ StrictMode > ,
111
114
)
112
115
113
- expect ( await screen . findByText ( 'count: 1' ) ) . toBeInTheDocument ( )
116
+ expect ( screen . getByText ( 'count: 1' ) ) . toBeInTheDocument ( )
114
117
115
- await userEvent . click ( screen . getByText ( 'button' ) )
116
- expect ( await screen . findByText ( 'count: 2' ) ) . toBeInTheDocument ( )
118
+ fireEvent . click ( screen . getByText ( 'button' ) )
119
+ expect ( screen . getByText ( 'count: 2' ) ) . toBeInTheDocument ( )
117
120
118
- await userEvent . click ( screen . getByText ( 'button' ) )
119
- expect ( await screen . findByText ( 'count: 3' ) ) . toBeInTheDocument ( )
121
+ fireEvent . click ( screen . getByText ( 'button' ) )
122
+ expect ( screen . getByText ( 'count: 3' ) ) . toBeInTheDocument ( )
120
123
121
- await userEvent . click ( screen . getByText ( 'set9' ) )
122
- expect ( await screen . findByText ( 'count: 3' ) ) . toBeInTheDocument ( )
124
+ fireEvent . click ( screen . getByText ( 'set9' ) )
125
+ expect ( screen . getByText ( 'count: 3' ) ) . toBeInTheDocument ( )
123
126
124
- await userEvent . click ( screen . getByText ( 'button' ) )
125
- expect ( await screen . findByText ( 'count: 10' ) ) . toBeInTheDocument ( )
127
+ fireEvent . click ( screen . getByText ( 'button' ) )
128
+ expect ( screen . getByText ( 'count: 10' ) ) . toBeInTheDocument ( )
126
129
} )
0 commit comments