|
1 | 1 | import { TestScheduler } from 'rxjs/testing'
|
2 | 2 | import { Controller, ControllerProvider, Builder } from '../../src'
|
3 |
| -import { act, getByTestId, render, waitFor } from '@testing-library/react' |
| 3 | +import { act, getByTestId, render } from '@testing-library/react' |
4 | 4 | import { tap } from 'rxjs'
|
5 | 5 |
|
6 |
| -const asyncDelay = (ms: number) => new Promise((r) => setTimeout(r, ms)) |
7 | 6 | class TestController extends Controller<number> {
|
8 | 7 | constructor(initialValue?: number) {
|
9 | 8 | super(initialValue ?? 0)
|
@@ -62,120 +61,161 @@ const DisplayRendered = ({ source, buildWhen, stateComp, callback }: DisplayRend
|
62 | 61 | )
|
63 | 62 | }
|
64 | 63 |
|
65 |
| -it('buildWhen respected', async () => { |
| 64 | +it('buildWhen respected', () => { |
66 | 65 | const buildWhenFn = jest.fn((prev, curr) => prev === curr)
|
67 | 66 | const instance = new TestController()
|
68 | 67 | const { container } = render(
|
69 | 68 | <ControllerProvider ctor={TestController} source={instance}>
|
70 | 69 | <DisplayRendered source={instance} buildWhen={buildWhenFn} />
|
71 | 70 | </ControllerProvider>,
|
72 | 71 | )
|
73 |
| - await act(async () => { |
74 |
| - asyncDelay(500) |
| 72 | + act(() => { |
75 | 73 | instance.inc()
|
76 |
| - asyncDelay(500) |
77 |
| - instance.inc() |
78 |
| - asyncDelay(500) |
| 74 | + }) |
| 75 | + act(() => { |
79 | 76 | instance.inc()
|
80 |
| - asyncDelay(500) |
| 77 | + }) |
| 78 | + act(() => { |
81 | 79 | instance.inc()
|
82 |
| - asyncDelay(500) |
| 80 | + }) |
| 81 | + act(() => { |
83 | 82 | instance.inc()
|
84 | 83 | })
|
85 |
| - await waitFor(() => { |
86 |
| - expect(buildWhenFn).toHaveBeenCalledTimes(5) |
87 |
| - expect(buildWhenFn.mock.calls[0][0]).toBe(0) |
88 |
| - expect(buildWhenFn.mock.calls[0][1]).toBe(1) |
89 |
| - expect(buildWhenFn.mock.calls[1][0]).toBe(1) |
90 |
| - expect(buildWhenFn.mock.calls[1][1]).toBe(2) |
91 |
| - expect(buildWhenFn.mock.calls[2][0]).toBe(2) |
92 |
| - expect(buildWhenFn.mock.calls[2][1]).toBe(3) |
93 |
| - expect(buildWhenFn.mock.calls[3][0]).toBe(3) |
94 |
| - expect(buildWhenFn.mock.calls[3][1]).toBe(4) |
95 |
| - expect(buildWhenFn.mock.calls[4][0]).toBe(4) |
96 |
| - expect(buildWhenFn.mock.calls[4][1]).toBe(5) |
97 |
| - const rendered = getByTestId(container, 'text') |
98 |
| - const renderedText = rendered.textContent |
99 |
| - const expectedText = '0' |
100 |
| - expect(renderedText).toBe(expectedText) |
| 84 | + act(() => { |
| 85 | + instance.inc() |
101 | 86 | })
|
| 87 | + |
| 88 | + expect(buildWhenFn).toHaveBeenCalledTimes(5) |
| 89 | + expect(buildWhenFn.mock.calls[0][0]).toBe(0) |
| 90 | + expect(buildWhenFn.mock.calls[0][1]).toBe(1) |
| 91 | + expect(buildWhenFn.mock.calls[1][0]).toBe(1) |
| 92 | + expect(buildWhenFn.mock.calls[1][1]).toBe(2) |
| 93 | + expect(buildWhenFn.mock.calls[2][0]).toBe(2) |
| 94 | + expect(buildWhenFn.mock.calls[2][1]).toBe(3) |
| 95 | + expect(buildWhenFn.mock.calls[3][0]).toBe(3) |
| 96 | + expect(buildWhenFn.mock.calls[3][1]).toBe(4) |
| 97 | + expect(buildWhenFn.mock.calls[4][0]).toBe(4) |
| 98 | + expect(buildWhenFn.mock.calls[4][1]).toBe(5) |
| 99 | + const rendered = getByTestId(container, 'text') |
| 100 | + const renderedText = rendered.textContent |
| 101 | + const expectedText = '0' |
| 102 | + expect(renderedText).toBe(expectedText) |
102 | 103 | })
|
103 | 104 |
|
104 |
| -it('rerender on state changed', async () => { |
| 105 | +it('rerender on state changed', () => { |
105 | 106 | const onRerender = jest.fn((state: number) => state)
|
106 | 107 | const instance = new TestController()
|
107 | 108 | const { container } = render(
|
108 | 109 | <ControllerProvider ctor={TestController} source={instance}>
|
109 | 110 | <DisplayRendered source={instance} callback={onRerender} />
|
110 | 111 | </ControllerProvider>,
|
111 | 112 | )
|
112 |
| - const rendered = getByTestId(container, 'text') |
113 |
| - const renderedText = rendered.textContent |
114 |
| - const expectedText = '0' |
| 113 | + let rendered = getByTestId(container, 'text') |
| 114 | + let renderedText = rendered.textContent |
| 115 | + let expectedText = '0' |
115 | 116 | expect(renderedText).toBe(expectedText)
|
116 |
| - await act(async () => { |
117 |
| - await asyncDelay(500) |
118 |
| - instance.inc() |
119 |
| - await asyncDelay(500) |
| 117 | + |
| 118 | + act(() => { |
120 | 119 | instance.inc()
|
121 |
| - await asyncDelay(500) |
| 120 | + }) |
| 121 | + rendered = getByTestId(container, 'text') |
| 122 | + renderedText = rendered.textContent |
| 123 | + expectedText = '1' |
| 124 | + expect(renderedText).toBe(expectedText) |
| 125 | + |
| 126 | + act(() => { |
122 | 127 | instance.inc()
|
123 |
| - await asyncDelay(500) |
| 128 | + }) |
| 129 | + rendered = getByTestId(container, 'text') |
| 130 | + renderedText = rendered.textContent |
| 131 | + expectedText = '2' |
| 132 | + expect(renderedText).toBe(expectedText) |
| 133 | + |
| 134 | + act(() => { |
124 | 135 | instance.inc()
|
125 |
| - await asyncDelay(500) |
| 136 | + }) |
| 137 | + rendered = getByTestId(container, 'text') |
| 138 | + renderedText = rendered.textContent |
| 139 | + expectedText = '3' |
| 140 | + expect(renderedText).toBe(expectedText) |
| 141 | + |
| 142 | + act(() => { |
126 | 143 | instance.inc()
|
127 | 144 | })
|
128 |
| - await waitFor(() => { |
129 |
| - const rendered = getByTestId(container, 'text') |
130 |
| - const renderedText = rendered.textContent |
131 |
| - const expectedText = '5' |
132 |
| - expect(renderedText).toBe(expectedText) |
133 |
| - expect(onRerender).toHaveBeenCalledTimes(6) |
134 |
| - expect(onRerender.mock.calls[0][0]).toBe(0) |
135 |
| - expect(onRerender.mock.calls[1][0]).toBe(1) |
136 |
| - expect(onRerender.mock.calls[2][0]).toBe(2) |
137 |
| - expect(onRerender.mock.calls[3][0]).toBe(3) |
138 |
| - expect(onRerender.mock.calls[4][0]).toBe(4) |
139 |
| - expect(onRerender.mock.calls[5][0]).toBe(5) |
| 145 | + rendered = getByTestId(container, 'text') |
| 146 | + renderedText = rendered.textContent |
| 147 | + expectedText = '4' |
| 148 | + expect(renderedText).toBe(expectedText) |
| 149 | + |
| 150 | + act(() => { |
| 151 | + instance.inc() |
140 | 152 | })
|
| 153 | + rendered = getByTestId(container, 'text') |
| 154 | + renderedText = rendered.textContent |
| 155 | + expectedText = '5' |
| 156 | + expect(renderedText).toBe(expectedText) |
| 157 | + |
| 158 | + expect(onRerender).toHaveBeenCalledTimes(6) |
| 159 | + expect(onRerender.mock.calls[0][0]).toBe(0) |
| 160 | + expect(onRerender.mock.calls[1][0]).toBe(1) |
| 161 | + expect(onRerender.mock.calls[2][0]).toBe(2) |
| 162 | + expect(onRerender.mock.calls[3][0]).toBe(3) |
| 163 | + expect(onRerender.mock.calls[4][0]).toBe(4) |
| 164 | + expect(onRerender.mock.calls[5][0]).toBe(5) |
141 | 165 | })
|
142 | 166 |
|
143 |
| -it('specified state compare respected', async () => { |
| 167 | +it('specified state compare respected', () => { |
144 | 168 | const stateCompareFn = jest.fn((prev, curr) => prev !== curr)
|
145 | 169 | const instance = new TestController()
|
146 | 170 | const { container } = render(
|
147 | 171 | <ControllerProvider ctor={TestController} source={instance}>
|
148 | 172 | <DisplayRendered source={instance} stateComp={stateCompareFn} />
|
149 | 173 | </ControllerProvider>,
|
150 | 174 | )
|
151 |
| - const rendered = getByTestId(container, 'text') |
152 |
| - const renderedText = rendered.textContent |
153 |
| - const expectedText = '0' |
| 175 | + let rendered = getByTestId(container, 'text') |
| 176 | + let renderedText = rendered.textContent |
| 177 | + let expectedText = '0' |
154 | 178 | expect(renderedText).toBe(expectedText)
|
155 | 179 |
|
156 |
| - await act(async () => { |
157 |
| - await asyncDelay(500) |
158 |
| - instance.inc() |
159 |
| - await asyncDelay(500) |
| 180 | + act(() => { |
160 | 181 | instance.inc()
|
161 |
| - await asyncDelay(500) |
| 182 | + }) |
| 183 | + rendered = getByTestId(container, 'text') |
| 184 | + renderedText = rendered.textContent |
| 185 | + expectedText = '0' |
| 186 | + expect(renderedText).toBe(expectedText) |
| 187 | + |
| 188 | + act(() => { |
162 | 189 | instance.inc()
|
163 |
| - await asyncDelay(500) |
| 190 | + }) |
| 191 | + rendered = getByTestId(container, 'text') |
| 192 | + renderedText = rendered.textContent |
| 193 | + expectedText = '0' |
| 194 | + expect(renderedText).toBe(expectedText) |
| 195 | + |
| 196 | + act(() => { |
164 | 197 | instance.inc()
|
165 | 198 | })
|
166 |
| - await waitFor(() => { |
167 |
| - expect(stateCompareFn).toHaveBeenCalledTimes(4) |
168 |
| - expect(stateCompareFn.mock.calls[0][0]).toBe(0) |
169 |
| - expect(stateCompareFn.mock.calls[0][1]).toBe(1) |
170 |
| - expect(stateCompareFn.mock.calls[1][0]).toBe(0) |
171 |
| - expect(stateCompareFn.mock.calls[1][1]).toBe(2) |
172 |
| - expect(stateCompareFn.mock.calls[2][0]).toBe(0) |
173 |
| - expect(stateCompareFn.mock.calls[2][1]).toBe(3) |
174 |
| - expect(stateCompareFn.mock.calls[3][0]).toBe(0) |
175 |
| - expect(stateCompareFn.mock.calls[3][1]).toBe(4) |
176 |
| - const rendered = getByTestId(container, 'text') |
177 |
| - const renderedText = rendered.textContent |
178 |
| - const expectedText = '0' |
179 |
| - expect(renderedText).toBe(expectedText) |
| 199 | + rendered = getByTestId(container, 'text') |
| 200 | + renderedText = rendered.textContent |
| 201 | + expectedText = '0' |
| 202 | + expect(renderedText).toBe(expectedText) |
| 203 | + |
| 204 | + act(() => { |
| 205 | + instance.inc() |
180 | 206 | })
|
| 207 | + rendered = getByTestId(container, 'text') |
| 208 | + renderedText = rendered.textContent |
| 209 | + expectedText = '0' |
| 210 | + expect(renderedText).toBe(expectedText) |
| 211 | + |
| 212 | + expect(stateCompareFn).toHaveBeenCalledTimes(4) |
| 213 | + expect(stateCompareFn.mock.calls[0][0]).toBe(0) |
| 214 | + expect(stateCompareFn.mock.calls[0][1]).toBe(1) |
| 215 | + expect(stateCompareFn.mock.calls[1][0]).toBe(0) |
| 216 | + expect(stateCompareFn.mock.calls[1][1]).toBe(2) |
| 217 | + expect(stateCompareFn.mock.calls[2][0]).toBe(0) |
| 218 | + expect(stateCompareFn.mock.calls[2][1]).toBe(3) |
| 219 | + expect(stateCompareFn.mock.calls[3][0]).toBe(0) |
| 220 | + expect(stateCompareFn.mock.calls[3][1]).toBe(4) |
181 | 221 | })
|
0 commit comments