Skip to content

Commit a86719a

Browse files
Add test for usage in component mount.
1 parent 466d095 commit a86719a

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

component.jsx

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import useAsyncQueue from "./dist/use-async-queue";
2+
import { useState, useEffect } from "react";
3+
4+
const makeTask = (id, delay) => {
5+
return {
6+
id,
7+
task: () => {
8+
return new Promise((resolve) =>
9+
setTimeout(() => {
10+
resolve(`${id} is done`);
11+
}, delay)
12+
);
13+
},
14+
};
15+
};
16+
17+
export const Component = () => {
18+
const [doneItems, setDoneItems] = useState([]);
19+
20+
const done = (d) => {
21+
setDoneItems((items) => [...items, d]);
22+
};
23+
24+
const { add, stats } = useAsyncQueue({ concurrency: 2, done });
25+
26+
useEffect(() => {
27+
add(makeTask(1, 100));
28+
add(makeTask(2, 200));
29+
add(makeTask(3, 300));
30+
}, [add]);
31+
const { numPending, numInFlight, numDone } = stats;
32+
33+
return (
34+
<>
35+
<span>pending: {numPending}</span>
36+
<span>inFlight: {numInFlight}</span>
37+
<span>done: {numDone}</span>
38+
<span>total: {numPending + numInFlight + numDone}</span>
39+
{doneItems.map((item) => (
40+
<li key={item.id}>item done - {item.id}</li>
41+
))}
42+
</>
43+
);
44+
};

use-async-queue.test.js renamed to use-async-queue.test.jsx

+26-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { renderHook, waitFor } from "@testing-library/react";
1+
import "@testing-library/jest-dom";
2+
import { renderHook, waitFor, render, screen } from "@testing-library/react";
23
import { StrictMode } from "react";
34
import { act } from "react";
45
import useAsyncQueue from "./dist/use-async-queue";
6+
import { Component } from "./component";
57

68
describe("useAsyncQueue", () => {
79
describe("real timers", () => {
@@ -279,13 +281,14 @@ describe("useAsyncQueue", () => {
279281
expect(result.current.stats.numInFlight).toBe(2);
280282
expect(inflight).toHaveBeenCalledTimes(2);
281283
expect(done).toHaveBeenCalledTimes(0);
284+
282285
jest.advanceTimersByTime(900);
283286
expect(done).not.toHaveBeenCalled();
284287
expect(result.current.stats.numInFlight).toBe(2);
285288
expect(result.current.stats.numPending).toBe(0);
286289
expect(result.current.stats.numDone).toBe(0);
287-
jest.advanceTimersByTime(100);
288290

291+
jest.advanceTimersByTime(100);
289292
await waitFor(() => {
290293
expect(done).toHaveBeenCalledTimes(2);
291294
expect(result.current.stats.numInFlight).toBe(0);
@@ -294,4 +297,25 @@ describe("useAsyncQueue", () => {
294297
});
295298
});
296299
});
300+
301+
describe("on mount", () => {
302+
it("should execute each task once", async () => {
303+
render(<Component />, {
304+
wrapper: StrictMode,
305+
});
306+
307+
expect(screen.getByText("total: 3"));
308+
await waitFor(() => {
309+
expect(screen.queryAllByText(/item done/)).toHaveLength(1);
310+
});
311+
await waitFor(() => {
312+
expect(screen.queryAllByText(/item done/)).toHaveLength(2);
313+
});
314+
await waitFor(() => {
315+
expect(screen.queryAllByText(/item done/)).toHaveLength(3);
316+
});
317+
expect(screen.queryAllByText(/item done/)).not.toHaveLength(4);
318+
expect(screen.getByText("total: 3"));
319+
});
320+
});
297321
});

0 commit comments

Comments
 (0)