@hyper-fetch/react
Version:
React hooks and utils for the hyper-fetch
93 lines (73 loc) • 2.67 kB
text/typescript
import { act, waitFor } from "@testing-library/react";
import { createHttpMockingServer } from "@hyper-fetch/testing";
import { client, createRequest, renderUseSubmit, waitForRender } from "../../utils";
const { resetMocks, startServer, stopServer, mockRequest } = createHttpMockingServer();
describe("useSubmit [ Retry ]", () => {
let request = createRequest<{ response: null; payload: null }>({ method: "POST" });
beforeAll(() => {
startServer();
});
afterEach(() => {
resetMocks();
});
afterAll(() => {
stopServer();
});
beforeEach(() => {
vi.resetModules();
client.clear();
request = createRequest({ method: "POST" });
});
describe("when request retry attribute is set to false", () => {
it("should not retry request on failure", async () => {
const spy = vi.fn();
mockRequest(request, { status: 400, delay: 5 });
const response = renderUseSubmit(request.setRetry(0).setRetryTime(0));
act(() => {
response.result.current.onSubmitRequestStart(spy);
response.result.current.submit();
});
await waitForRender(150);
expect(spy).toHaveBeenCalledTimes(1);
});
});
describe("when request retry attribute is set to true", () => {
it("should retry request once", async () => {
const spy = vi.fn();
mockRequest(request, { status: 400, delay: 5 });
const response = renderUseSubmit(request.setRetry(1).setRetryTime(10));
act(() => {
response.result.current.onSubmitRequestStart(spy);
response.result.current.submit();
});
await waitForRender(150);
expect(spy).toHaveBeenCalledTimes(2);
});
it("should retry request twice", async () => {
const spy = vi.fn();
mockRequest(request, { status: 400, delay: 5 });
const response = renderUseSubmit(request.setRetry(2).setRetryTime(10));
act(() => {
response.result.current.onSubmitRequestStart(spy);
response.result.current.submit();
});
await waitForRender(150);
expect(spy).toHaveBeenCalledTimes(3);
});
it("should trigger retries with the config interval", async () => {
const time: number[] = [];
mockRequest(request, { status: 400, delay: 0 });
const response = renderUseSubmit(request.setRetry(1).setRetryTime(100));
act(() => {
response.result.current.onSubmitRequestStart(() => {
time.push(+new Date());
});
response.result.current.submit();
});
await waitFor(() => {
expect(time[1] - time[0]);
expect(time[1] - time[0]).toBeGreaterThan(99);
});
});
});
});