@hyper-fetch/react
Version:
React hooks and utils for the hyper-fetch
85 lines (69 loc) • 2.51 kB
text/typescript
import { act } from "@testing-library/react";
import { createHttpMockingServer } from "@hyper-fetch/testing";
import { testData, testLoading } from "../../shared";
import { client, createRequest, renderUseSubmit, waitForRender } from "../../utils";
const { resetMocks, startServer, stopServer, mockRequest } = createHttpMockingServer();
describe("useSubmit [ Queue ]", () => {
let request = createRequest({ method: "POST", queued: true });
beforeAll(() => {
startServer();
});
afterEach(() => {
resetMocks();
});
afterAll(() => {
stopServer();
});
beforeEach(() => {
vi.resetModules();
client.clear();
request = createRequest({ method: "POST", queued: true });
});
describe("given request is able to be queued", () => {
describe("when submitting request", () => {
it("should send requests one by one", async () => {
let count = 1;
const spy = vi.fn();
mockRequest(request, { data: count });
const response = renderUseSubmit(request);
act(() => {
response.result.current.onSubmitFinished(() => {
spy();
count += 1;
mockRequest(request, { data: count, delay: 50 });
});
response.result.current.submit();
response.result.current.submit();
response.result.current.submit();
response.result.current.submit();
});
await testData(1, response);
await testData(2, response);
await testData(3, response);
await testData(4, response);
expect(spy).toHaveBeenCalledTimes(4);
});
it("should start in loading mode when request in queue is ongoing", async () => {
mockRequest(request);
const previouslyRenderedHook = renderUseSubmit(request);
act(() => {
previouslyRenderedHook.result.current.submit();
});
await waitForRender();
const response = renderUseSubmit(request);
await testLoading(true, response);
});
it("should not start in loading mode when queue is paused", async () => {
mockRequest(request);
const previouslyRenderedHook = renderUseSubmit(request);
act(() => {
previouslyRenderedHook.result.current.submit();
client.submitDispatcher.stop(request.queryKey);
});
await waitForRender();
const response = renderUseSubmit(request);
await testLoading(false, response);
});
});
});
});