Skip to content

Commit 14a87fa

Browse files
committed
allow any kind of hook return value for renderHookToSnapshotStream
1 parent ed33bd3 commit 14a87fa

File tree

1 file changed

+14
-21
lines changed

1 file changed

+14
-21
lines changed

src/renderHookToSnapshotStream.ts

+14-21
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
import { RenderHookOptions } from "@testing-library/react";
2-
import {
3-
createRenderStream,
4-
NextRenderOptions,
5-
ValidSnapshot,
6-
} from "./profile/profile.js";
2+
import { createRenderStream, NextRenderOptions } from "./profile/profile.js";
73
import { Render } from "./profile/Render.js";
84
import { createElement } from "react";
95
import { Assertable, assertableSymbol, markAssertable } from "./assertable.js";
106

11-
export interface SnapshotStream<Snapshot extends ValidSnapshot, Props>
12-
extends Assertable {
7+
export interface SnapshotStream<Snapshot, Props> extends Assertable {
138
/**
149
* An array of all renders that have happened so far.
1510
* Errors thrown during component render will be captured here, too.
1611
*/
1712
renders: Array<
18-
Render<Snapshot> | { phase: "snapshotError"; count: number; error: unknown }
13+
| Render<{ value: Snapshot }>
14+
| { phase: "snapshotError"; count: number; error: unknown }
1915
>;
2016
/**
2117
* Peeks the next render from the current iterator position, without advancing the iterator.
@@ -48,44 +44,41 @@ export interface SnapshotStream<Snapshot extends ValidSnapshot, Props>
4844
unmount: () => void;
4945
}
5046

51-
export function renderHookToSnapshotStream<
52-
ReturnValue extends ValidSnapshot,
53-
Props extends {},
54-
>(
47+
export function renderHookToSnapshotStream<ReturnValue, Props extends {}>(
5548
renderCallback: (props: Props) => ReturnValue,
5649
{ initialProps, ...options }: RenderHookOptions<Props> = {}
5750
): SnapshotStream<ReturnValue, Props> {
58-
const { render, ...stream } = createRenderStream<ReturnValue>();
51+
const { render, ...stream } = createRenderStream<{ value: ReturnValue }>();
5952

60-
const ProfiledHook: React.FC<Props> = (props) => {
61-
stream.replaceSnapshot(renderCallback(props));
53+
const HookComponent: React.FC<Props> = (props) => {
54+
stream.replaceSnapshot({ value: renderCallback(props) });
6255
return null;
6356
};
6457

6558
const { rerender: baseRerender, unmount } = render(
66-
createElement(ProfiledHook, initialProps),
59+
createElement(HookComponent, initialProps),
6760
options
6861
);
6962

7063
function rerender(rerenderCallbackProps: Props) {
71-
return baseRerender(createElement(ProfiledHook, rerenderCallbackProps));
64+
return baseRerender(createElement(HookComponent, rerenderCallbackProps));
7265
}
7366

7467
return {
7568
[assertableSymbol]: stream,
7669
renders: stream.renders,
7770
totalSnapshotCount: stream.totalRenderCount,
7871
async peekSnapshot(options) {
79-
return (await stream.peekRender(options)).snapshot;
72+
return (await stream.peekRender(options)).snapshot.value;
8073
},
8174
takeSnapshot: markAssertable(async function takeSnapshot(options) {
82-
return (await stream.takeRender(options)).snapshot;
75+
return (await stream.takeRender(options)).snapshot.value;
8376
}, stream),
8477
getCurrentSnapshot() {
85-
return stream.getCurrentRender().snapshot;
78+
return stream.getCurrentRender().snapshot.value;
8679
},
8780
async waitForNextSnapshot(options) {
88-
return (await stream.waitForNextRender(options)).snapshot;
81+
return (await stream.waitForNextRender(options)).snapshot.value;
8982
},
9083
rerender,
9184
unmount,

0 commit comments

Comments
 (0)