Skip to content

Commit d2ea95b

Browse files
committed
tests for rapid yielding iterables value batching for useAsyncIter and <Iterate>
1 parent 679cb23 commit d2ea95b

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

spec/tests/Iterate.spec.tsx

+36
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,42 @@ describe('`Iterate` component', () => {
631631
expect(channelReturnSpy).toHaveBeenCalledOnce();
632632
}
633633
});
634+
635+
it(
636+
gray(
637+
'When given a rapid yielding iterable, consecutive values are batched into a single render that takes only the last value'
638+
),
639+
async () => {
640+
const iter = (async function* () {
641+
yield* ['a', 'b', 'c'];
642+
})();
643+
let timesRerendered = 0;
644+
let lastRenderFnInput: undefined | IterationResult<string>;
645+
646+
const rendered = render(
647+
<Iterate value={iter}>
648+
{next => {
649+
timesRerendered++;
650+
lastRenderFnInput = next;
651+
return <div id="test-created-elem">Render count: {timesRerendered}</div>;
652+
}}
653+
</Iterate>
654+
);
655+
656+
await act(() => {});
657+
658+
expect(lastRenderFnInput).toStrictEqual({
659+
value: 'c',
660+
pendingFirst: false,
661+
done: true,
662+
error: undefined,
663+
});
664+
expect(timesRerendered).toStrictEqual(2);
665+
expect(rendered.container.innerHTML).toStrictEqual(
666+
'<div id="test-created-elem">Render count: 2</div>'
667+
);
668+
}
669+
);
634670
});
635671

636672
const simulatedError = new Error('🚨 Simulated Error 🚨');

spec/tests/useAsyncIter.spec.ts

+27
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,33 @@ describe('`useAsyncIter` hook', () => {
444444
expect(channelReturnSpy).toHaveBeenCalledOnce();
445445
}
446446
});
447+
448+
it(
449+
gray(
450+
'When given a rapid yielding iterable, consecutive values are batched into a single render that takes only the last value'
451+
),
452+
async () => {
453+
let timesRerendered = 0;
454+
const iter = (async function* () {
455+
yield* ['a', 'b', 'c'];
456+
})();
457+
458+
const renderedHook = renderHook(() => {
459+
timesRerendered++;
460+
return useAsyncIter(iter);
461+
});
462+
463+
await act(() => {});
464+
465+
expect(timesRerendered).toStrictEqual(2);
466+
expect(renderedHook.result.current).toStrictEqual({
467+
value: 'c',
468+
pendingFirst: false,
469+
done: true,
470+
error: undefined,
471+
});
472+
}
473+
);
447474
});
448475

449476
const simulatedError = new Error('🚨 Simulated Error 🚨');

0 commit comments

Comments
 (0)