Skip to content

Commit 15012be

Browse files
committed
test 100%
1 parent a67a9e4 commit 15012be

File tree

3 files changed

+91
-2
lines changed

3 files changed

+91
-2
lines changed

src/hooks/useListener.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Constructor, InferStateType, ShouldUpdate, StateCompare } from '../type
33
import { useCallback, useEffect, useRef } from 'react'
44
import { useControllerResolver } from './useControllerResolver'
55
import { isEqual } from '../utils'
6+
import { Observable, Subscription } from '..'
67

78
function useListener<C extends Controller<InferStateType<C>>>(
89
ctor: Constructor<C>,
@@ -52,7 +53,8 @@ function useListener<C extends Controller<InferStateType<C>>>(
5253
}, [stateCompare])
5354

5455
useEffect(() => {
55-
const subscription = controller.observable.subscribe((state) => {
56+
const observable: Observable<InferStateType<C>> = controller.observable
57+
const subscription: Subscription = observable.subscribe((state) => {
5658
const currentState = stateRef.current
5759
if (stateCompareRef.current(currentState, state)) {
5860
return

tests/Controller/controller_sync.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Controller } from '../../src'
1+
import { Controller, Observable, Subscription } from '../../src'
22

33
type TestState = {
44
count: number
@@ -85,3 +85,27 @@ it('state is not-change/skipped when the same value emitted', () => {
8585

8686
expect(oldState).toBe(newState)
8787
})
88+
89+
it('controller observable is rxjs observable', () => {
90+
const initialState: TestState = {
91+
count: 1,
92+
count2: 2,
93+
count3: 3,
94+
count4: 4,
95+
}
96+
const testController = new TestController(initialState)
97+
expect(testController.observable).toBeInstanceOf(Observable)
98+
})
99+
100+
it('controller observable can be subscribe', () => {
101+
const initialState: TestState = {
102+
count: 1,
103+
count2: 2,
104+
count3: 3,
105+
count4: 4,
106+
}
107+
const testController = new TestController(initialState)
108+
const subscription = testController.observable.subscribe()
109+
expect(subscription).toBeInstanceOf(Subscription)
110+
subscription.unsubscribe()
111+
})
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// able to render without error
2+
// able to render all providers
3+
4+
import { getByTestId, render } from '@testing-library/react'
5+
import { Controller, ControllerProvider, MultiProvider, useProvider } from '../../src'
6+
7+
class TestController extends Controller<number> {
8+
constructor() {
9+
super(0)
10+
}
11+
}
12+
13+
class TestController2 extends Controller<number> {
14+
constructor() {
15+
super(1)
16+
}
17+
}
18+
class TestController3 extends Controller<number> {
19+
constructor() {
20+
super(2)
21+
}
22+
}
23+
const App = () => {
24+
const testController = useProvider(TestController)
25+
const testController2 = useProvider(TestController2)
26+
const testController3 = useProvider(TestController3)
27+
return (
28+
<>
29+
<h1 data-testid='app-text1'>{testController.state}</h1>
30+
<h1 data-testid='app-text2'>{testController2.state}</h1>
31+
<h1 data-testid='app-text3'>{testController3.state}</h1>
32+
</>
33+
)
34+
}
35+
36+
it('render 4 level nested, all level child rendered', () => {
37+
const { container } = render(
38+
<MultiProvider
39+
providers={[
40+
<ControllerProvider key={0} source={() => new TestController()} />,
41+
<ControllerProvider key={1} source={() => new TestController2()} />,
42+
<ControllerProvider key={2} source={() => new TestController3()} />,
43+
]}
44+
>
45+
<App />
46+
</MultiProvider>,
47+
)
48+
49+
const appTextElement1 = getByTestId(container, 'app-text1')
50+
const appText1 = appTextElement1.textContent
51+
const expectedAppText1 = '0'
52+
expect(appText1).toBe(expectedAppText1)
53+
54+
const appTextElement2 = getByTestId(container, 'app-text2')
55+
const appText2 = appTextElement2.textContent
56+
const expectedAppText2 = '1'
57+
expect(appText2).toBe(expectedAppText2)
58+
59+
const appTextElement3 = getByTestId(container, 'app-text3')
60+
const appText3 = appTextElement3.textContent
61+
const expectedAppText3 = '2'
62+
expect(appText3).toBe(expectedAppText3)
63+
})

0 commit comments

Comments
 (0)