1
1
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
2
2
import { EventEmitter } from 'node:events'
3
3
import { describe , test , expect } from '@jest/globals'
4
- import { createRenderStream } from '@testing-library/react-render-stream'
4
+ import {
5
+ createRenderStream ,
6
+ renderHookToSnapshotStream ,
7
+ } from '@testing-library/react-render-stream'
5
8
import * as React from 'react'
6
9
import {
7
10
RenderStreamMatchers ,
8
11
toRenderExactlyTimes ,
9
12
toRerender ,
10
13
} from '../renderStreamMatchers.js'
11
14
import { getExpectErrorMessage } from '../../__testHelpers__/getCleanedErrorMessage.js'
15
+ import { withDisabledActWarnings } from '../../__testHelpers__/withDisabledActWarnings.js'
12
16
13
17
expect . extend ( {
14
18
toRerender,
@@ -25,21 +29,20 @@ const testEvents = new EventEmitter<{
25
29
rerender : [ ]
26
30
} > ( )
27
31
28
- function RerenderingComponent ( ) {
32
+ function useRerender ( ) {
29
33
const [ , rerender ] = React . useReducer ( c => c + 1 , 0 )
30
34
React . useEffect ( ( ) => {
31
- function cb ( ) {
32
- const anyThis = globalThis as any as { IS_REACT_ACT_ENVIRONMENT ?: boolean }
33
- const prev = anyThis . IS_REACT_ACT_ENVIRONMENT
34
- anyThis . IS_REACT_ACT_ENVIRONMENT = false
35
- rerender ( )
36
- anyThis . IS_REACT_ACT_ENVIRONMENT = prev
37
- }
35
+ const cb = ( ) => void withDisabledActWarnings ( rerender )
36
+
38
37
testEvents . addListener ( 'rerender' , cb )
39
38
return ( ) => {
40
39
testEvents . removeListener ( 'rerender' , cb )
41
40
}
42
41
} , [ ] )
42
+ }
43
+
44
+ function RerenderingComponent ( ) {
45
+ useRerender ( )
43
46
return null
44
47
}
45
48
@@ -58,6 +61,46 @@ describe('toRerender', () => {
58
61
await expect ( takeRender ) . not . toRerender ( )
59
62
} )
60
63
64
+ test ( 'works with renderStream object' , async ( ) => {
65
+ const renderStream = createRenderStream ( { } )
66
+
67
+ renderStream . render ( < RerenderingComponent /> )
68
+ await expect ( renderStream ) . toRerender ( )
69
+ await renderStream . takeRender ( )
70
+
71
+ testEvents . emit ( 'rerender' )
72
+ await expect ( renderStream ) . toRerender ( )
73
+ await renderStream . takeRender ( )
74
+
75
+ await expect ( renderStream ) . not . toRerender ( )
76
+ } )
77
+
78
+ test ( 'works with takeSnapshot function' , async ( ) => {
79
+ const { takeSnapshot} = renderHookToSnapshotStream ( ( ) => useRerender ( ) )
80
+
81
+ await expect ( takeSnapshot ) . toRerender ( )
82
+ await takeSnapshot ( )
83
+
84
+ testEvents . emit ( 'rerender' )
85
+ await expect ( takeSnapshot ) . toRerender ( )
86
+ await takeSnapshot ( )
87
+
88
+ await expect ( takeSnapshot ) . not . toRerender ( )
89
+ } )
90
+
91
+ test ( 'works with snapshotStream' , async ( ) => {
92
+ const snapshotStream = renderHookToSnapshotStream ( ( ) => useRerender ( ) )
93
+
94
+ await expect ( snapshotStream ) . toRerender ( )
95
+ await snapshotStream . takeSnapshot ( )
96
+
97
+ testEvents . emit ( 'rerender' )
98
+ await expect ( snapshotStream ) . toRerender ( )
99
+ await snapshotStream . takeSnapshot ( )
100
+
101
+ await expect ( snapshotStream ) . not . toRerender ( )
102
+ } )
103
+
61
104
test ( "errors when it rerenders, but shouldn't" , async ( ) => {
62
105
const { takeRender, render} = createRenderStream ( { } )
63
106
@@ -102,6 +145,29 @@ describe('toRenderExactlyTimes', () => {
102
145
await expect ( takeRender ) . toRenderExactlyTimes ( 2 )
103
146
} )
104
147
148
+ test ( 'works with renderStream object' , async ( ) => {
149
+ const renderStream = createRenderStream ( { } )
150
+
151
+ renderStream . render ( < RerenderingComponent /> )
152
+ testEvents . emit ( 'rerender' )
153
+
154
+ await expect ( renderStream ) . toRenderExactlyTimes ( 2 )
155
+ } )
156
+
157
+ test ( 'works with takeSnapshot function' , async ( ) => {
158
+ const { takeSnapshot} = renderHookToSnapshotStream ( ( ) => useRerender ( ) )
159
+ testEvents . emit ( 'rerender' )
160
+
161
+ await expect ( takeSnapshot ) . toRenderExactlyTimes ( 2 )
162
+ } )
163
+
164
+ test ( 'works with snapshotStream' , async ( ) => {
165
+ const snapshotStream = renderHookToSnapshotStream ( ( ) => useRerender ( ) )
166
+ testEvents . emit ( 'rerender' )
167
+
168
+ await expect ( snapshotStream ) . toRenderExactlyTimes ( 2 )
169
+ } )
170
+
105
171
test ( 'errors when the count of rerenders is wrong' , async ( ) => {
106
172
const { takeRender, render} = createRenderStream ( { } )
107
173
0 commit comments