Skip to content

Commit e987678

Browse files
committed
add test for useSelector
1 parent 9988894 commit e987678

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

tests/hooks/use_builder/use_builder_ctor.test.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ type DisplayRenderedProps = {
4545
}
4646
const DisplayRendered = ({ buildWhen, stateComp }: DisplayRenderedProps) => {
4747
const [state, controller] = useBuilder(TestController, buildWhen, stateComp)
48-
console.log(controller)
4948
return (
5049
<>
5150
<h1 data-testid='text'>{state}</h1>
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { TestScheduler } from 'rxjs/testing'
2+
import { Controller, useSelector } from '../../../src'
3+
import { tap } from 'rxjs'
4+
import { act, renderHook, waitFor } from '@testing-library/react'
5+
6+
type CounterData = {
7+
counter: number
8+
}
9+
10+
class TestController extends Controller<CounterData> {
11+
constructor() {
12+
super({ counter: 0 })
13+
}
14+
inc() {
15+
this.emit({ counter: this.state.counter + 1 })
16+
}
17+
protected compareState(): boolean {
18+
return false
19+
}
20+
reEmit() {
21+
this.emit(this.state)
22+
}
23+
}
24+
25+
it('emit object values every reEmit', () => {
26+
const testScheduler = new TestScheduler((actual, expected) => {
27+
return expect(actual).toEqual(expected)
28+
})
29+
const testController = new TestController()
30+
const triggerMarbles = '-aaaa'
31+
const triggerValues = {
32+
a: () => testController.reEmit(),
33+
}
34+
35+
const expectedMarbles = '-aaaa'
36+
const expectedValues = {
37+
a: { counter: 0 },
38+
}
39+
const eventObservable = testController.observable.pipe()
40+
testScheduler.run(({ expectObservable, cold }) => {
41+
expectObservable(eventObservable).toBe(expectedMarbles, expectedValues)
42+
expectObservable(cold(triggerMarbles, triggerValues).pipe(tap((fn) => fn())))
43+
})
44+
})
45+
46+
it('rerender on state changed', async () => {
47+
const instance = new TestController()
48+
const { result } = renderHook(() => {
49+
return useSelector(instance, (state) => state.counter)
50+
})
51+
expect(result.current).toBe(0)
52+
act(() => {
53+
instance.inc()
54+
instance.inc()
55+
instance.inc()
56+
instance.inc()
57+
instance.inc()
58+
})
59+
await waitFor(() => expect(result.current).toBe(5))
60+
})
61+
62+
it('specified state compare respected', async () => {
63+
const stateCompareFn = jest.fn((prev, curr) => {
64+
return prev !== curr
65+
})
66+
const instance = new TestController()
67+
const { result } = renderHook(() => {
68+
return useSelector(
69+
instance,
70+
(state) => state.counter,
71+
(prev, curr) => stateCompareFn(prev, curr),
72+
)
73+
})
74+
expect(result.current).toBe(0)
75+
act(() => {
76+
instance.inc()
77+
instance.inc()
78+
instance.inc()
79+
instance.inc()
80+
})
81+
await waitFor(() => {
82+
expect(stateCompareFn).toHaveBeenCalledTimes(4)
83+
expect(stateCompareFn.mock.calls[0][0]).toBe(0)
84+
expect(stateCompareFn.mock.calls[0][1]).toBe(1)
85+
expect(stateCompareFn.mock.calls[1][0]).toBe(0)
86+
expect(stateCompareFn.mock.calls[1][1]).toBe(2)
87+
expect(stateCompareFn.mock.calls[2][0]).toBe(0)
88+
expect(stateCompareFn.mock.calls[2][1]).toBe(3)
89+
expect(stateCompareFn.mock.calls[3][0]).toBe(0)
90+
expect(stateCompareFn.mock.calls[3][1]).toBe(4)
91+
expect(result.current).toBe(0)
92+
})
93+
})
94+
95+
it('useSelector controller return value', () => {
96+
const instance = new TestController()
97+
const { result } = renderHook(() => useSelector(instance, (state) => state.counter))
98+
expect(result.current).toBe(0)
99+
})

0 commit comments

Comments
 (0)