Skip to content

Commit 33247af

Browse files
committed
no luck reproduicing #186 in unit tests
1 parent 75c6f2b commit 33247af

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

src/__tests__/Promised.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,59 @@ test('primitive: should rerender used on promise resolve', async () => {
3636
expect(result.current.get()).toEqual(100);
3737
});
3838

39+
test('primitive: should rerender used on promise resolve immediately', async () => {
40+
let renderTimes = 0
41+
const { result } = renderHook(() => {
42+
renderTimes += 1;
43+
return useState(0)
44+
});
45+
expect(renderTimes).toStrictEqual(1);
46+
expect(result.current.get()).toStrictEqual(0);
47+
48+
const promise = Promise.resolve(100);
49+
act(() => {
50+
result.current.set(promise);
51+
});
52+
expect(renderTimes).toStrictEqual(2);
53+
expect(result.current.promised).toStrictEqual(true);
54+
expect(() => result.current.keys)
55+
.toThrow('Error: HOOKSTATE-103 [path: /]. See https://hookstate.js.org/docs/exceptions#hookstate-103');
56+
expect(() => result.current.get())
57+
.toThrow('Error: HOOKSTATE-103 [path: /]. See https://hookstate.js.org/docs/exceptions#hookstate-103');
58+
59+
expect(() => result.current.set(200))
60+
.toThrow('Error: HOOKSTATE-104 [path: /]. See https://hookstate.js.org/docs/exceptions#hookstate-104')
61+
62+
await act(async () => {
63+
await promise;
64+
})
65+
expect(renderTimes).toStrictEqual(3);
66+
expect(result.current.promised).toStrictEqual(false);
67+
expect(result.current.error).toEqual(undefined);
68+
expect(result.current.get()).toEqual(100);
69+
});
70+
71+
test('primitive: should rerender used on promise resolve immediately global', async () => {
72+
let renderTimes = 0
73+
let state = createState(async () => {
74+
return 100
75+
});
76+
const { result } = renderHook(() => {
77+
renderTimes += 1;
78+
return useState(state)
79+
});
80+
expect(renderTimes).toStrictEqual(1);
81+
expect(result.current.promised).toStrictEqual(true);
82+
83+
await act(async () => {
84+
await new Promise((resolve,) => setTimeout(resolve, 0));
85+
})
86+
expect(renderTimes).toStrictEqual(2);
87+
expect(result.current.promised).toStrictEqual(false);
88+
expect(result.current.error).toEqual(undefined);
89+
expect(result.current.get()).toEqual(100);
90+
});
91+
3992
test('array: should rerender used on promise resolve', async () => {
4093
let renderTimes = 0
4194
const { result } = renderHook(() => {

0 commit comments

Comments
 (0)