@hyper-fetch/react
Version:
React hooks and utils for the hyper-fetch
104 lines (88 loc) • 3.05 kB
text/typescript
import { waitFor, act } from "@testing-library/react";
import { createHttpMockingServer } from "@hyper-fetch/testing";
import { testErrorState, testSuccessState } from "../../shared";
import { client, createRequest, renderUseFetch, waitForRender } from "../../utils";
const { resetMocks, startServer, stopServer, mockRequest } = createHttpMockingServer();
describe("useFetch [ Offline ]", () => {
let request = createRequest({ offline: true });
beforeAll(() => {
startServer();
});
afterEach(() => {
resetMocks();
});
afterAll(() => {
stopServer();
});
beforeEach(() => {
vi.resetModules();
request = createRequest({ offline: true });
client.clear();
});
describe("when application is offline", () => {
it("should not refetch on offline", async () => {
const mock = mockRequest(request);
const response = renderUseFetch(request);
await testSuccessState(mock, response);
const spy = vi.spyOn(client.adapter, "fetch");
act(() => {
client.appManager.setOnline(false);
response.result.current.refetch();
});
expect(spy).toHaveBeenCalledTimes(0);
});
it("should finish request when coming back online", async () => {
client.appManager.setOnline(false);
const mock = mockRequest(request);
const response = renderUseFetch(request);
act(() => {
client.appManager.setOnline(true);
});
await testSuccessState(mock, response);
});
it("should refetch when coming back online", async () => {
const spy = vi.fn();
const mock = mockRequest(request);
const response = renderUseFetch(request, { refetchOnReconnect: true });
await testSuccessState(mock, response);
act(() => {
response.result.current.onRequestStart(spy);
client.appManager.setOnline(false);
client.appManager.setOnline(true);
});
await waitFor(() => {
expect(spy).toHaveBeenCalledTimes(1);
});
});
});
describe("when request offline attribute is set to true", () => {
it("should not emit offline error until request is finished", async () => {
const mock = mockRequest(request);
const response = renderUseFetch(request);
await waitForRender();
act(() => {
client.appManager.setOnline(false);
});
await waitForRender();
act(() => {
client.appManager.setOnline(true);
});
await testSuccessState(mock, response);
});
});
describe("when request offline attribute is set to false", () => {
it("should emit offline error until request is finished", async () => {
const mock = mockRequest(request, { status: 400 });
const response = renderUseFetch(request.setOffline(false));
await waitForRender();
act(() => {
client.appManager.setOnline(false);
});
await waitForRender();
act(() => {
client.appManager.setOnline(true);
});
await testErrorState(mock, response);
});
});
});