Skip to content

Commit c00a48d

Browse files
committed
add test
1 parent 9fd6bb7 commit c00a48d

File tree

8 files changed

+159
-23
lines changed

8 files changed

+159
-23
lines changed

tests/Builder/builder_controller.test.tsx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Controller, ControllerProvider, Builder } from '../../src'
33
import { act, getByTestId, render, waitFor } from '@testing-library/react'
44
import { tap } from 'rxjs'
55

6+
const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms))
67
class TestController extends Controller<number> {
78
constructor(initialValue?: number) {
89
super(initialValue ?? 0)
@@ -41,13 +42,15 @@ it('emit object values every reEmit', () => {
4142

4243
type DisplayRenderedProps = {
4344
source: TestController
45+
callback?: (state: number) => void
4446
buildWhen?: (prev: number, curr: number) => boolean
4547
stateComp?: (prev: number, curr: number) => boolean
4648
}
47-
const DisplayRendered = ({ source, buildWhen, stateComp }: DisplayRenderedProps) => {
49+
const DisplayRendered = ({ source, buildWhen, stateComp, callback }: DisplayRenderedProps) => {
4850
return (
4951
<Builder source={source} buildWhen={buildWhen} stateCompare={stateComp}>
5052
{(state) => {
53+
callback?.(state)
5154
return (
5255
<>
5356
<h1 data-testid='text'>{state}</h1>
@@ -91,28 +94,41 @@ it('buildWhen respected', (done) => {
9194
})
9295

9396
it('rerender on state changed', async () => {
97+
const onRerender = jest.fn((state: number) => state)
9498
const instance = new TestController()
9599
const { container } = render(
96100
<ControllerProvider ctor={TestController} source={instance}>
97-
<DisplayRendered source={instance} />
101+
<DisplayRendered source={instance} callback={onRerender} />
98102
</ControllerProvider>,
99103
)
100104
const rendered = getByTestId(container, 'text')
101105
const renderedText = rendered.textContent
102106
const expectedText = '0'
103107
expect(renderedText).toBe(expectedText)
104-
act(() => {
108+
await act(async () => {
109+
await asyncDelay(500)
105110
instance.inc()
111+
await asyncDelay(500)
106112
instance.inc()
113+
await asyncDelay(500)
107114
instance.inc()
115+
await asyncDelay(500)
108116
instance.inc()
117+
await asyncDelay(500)
109118
instance.inc()
110119
})
111120
await waitFor(() => {
112121
const rendered = getByTestId(container, 'text')
113122
const renderedText = rendered.textContent
114123
const expectedText = '5'
115124
expect(renderedText).toBe(expectedText)
125+
expect(onRerender).toHaveBeenCalledTimes(6)
126+
expect(onRerender.mock.calls[0][0]).toBe(0)
127+
expect(onRerender.mock.calls[1][0]).toBe(1)
128+
expect(onRerender.mock.calls[2][0]).toBe(2)
129+
expect(onRerender.mock.calls[3][0]).toBe(3)
130+
expect(onRerender.mock.calls[4][0]).toBe(4)
131+
expect(onRerender.mock.calls[5][0]).toBe(5)
116132
})
117133
})
118134

tests/Builder/builder_ctor.test.tsx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Controller, ControllerProvider, ResourcesNotProvidedError, Builder } fr
33
import { act, getByTestId, render, waitFor } from '@testing-library/react'
44
import { tap } from 'rxjs'
55

6+
const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms))
67
class TestController extends Controller<number> {
78
constructor(initialValue?: number) {
89
super(initialValue ?? 0)
@@ -40,13 +41,15 @@ it('emit object values every reEmit', () => {
4041
})
4142

4243
type DisplayRenderedProps = {
44+
callback?: (state: number) => void
4345
buildWhen?: (prev: number, curr: number) => boolean
4446
stateComp?: (prev: number, curr: number) => boolean
4547
}
46-
const DisplayRendered = ({ buildWhen, stateComp }: DisplayRenderedProps) => {
48+
const DisplayRendered = ({ buildWhen, stateComp, callback }: DisplayRenderedProps) => {
4749
return (
4850
<Builder source={TestController} buildWhen={buildWhen} stateCompare={stateComp}>
4951
{(state, controller) => {
52+
callback?.(state)
5053
return (
5154
<>
5255
<h1 data-testid='text'>{state}</h1>
@@ -90,28 +93,41 @@ it('buildWhen respected', (done) => {
9093
})
9194

9295
it('rerender on state changed', async () => {
96+
const onRerender = jest.fn((state: number) => state)
9397
const instance = new TestController()
9498
const { container } = render(
9599
<ControllerProvider ctor={TestController} source={instance}>
96-
<DisplayRendered />
100+
<DisplayRendered callback={onRerender} />
97101
</ControllerProvider>,
98102
)
99103
const rendered = getByTestId(container, 'text')
100104
const renderedText = rendered.textContent
101105
const expectedText = '0'
102106
expect(renderedText).toBe(expectedText)
103-
act(() => {
107+
await act(async () => {
108+
await asyncDelay(500)
104109
instance.inc()
110+
await asyncDelay(500)
105111
instance.inc()
112+
await asyncDelay(500)
106113
instance.inc()
114+
await asyncDelay(500)
107115
instance.inc()
116+
await asyncDelay(500)
108117
instance.inc()
109118
})
110119
await waitFor(() => {
111120
const rendered = getByTestId(container, 'text')
112121
const renderedText = rendered.textContent
113122
const expectedText = '5'
114123
expect(renderedText).toBe(expectedText)
124+
expect(onRerender).toHaveBeenCalledTimes(6)
125+
expect(onRerender.mock.calls[0][0]).toBe(0)
126+
expect(onRerender.mock.calls[1][0]).toBe(1)
127+
expect(onRerender.mock.calls[2][0]).toBe(2)
128+
expect(onRerender.mock.calls[3][0]).toBe(3)
129+
expect(onRerender.mock.calls[4][0]).toBe(4)
130+
expect(onRerender.mock.calls[5][0]).toBe(5)
115131
})
116132
})
117133

tests/Selector/selector_controller.test.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { Controller, Selector } from '../../src'
33
import { act, getByTestId, render, waitFor } from '@testing-library/react'
44
import { tap } from 'rxjs'
55

6+
const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms))
7+
68
type CounterData = {
79
counter: number
810
}
@@ -46,11 +48,13 @@ it('emit object values every reEmit', () => {
4648
type DisplayRenderedProps = {
4749
source: TestController
4850
stateComp?: (prev: number, curr: number) => boolean
51+
callback?: (state: number) => void
4952
}
50-
const DisplayRendered = ({ stateComp, source }: DisplayRenderedProps) => {
53+
const DisplayRendered = ({ stateComp, source, callback }: DisplayRenderedProps) => {
5154
return (
5255
<Selector source={source} selector={(state) => state.counter} stateCompare={stateComp}>
5356
{(state) => {
57+
callback?.(state)
5458
return (
5559
<>
5660
<h1 data-testid='text'>{state}</h1>
@@ -63,24 +67,37 @@ const DisplayRendered = ({ stateComp, source }: DisplayRenderedProps) => {
6367
}
6468

6569
it('rerender on state changed', async () => {
70+
const onRerender = jest.fn((state: number) => state)
6671
const instance = new TestController()
6772
const { container } = render(<DisplayRendered source={instance} />)
6873
const rendered = getByTestId(container, 'text')
6974
const renderedText = rendered.textContent
7075
const expectedText = '0'
7176
expect(renderedText).toBe(expectedText)
72-
act(() => {
77+
await act(async () => {
78+
await asyncDelay(500)
7379
instance.inc()
80+
await asyncDelay(500)
7481
instance.inc()
82+
await asyncDelay(500)
7583
instance.inc()
84+
await asyncDelay(500)
7685
instance.inc()
86+
await asyncDelay(500)
7787
instance.inc()
7888
})
7989
await waitFor(() => {
8090
const rendered = getByTestId(container, 'text')
8191
const renderedText = rendered.textContent
8292
const expectedText = '5'
8393
expect(renderedText).toBe(expectedText)
94+
expect(onRerender).toHaveBeenCalledTimes(6)
95+
expect(onRerender.mock.calls[0][0]).toBe(0)
96+
expect(onRerender.mock.calls[1][0]).toBe(1)
97+
expect(onRerender.mock.calls[2][0]).toBe(2)
98+
expect(onRerender.mock.calls[3][0]).toBe(3)
99+
expect(onRerender.mock.calls[4][0]).toBe(4)
100+
expect(onRerender.mock.calls[5][0]).toBe(5)
84101
})
85102
})
86103

tests/Selector/selector_ctor.test.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { Controller, ControllerProvider, ResourcesNotProvidedError, Selector } f
33
import { act, getByTestId, render, waitFor } from '@testing-library/react'
44
import { tap } from 'rxjs'
55

6+
const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms))
7+
68
type CounterData = {
79
counter: number
810
}
@@ -45,11 +47,13 @@ it('emit object values every reEmit', () => {
4547

4648
type DisplayRenderedProps = {
4749
stateComp?: (prev: number, curr: number) => boolean
50+
callback?: (state: number) => void
4851
}
49-
const DisplayRendered = ({ stateComp }: DisplayRenderedProps) => {
52+
const DisplayRendered = ({ stateComp, callback }: DisplayRenderedProps) => {
5053
return (
5154
<Selector source={TestController} selector={(state) => state.counter} stateCompare={stateComp}>
5255
{(state, controller) => {
56+
callback?.(state)
5357
return (
5458
<>
5559
<h1 data-testid='text'>{state}</h1>
@@ -62,28 +66,41 @@ const DisplayRendered = ({ stateComp }: DisplayRenderedProps) => {
6266
}
6367

6468
it('rerender on state changed', async () => {
69+
const onRerender = jest.fn((state: number) => state)
6570
const instance = new TestController()
6671
const { container } = render(
6772
<ControllerProvider ctor={TestController} source={instance}>
68-
<DisplayRendered />
73+
<DisplayRendered callback={onRerender} />
6974
</ControllerProvider>,
7075
)
7176
const rendered = getByTestId(container, 'text')
7277
const renderedText = rendered.textContent
7378
const expectedText = '0'
7479
expect(renderedText).toBe(expectedText)
75-
act(() => {
80+
await act(async () => {
81+
await asyncDelay(500)
7682
instance.inc()
83+
await asyncDelay(500)
7784
instance.inc()
85+
await asyncDelay(500)
7886
instance.inc()
87+
await asyncDelay(500)
7988
instance.inc()
89+
await asyncDelay(500)
8090
instance.inc()
8191
})
8292
await waitFor(() => {
8393
const rendered = getByTestId(container, 'text')
8494
const renderedText = rendered.textContent
8595
const expectedText = '5'
8696
expect(renderedText).toBe(expectedText)
97+
expect(onRerender).toHaveBeenCalledTimes(6)
98+
expect(onRerender.mock.calls[0][0]).toBe(0)
99+
expect(onRerender.mock.calls[1][0]).toBe(1)
100+
expect(onRerender.mock.calls[2][0]).toBe(2)
101+
expect(onRerender.mock.calls[3][0]).toBe(3)
102+
expect(onRerender.mock.calls[4][0]).toBe(4)
103+
expect(onRerender.mock.calls[5][0]).toBe(5)
87104
})
88105
})
89106

tests/hooks/use_builder/use_builder_controller.test.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Controller, useBuilder } from '../../../src'
33
import { tap } from 'rxjs'
44
import { act, renderHook, waitFor } from '@testing-library/react'
55

6+
const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms))
67
class TestController extends Controller<number> {
78
constructor() {
89
super(0)
@@ -64,19 +65,36 @@ it('buildWhen respected', (done) => {
6465
})
6566

6667
it('rerender on state changed', async () => {
68+
const onRerender = jest.fn((state: number) => state)
6769
const instance = new TestController()
6870
const { result } = renderHook(() => {
69-
return useBuilder(instance)
71+
const state = useBuilder(instance)
72+
onRerender(state)
73+
return state
7074
})
7175
expect(result.current).toBe(0)
72-
act(() => {
76+
await act(async () => {
77+
await asyncDelay(500)
7378
instance.inc()
79+
await asyncDelay(500)
7480
instance.inc()
81+
await asyncDelay(500)
7582
instance.inc()
83+
await asyncDelay(500)
7684
instance.inc()
85+
await asyncDelay(500)
7786
instance.inc()
7887
})
79-
await waitFor(() => expect(result.current).toBe(5))
88+
await waitFor(() => {
89+
expect(result.current).toBe(5)
90+
expect(onRerender).toHaveBeenCalledTimes(6)
91+
expect(onRerender.mock.calls[0][0]).toBe(0)
92+
expect(onRerender.mock.calls[1][0]).toBe(1)
93+
expect(onRerender.mock.calls[2][0]).toBe(2)
94+
expect(onRerender.mock.calls[3][0]).toBe(3)
95+
expect(onRerender.mock.calls[4][0]).toBe(4)
96+
expect(onRerender.mock.calls[5][0]).toBe(5)
97+
})
8098
})
8199

82100
it('specified state compare respected', async () => {

tests/hooks/use_builder/use_builder_ctor.test.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { Controller, ControllerProvider, ResourcesNotProvidedError, useBuilder }
33
import { act, getByTestId, render, waitFor } from '@testing-library/react'
44
import { tap } from 'rxjs'
55

6+
const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms))
7+
68
class TestController extends Controller<number> {
79
constructor(initialValue?: number) {
810
super(initialValue ?? 0)
@@ -42,9 +44,11 @@ it('emit object values every reEmit', () => {
4244
type DisplayRenderedProps = {
4345
buildWhen?: (prev: number, curr: number) => boolean
4446
stateComp?: (prev: number, curr: number) => boolean
47+
callback?: (state: number) => void
4548
}
46-
const DisplayRendered = ({ buildWhen, stateComp }: DisplayRenderedProps) => {
49+
const DisplayRendered = ({ buildWhen, stateComp, callback }: DisplayRenderedProps) => {
4750
const [state, controller] = useBuilder(TestController, buildWhen, stateComp)
51+
callback?.(state)
4852
return (
4953
<>
5054
<h1 data-testid='text'>{state}</h1>
@@ -85,28 +89,41 @@ it('buildWhen respected', (done) => {
8589
})
8690

8791
it('rerender on state changed', async () => {
92+
const onRerender = jest.fn((state: number) => state)
8893
const instance = new TestController()
8994
const { container } = render(
9095
<ControllerProvider ctor={TestController} source={instance}>
91-
<DisplayRendered />
96+
<DisplayRendered callback={onRerender} />
9297
</ControllerProvider>,
9398
)
9499
const rendered = getByTestId(container, 'text')
95100
const renderedText = rendered.textContent
96101
const expectedText = '0'
97102
expect(renderedText).toBe(expectedText)
98-
act(() => {
103+
await act(async () => {
104+
await asyncDelay(500)
99105
instance.inc()
106+
await asyncDelay(500)
100107
instance.inc()
108+
await asyncDelay(500)
101109
instance.inc()
110+
await asyncDelay(500)
102111
instance.inc()
112+
await asyncDelay(500)
103113
instance.inc()
104114
})
105115
await waitFor(() => {
106116
const rendered = getByTestId(container, 'text')
107117
const renderedText = rendered.textContent
108118
const expectedText = '5'
109119
expect(renderedText).toBe(expectedText)
120+
expect(onRerender).toHaveBeenCalledTimes(6)
121+
expect(onRerender.mock.calls[0][0]).toBe(0)
122+
expect(onRerender.mock.calls[1][0]).toBe(1)
123+
expect(onRerender.mock.calls[2][0]).toBe(2)
124+
expect(onRerender.mock.calls[3][0]).toBe(3)
125+
expect(onRerender.mock.calls[4][0]).toBe(4)
126+
expect(onRerender.mock.calls[5][0]).toBe(5)
110127
})
111128
})
112129

0 commit comments

Comments
 (0)