Skip to content

Commit cf16d8f

Browse files
committed
adding test
1 parent 0331f33 commit cf16d8f

File tree

2 files changed

+45
-10
lines changed

2 files changed

+45
-10
lines changed

src/LiveComponent/assets/src/live_controller.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ export default class extends Controller implements LiveController {
5757

5858
/** Actions that are waiting to be executed */
5959
pendingActions: Array<{ name: string, args: Record<string, string> }> = [];
60-
/** Does at least one updated model requier a re-render? */
61-
doModelsRequireReRender = false;
60+
/** Has anything requested a re-render? */
61+
isRerenderRequested = false;
6262

6363
/**
6464
* Current "timeout" before the pending request should be sent.
@@ -220,7 +220,7 @@ export default class extends Controller implements LiveController {
220220
}
221221

222222
$render() {
223-
this.doModelsRequireReRender = true;
223+
this.isRerenderRequested = true;
224224
this.#startPendingRequest();
225225
}
226226

@@ -383,7 +383,7 @@ export default class extends Controller implements LiveController {
383383
this.#clearRequestDebounceTimeout();
384384
this.requestDebounceTimeout = window.setTimeout(() => {
385385
this.requestDebounceTimeout = null;
386-
this.doModelsRequireReRender = true;
386+
this.isRerenderRequested = true;
387387
this.#startPendingRequest();
388388
}, debounce);
389389
}
@@ -393,7 +393,7 @@ export default class extends Controller implements LiveController {
393393
* Makes a request to the server with all pending actions/updates, if any.
394394
*/
395395
#startPendingRequest(): void {
396-
if (!this.backendRequest && (this.pendingActions.length > 0 || this.doModelsRequireReRender)) {
396+
if (!this.backendRequest && (this.pendingActions.length > 0 || this.isRerenderRequested)) {
397397
this.#makeRequest();
398398
}
399399
}
@@ -406,7 +406,7 @@ export default class extends Controller implements LiveController {
406406

407407
const actions = this.pendingActions;
408408
this.pendingActions = [];
409-
this.doModelsRequireReRender = false;
409+
this.isRerenderRequested = false;
410410
// we're making a request NOW, so no need to make another one after debouncing
411411
this.#clearRequestDebounceTimeout();
412412

@@ -854,8 +854,6 @@ export default class extends Controller implements LiveController {
854854
}
855855

856856
const timer = setInterval(() => {
857-
// TODO "schedule" the poll
858-
859857
callback();
860858
}, duration);
861859
this.pollingIntervals.push(timer);

src/LiveComponent/assets/test/controller/poll.test.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import { shutdownTest, createTest, initComponent } from '../tools';
1313
import { waitFor } from '@testing-library/dom';
14+
import userEvent from '@testing-library/user-event';
1415

1516
describe('LiveController polling Tests', () => {
1617
afterEach(() => {
@@ -111,8 +112,6 @@ describe('LiveController polling Tests', () => {
111112
});
112113
});
113114

114-
// check polling stops after disconnect
115-
116115
it('polling should stop if data-poll is removed', async () => {
117116
const test = await createTest({ keepPolling: true, renderCount: 0 }, (data: any) => `
118117
<div ${initComponent(data)} ${data.keepPolling ? 'data-poll="delay(500)|$render"' : ''}>
@@ -186,5 +185,43 @@ describe('LiveController polling Tests', () => {
186185
});
187186
});
188187

188+
it('waits to send the request if request is already happening', async () => {
189+
const test = await createTest({ renderCount: 0, name: 'Ryan' }, (data: any) => `
190+
<div ${initComponent(data, { debounce: 1 })} data-poll="delay(50)|$render">
191+
<input
192+
data-model="name"
193+
value="${data.name}"
194+
>
195+
196+
<span>Name: ${data.name}</span>
197+
<span>Render count: ${data.renderCount}</span>
198+
</div>
199+
`);
200+
201+
// First request, from typing (debouncing is set to 1ms)
202+
test.expectsAjaxCall('get')
203+
.expectSentData({ renderCount: 0, name: 'Ryan Weaver'})
204+
.serverWillChangeData((data: any) => {
205+
data.renderCount = 1;
206+
})
207+
.delayResponse(100)
208+
.init();
209+
210+
await userEvent.type(test.queryByDataModel('name'), ' Weaver');
211+
212+
setTimeout(() => {
213+
// first poll, should happen after 50 ms, but needs to wait the full 100
214+
test.expectsAjaxCall('get')
215+
.expectSentData({renderCount: 1, name: 'Ryan Weaver'})
216+
.serverWillChangeData((data: any) => {
217+
data.renderCount = 2;
218+
})
219+
.init();
220+
}, 75)
221+
222+
await waitFor(() => expect(test.element).toHaveTextContent('Render count: 1'));
223+
await waitFor(() => expect(test.element).toHaveTextContent('Render count: 2'));
224+
});
225+
189226
// TODO: test "batching" of requests between polling and any other re-render request
190227
});

0 commit comments

Comments
 (0)