Skip to content

Commit cab48a2

Browse files
committed
add test for usecontroller ctor
1 parent 596f558 commit cab48a2

File tree

2 files changed

+185
-2
lines changed

2 files changed

+185
-2
lines changed

tests/hooks/use_listener/use_listener_controller.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ it('listener called', (done) => {
8585
it('default state compare respected', (done) => {
8686
const callbackFn = jest.fn((x: number) => x)
8787
const instance = new TestController()
88-
const { result } = renderHook(() => useListener(instance, (state) => callbackFn(state)))
88+
renderHook(() => useListener(instance, (state) => callbackFn(state)))
8989
instance.inc()
9090
instance.reEmit()
9191
instance.reEmit()
@@ -94,7 +94,6 @@ it('default state compare respected', (done) => {
9494
instance.reEmit()
9595
expect(callbackFn).toHaveBeenCalledTimes(1)
9696
expect(callbackFn.mock.calls[0][0]).toBe(1)
97-
expect(result.current).toBe(undefined)
9897
done()
9998
})
10099

@@ -124,3 +123,9 @@ it('specified state compare respected', (done) => {
124123
expect(callbackFn.mock.calls[4][0]).toBe(1)
125124
done()
126125
})
126+
127+
it('useListener controller return nothing', () => {
128+
const instance = new TestController()
129+
const { result } = renderHook(() => useListener(instance, () => {}))
130+
expect(result.current).toBe(undefined)
131+
})
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
import { TestScheduler } from 'rxjs/testing'
2+
import { Controller, ControllerProvider, useListener } from '../../../src'
3+
import { getByTestId, render } from '@testing-library/react'
4+
import { tap } from 'rxjs'
5+
6+
class TestController extends Controller<number> {
7+
constructor() {
8+
super(0)
9+
}
10+
inc() {
11+
this.emit(this.state + 1)
12+
}
13+
protected compareState(): boolean {
14+
return false
15+
}
16+
reEmit() {
17+
this.emit(this.state)
18+
}
19+
}
20+
21+
it('emit object values every reEmit', () => {
22+
const testScheduler = new TestScheduler((actual, expected) => {
23+
return expect(actual).toEqual(expected)
24+
})
25+
const testController = new TestController()
26+
const triggerMarbles = '-aaaa'
27+
const triggerValues = {
28+
a: () => testController.reEmit(),
29+
}
30+
31+
const expectedMarbles = '-aaaa'
32+
const expectedValues = {
33+
a: 0,
34+
}
35+
const eventObservable = testController.observable.pipe()
36+
testScheduler.run(({ expectObservable, cold }) => {
37+
expectObservable(eventObservable).toBe(expectedMarbles, expectedValues)
38+
expectObservable(cold(triggerMarbles, triggerValues).pipe(tap((fn) => fn())))
39+
})
40+
})
41+
42+
type DisplayRenderedProps = {
43+
callback: (state: number) => void
44+
listenWhen?: (prev: number, curr: number) => boolean
45+
stateComp?: (prev: number, curr: number) => boolean
46+
}
47+
const DisplayRendered = ({ callback, listenWhen, stateComp }: DisplayRenderedProps) => {
48+
useListener(TestController, callback, listenWhen, stateComp)
49+
return <h1 data-testid='text'>Rendered</h1>
50+
}
51+
52+
it('listenWhen respected', (done) => {
53+
const callbackFn = jest.fn((state) => state)
54+
const listenWhenFn = jest.fn((prev, curr) => prev === curr)
55+
const instance = new TestController()
56+
const { container } = render(
57+
<ControllerProvider ctor={TestController} source={instance}>
58+
<DisplayRendered callback={callbackFn} listenWhen={listenWhenFn} />
59+
</ControllerProvider>,
60+
)
61+
const rendered = getByTestId(container, 'text')
62+
const renderedText = rendered.textContent
63+
const expectedText = 'Rendered'
64+
expect(renderedText).toBe(expectedText)
65+
instance.inc()
66+
instance.inc()
67+
instance.inc()
68+
instance.inc()
69+
instance.inc()
70+
expect(callbackFn).toHaveBeenCalledTimes(0)
71+
expect(listenWhenFn).toHaveBeenCalledTimes(5)
72+
expect(listenWhenFn.mock.calls[0][0]).toBe(0)
73+
expect(listenWhenFn.mock.calls[0][1]).toBe(1)
74+
expect(listenWhenFn.mock.calls[1][0]).toBe(1)
75+
expect(listenWhenFn.mock.calls[1][1]).toBe(2)
76+
expect(listenWhenFn.mock.calls[2][0]).toBe(2)
77+
expect(listenWhenFn.mock.calls[2][1]).toBe(3)
78+
expect(listenWhenFn.mock.calls[3][0]).toBe(3)
79+
expect(listenWhenFn.mock.calls[3][1]).toBe(4)
80+
expect(listenWhenFn.mock.calls[4][0]).toBe(4)
81+
expect(listenWhenFn.mock.calls[4][1]).toBe(5)
82+
done()
83+
})
84+
85+
it('listener called', (done) => {
86+
const callbackFn = jest.fn((x: number) => x)
87+
const instance = new TestController()
88+
const { container } = render(
89+
<ControllerProvider ctor={TestController} source={instance}>
90+
<DisplayRendered callback={callbackFn} />
91+
</ControllerProvider>,
92+
)
93+
const rendered = getByTestId(container, 'text')
94+
const renderedText = rendered.textContent
95+
const expectedText = 'Rendered'
96+
expect(renderedText).toBe(expectedText)
97+
instance.inc()
98+
instance.inc()
99+
instance.inc()
100+
instance.inc()
101+
instance.inc()
102+
expect(callbackFn).toHaveBeenCalledTimes(5)
103+
expect(callbackFn.mock.calls[0][0]).toBe(1)
104+
expect(callbackFn.mock.calls[1][0]).toBe(2)
105+
expect(callbackFn.mock.calls[2][0]).toBe(3)
106+
expect(callbackFn.mock.calls[3][0]).toBe(4)
107+
expect(callbackFn.mock.calls[4][0]).toBe(5)
108+
done()
109+
})
110+
111+
it('default state compare respected', (done) => {
112+
const callbackFn = jest.fn((x: number) => x)
113+
const instance = new TestController()
114+
const { container } = render(
115+
<ControllerProvider ctor={TestController} source={instance}>
116+
<DisplayRendered callback={callbackFn} />
117+
</ControllerProvider>,
118+
)
119+
const rendered = getByTestId(container, 'text')
120+
const renderedText = rendered.textContent
121+
const expectedText = 'Rendered'
122+
expect(renderedText).toBe(expectedText)
123+
instance.inc()
124+
instance.reEmit()
125+
instance.reEmit()
126+
instance.reEmit()
127+
instance.reEmit()
128+
instance.reEmit()
129+
expect(callbackFn).toHaveBeenCalledTimes(1)
130+
expect(callbackFn.mock.calls[0][0]).toBe(1)
131+
done()
132+
})
133+
134+
it('specified state compare respected', (done) => {
135+
const callbackFn = jest.fn((x: number) => x)
136+
const instance = new TestController()
137+
const { container } = render(
138+
<ControllerProvider ctor={TestController} source={instance}>
139+
<DisplayRendered callback={callbackFn} listenWhen={() => true} stateComp={() => false} />
140+
</ControllerProvider>,
141+
)
142+
const rendered = getByTestId(container, 'text')
143+
const renderedText = rendered.textContent
144+
const expectedText = 'Rendered'
145+
expect(renderedText).toBe(expectedText)
146+
instance.inc()
147+
instance.reEmit()
148+
instance.reEmit()
149+
instance.reEmit()
150+
instance.reEmit()
151+
instance.reEmit()
152+
expect(callbackFn).toHaveBeenCalledTimes(6)
153+
expect(callbackFn.mock.calls[0][0]).toBe(1)
154+
expect(callbackFn.mock.calls[0][0]).toBe(1)
155+
expect(callbackFn.mock.calls[1][0]).toBe(1)
156+
expect(callbackFn.mock.calls[2][0]).toBe(1)
157+
expect(callbackFn.mock.calls[3][0]).toBe(1)
158+
expect(callbackFn.mock.calls[4][0]).toBe(1)
159+
done()
160+
})
161+
162+
const DisplayRenderedProvided = () => {
163+
const controller = useListener(TestController, () => {})
164+
return <h1 data-testid='text'>Rendered: {controller.state}</h1>
165+
}
166+
167+
it('ctor useListener return controller', () => {
168+
const instance = new TestController()
169+
const { container } = render(
170+
<ControllerProvider ctor={TestController} source={instance}>
171+
<DisplayRenderedProvided />
172+
</ControllerProvider>,
173+
)
174+
const rendered = getByTestId(container, 'text')
175+
const renderedText = rendered.textContent
176+
const expectedText = 'Rendered: 0'
177+
expect(renderedText).toBe(expectedText)
178+
})

0 commit comments

Comments
 (0)