Skip to content

Commit b4a575c

Browse files
Added actAsync util
1 parent 077d8a1 commit b4a575c

File tree

5 files changed

+98
-2
lines changed

5 files changed

+98
-2
lines changed

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import assert from "node:assert/strict";
2828
import mockFunction from "mock-fn";
2929

3030
import {
31+
actAsync,
3132
assertComponents,
3233
mockComponent,
3334
TestErrorBoundary,
@@ -98,6 +99,32 @@ describe("MyComponent", () => {
9899
);
99100
});
100101

102+
it("should render without warnings using actAsync", async () => {
103+
//given
104+
const Comp1 = mockComponent(TestComp);
105+
const Comp2 = mockComponent(TestComp2);
106+
const Comp = () => {
107+
const [_, setState] = useState(0);
108+
useLayoutEffect(() => {
109+
Promise.resolve().then(() => {
110+
setState(123);
111+
});
112+
}, []);
113+
114+
return h(Comp1, {}, h("div"), h(Comp2));
115+
};
116+
117+
//when
118+
const result = (
119+
await actAsync(() => {
120+
return TestRenderer.create(h(Comp));
121+
})
122+
).root;
123+
124+
//then
125+
assertComponents(result.children, h(Comp1, {}, h("div"), h(Comp2)));
126+
});
127+
101128
it("should render error details if error during render", () => {
102129
//given
103130
// suppress intended error

index.d.mts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export function mockComponent<
1515
T = React.FunctionComponent<any> | React.ComponentClass<any>
1616
>(comp: T, name?: string): T;
1717

18+
export function actAsync<T>(callback: () => T): Promise<T>;
19+
1820
interface State {
1921
error?: object;
2022
}

index.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export { default as assertComponent } from "./src/assertComponent.mjs";
22
export { default as assertComponents } from "./src/assertComponents.mjs";
33
export { default as mockComponent } from "./src/mockComponent.mjs";
4+
export { actAsync } from "./src/utils.mjs";
45
export { default as TestErrorBoundary } from "./src/TestErrorBoundary.mjs";

src/utils.mjs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import TestRenderer from "react-test-renderer";
2+
3+
/**
4+
* @template T
5+
* @param {() => T} callback
6+
* @returns {Promise<T>}
7+
*/
8+
export async function actAsync(callback) {
9+
/** @type {T} */
10+
let result;
11+
12+
await TestRenderer.act(async () => {
13+
result = callback();
14+
});
15+
16+
//@ts-ignore
17+
return result;
18+
}

test/assertComponents.test.mjs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import React from "react";
1+
import React, { useLayoutEffect, useState } from "react";
22
import TestRenderer from "react-test-renderer";
33
import assert from "node:assert/strict";
4-
import { assertComponents } from "../index.mjs";
4+
import { actAsync, assertComponents, mockComponent } from "../index.mjs";
55
import { TestComp, TestComp2 } from "./testComponents.mjs";
66

77
const { describe, it } = await (async () => {
@@ -63,4 +63,52 @@ describe("assertComponents.test.mjs", () => {
6363
"\n\texpected: TestComp2"
6464
);
6565
});
66+
67+
it("should not fail if components match", () => {
68+
//given
69+
const Comp1 = mockComponent(TestComp);
70+
const Comp2 = mockComponent(TestComp2);
71+
const Comp = () => {
72+
return h(Comp1, {}, h("div"), h(Comp2));
73+
};
74+
const comp = TestRenderer.create(h(Comp)).root;
75+
/** @type {Error?} */
76+
let resError = null;
77+
78+
//when
79+
try {
80+
assertComponents(comp.children, h(Comp1, {}, h("div"), h(Comp2)));
81+
} catch (error) {
82+
resError = error;
83+
}
84+
85+
//then
86+
assert.deepEqual(resError, null);
87+
});
88+
89+
it("should not fail if components match async", async () => {
90+
//given
91+
const Comp1 = mockComponent(TestComp);
92+
const Comp2 = mockComponent(TestComp2);
93+
const Comp = () => {
94+
const [_, setState] = useState(0);
95+
useLayoutEffect(() => {
96+
Promise.resolve().then(() => {
97+
setState(123);
98+
});
99+
}, []);
100+
101+
return h(Comp1, {}, h("div"), h(Comp2));
102+
};
103+
104+
//when
105+
const result = (
106+
await actAsync(() => {
107+
return TestRenderer.create(h(Comp));
108+
})
109+
).root;
110+
111+
//then
112+
assertComponents(result.children, h(Comp1, {}, h("div"), h(Comp2)));
113+
});
66114
});

0 commit comments

Comments
 (0)