Skip to content

Commit a52e47a

Browse files
committed
add test for selector ctor
1 parent e987678 commit a52e47a

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
import { TestScheduler } from 'rxjs/testing'
2+
import { Controller, ControllerProvider, useSelector } from '../../../src'
3+
import { act, getByTestId, render, waitFor } from '@testing-library/react'
4+
import { tap } from 'rxjs'
5+
6+
type CounterData = {
7+
counter: number
8+
}
9+
10+
class TestController extends Controller<CounterData> {
11+
constructor(initialState?: CounterData) {
12+
super(initialState ?? { 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+
type DisplayRenderedProps = {
47+
stateComp?: (prev: number, curr: number) => boolean
48+
}
49+
const DisplayRendered = ({ stateComp }: DisplayRenderedProps) => {
50+
const [state, controller] = useSelector(TestController, (state) => state.counter, stateComp)
51+
return (
52+
<>
53+
<h1 data-testid='text'>{state}</h1>
54+
<h1 data-testid='controller'>{controller.constructor.name}</h1>
55+
</>
56+
)
57+
}
58+
59+
it('rerender on state changed', async () => {
60+
const instance = new TestController()
61+
const { container } = render(
62+
<ControllerProvider ctor={TestController} source={instance}>
63+
<DisplayRendered />
64+
</ControllerProvider>,
65+
)
66+
const rendered = getByTestId(container, 'text')
67+
const renderedText = rendered.textContent
68+
const expectedText = '0'
69+
expect(renderedText).toBe(expectedText)
70+
act(() => {
71+
instance.inc()
72+
instance.inc()
73+
instance.inc()
74+
instance.inc()
75+
instance.inc()
76+
})
77+
await waitFor(() => {
78+
const rendered = getByTestId(container, 'text')
79+
const renderedText = rendered.textContent
80+
const expectedText = '5'
81+
expect(renderedText).toBe(expectedText)
82+
})
83+
})
84+
85+
it('specified state compare respected', async () => {
86+
const stateCompareFn = jest.fn((prev, curr) => prev !== curr)
87+
const instance = new TestController()
88+
const { container } = render(
89+
<ControllerProvider ctor={TestController} source={instance}>
90+
<DisplayRendered stateComp={stateCompareFn} />
91+
</ControllerProvider>,
92+
)
93+
const rendered = getByTestId(container, 'text')
94+
const renderedText = rendered.textContent
95+
const expectedText = '0'
96+
expect(renderedText).toBe(expectedText)
97+
98+
act(() => {
99+
instance.inc()
100+
instance.inc()
101+
instance.inc()
102+
instance.inc()
103+
})
104+
await waitFor(() => {
105+
expect(stateCompareFn).toHaveBeenCalledTimes(4)
106+
expect(stateCompareFn.mock.calls[0][0]).toBe(0)
107+
expect(stateCompareFn.mock.calls[0][1]).toBe(1)
108+
expect(stateCompareFn.mock.calls[1][0]).toBe(0)
109+
expect(stateCompareFn.mock.calls[1][1]).toBe(2)
110+
expect(stateCompareFn.mock.calls[2][0]).toBe(0)
111+
expect(stateCompareFn.mock.calls[2][1]).toBe(3)
112+
expect(stateCompareFn.mock.calls[3][0]).toBe(0)
113+
expect(stateCompareFn.mock.calls[3][1]).toBe(4)
114+
const rendered = getByTestId(container, 'text')
115+
const renderedText = rendered.textContent
116+
const expectedText = '0'
117+
expect(renderedText).toBe(expectedText)
118+
})
119+
})
120+
121+
it('useSelector cto return [state, controller]', () => {
122+
const instance = new TestController({ counter: 5 })
123+
const { container } = render(
124+
<ControllerProvider ctor={TestController} source={instance}>
125+
<DisplayRendered />
126+
</ControllerProvider>,
127+
)
128+
const renderedCount = getByTestId(container, 'text')
129+
const renderedText = renderedCount.textContent
130+
const expectedText = '5'
131+
expect(renderedText).toBe(expectedText)
132+
133+
const renderedController = getByTestId(container, 'controller')
134+
const renderedControllerText = renderedController.textContent
135+
const expectedControllerText = 'TestController'
136+
expect(renderedControllerText).toBe(expectedControllerText)
137+
})

0 commit comments

Comments
 (0)