1
- import { RenderHookOptions } from '@testing-library/react'
1
+ import { Queries , RenderHookOptions } from '@testing-library/react'
2
2
import React from 'rehackt'
3
- import { createRenderStream } from './renderStream/createRenderStream.js'
3
+ import {
4
+ createRenderStream ,
5
+ RenderStream ,
6
+ } from './renderStream/createRenderStream.js'
4
7
import { type NextRenderOptions } from './renderStream/createRenderStream.js'
5
8
import { Render } from './renderStream/Render.js'
6
9
import { Assertable , assertableSymbol , markAssertable } from './assertable.js'
10
+ import { SyncQueries } from './renderStream/syncQueries.js'
7
11
8
12
export interface SnapshotStream < Snapshot , Props > extends Assertable {
9
13
/**
@@ -49,7 +53,11 @@ export function renderHookToSnapshotStream<ReturnValue, Props>(
49
53
renderCallback : ( props : Props ) => ReturnValue ,
50
54
{ initialProps, ...renderOptions } : RenderHookOptions < Props > = { } ,
51
55
) : SnapshotStream < ReturnValue , Props > {
52
- const { render, ...stream } = createRenderStream < { value : ReturnValue } , never > ( )
56
+ const {
57
+ render,
58
+ renderAsync : _ ,
59
+ ...stream
60
+ } = createRenderStream < { value : ReturnValue } , never > ( )
53
61
54
62
const HookComponent : React . FC < { arg : Props } > = props => {
55
63
stream . replaceSnapshot ( { value : renderCallback ( props . arg ) } )
@@ -65,6 +73,47 @@ export function renderHookToSnapshotStream<ReturnValue, Props>(
65
73
return baseRerender ( < HookComponent arg = { rerenderCallbackProps } /> )
66
74
}
67
75
76
+ return {
77
+ ...renderStreamToSnapshotStream ( stream ) ,
78
+ rerender,
79
+ unmount,
80
+ }
81
+ }
82
+
83
+ export async function renderHookToAsyncSnapshotStream < ReturnValue , Props > (
84
+ renderCallback : ( props : Props ) => ReturnValue ,
85
+ { initialProps, ...renderOptions } : RenderHookOptions < Props > = { } ,
86
+ ) : Promise < SnapshotStream < ReturnValue , Props > > {
87
+ const {
88
+ renderAsync,
89
+ render : _ ,
90
+ ...stream
91
+ } = createRenderStream < { value : ReturnValue } , never > ( )
92
+
93
+ const HookComponent : React . FC < { arg : Props } > = props => {
94
+ stream . replaceSnapshot ( { value : renderCallback ( props . arg ) } )
95
+ return null
96
+ }
97
+
98
+ const { rerender : baseRerender , unmount} = await renderAsync (
99
+ < HookComponent arg = { initialProps ! } /> ,
100
+ renderOptions ,
101
+ )
102
+
103
+ function rerender ( rerenderCallbackProps : Props ) {
104
+ return baseRerender ( < HookComponent arg = { rerenderCallbackProps } /> )
105
+ }
106
+
107
+ return {
108
+ ...renderStreamToSnapshotStream ( stream ) ,
109
+ rerender,
110
+ unmount,
111
+ }
112
+ }
113
+
114
+ function renderStreamToSnapshotStream < Snapshot > (
115
+ stream : RenderStream < { value : Snapshot } , never > ,
116
+ ) : Omit < SnapshotStream < Snapshot , any > , 'rerender' | 'unmount' > {
68
117
return {
69
118
[ assertableSymbol ] : stream ,
70
119
renders : stream . renders ,
@@ -81,7 +130,5 @@ export function renderHookToSnapshotStream<ReturnValue, Props>(
81
130
async waitForNextSnapshot ( options ) {
82
131
return ( await stream . waitForNextRender ( options ) ) . snapshot . value
83
132
} ,
84
- rerender,
85
- unmount,
86
133
}
87
134
}
0 commit comments