1- import { RenderHookOptions } from '@testing-library/react'
1+ import { Queries , RenderHookOptions } from '@testing-library/react'
22import React from 'rehackt'
3- import { createRenderStream } from './renderStream/createRenderStream.js'
3+ import {
4+ createRenderStream ,
5+ RenderStream ,
6+ } from './renderStream/createRenderStream.js'
47import { type NextRenderOptions } from './renderStream/createRenderStream.js'
58import { Render } from './renderStream/Render.js'
69import { Assertable , assertableSymbol , markAssertable } from './assertable.js'
10+ import { SyncQueries } from './renderStream/syncQueries.js'
711
812export interface SnapshotStream < Snapshot , Props > extends Assertable {
913 /**
@@ -49,7 +53,11 @@ export function renderHookToSnapshotStream<ReturnValue, Props>(
4953 renderCallback : ( props : Props ) => ReturnValue ,
5054 { initialProps, ...renderOptions } : RenderHookOptions < Props > = { } ,
5155) : SnapshotStream < ReturnValue , Props > {
52- const { render, ...stream } = createRenderStream < { value : ReturnValue } , never > ( )
56+ const {
57+ render,
58+ renderAsync : _ ,
59+ ...stream
60+ } = createRenderStream < { value : ReturnValue } , never > ( )
5361
5462 const HookComponent : React . FC < { arg : Props } > = props => {
5563 stream . replaceSnapshot ( { value : renderCallback ( props . arg ) } )
@@ -65,6 +73,47 @@ export function renderHookToSnapshotStream<ReturnValue, Props>(
6573 return baseRerender ( < HookComponent arg = { rerenderCallbackProps } /> )
6674 }
6775
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' > {
68117 return {
69118 [ assertableSymbol ] : stream ,
70119 renders : stream . renders ,
@@ -81,7 +130,5 @@ export function renderHookToSnapshotStream<ReturnValue, Props>(
81130 async waitForNextSnapshot ( options ) {
82131 return ( await stream . waitForNextRender ( options ) ) . snapshot . value
83132 } ,
84- rerender,
85- unmount,
86133 }
87134}
0 commit comments