forked from streamich/react-use
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseSetState.test.ts
60 lines (45 loc) · 1.72 KB
/
useSetState.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { act, renderHook } from '@testing-library/react-hooks';
import useSetState from '../src/useSetState';
const setUp = (initialState?: object) => renderHook(() => useSetState(initialState));
it('should init state and setter', () => {
const { result } = setUp({ foo: 'bar' });
const [state, setState] = result.current;
expect(state).toEqual({ foo: 'bar' });
expect(setState).toBeInstanceOf(Function);
});
it('should init empty state if not initial state provided', () => {
const { result } = setUp();
expect(result.current[0]).toEqual({});
});
it('should merge changes into current state when providing object', () => {
const { result } = setUp({ foo: 'bar', count: 1 });
const [state, setState] = result.current;
act(() => {
// @ts-ignore
setState({ count: state.count + 1, someBool: true });
});
expect(result.current[0]).toEqual({ foo: 'bar', count: 2, someBool: true });
});
it('should merge changes into current state when providing function', () => {
const { result } = setUp({ foo: 'bar', count: 1 });
const [, setState] = result.current;
act(() => {
// @ts-ignore
setState((prevState) => ({ count: prevState.count + 1, someBool: true }));
});
expect(result.current[0]).toEqual({ foo: 'bar', count: 2, someBool: true });
});
/**
* Enforces cases where a hook can safely depend on the callback without
* causing an endless rerender cycle: useEffect(() => setState({ data }), [setState]);
*/
it('should return a memoized setState callback', () => {
const { result, rerender } = setUp({ ok: false });
const [, setState1] = result.current;
act(() => {
setState1({ ok: true });
});
rerender();
const [, setState2] = result.current;
expect(setState1).toBe(setState2);
});