@hyper-fetch/react
Version:
React hooks and utils for the hyper-fetch
174 lines (146 loc) • 5.52 kB
text/typescript
import { act, waitFor } from "@testing-library/react";
import { createHttpMockingServer } from "@hyper-fetch/testing";
import { getRequestDispatcher, scopeKey } from "@hyper-fetch/core";
import { addQueueElement, client, createRequest, renderUseQueue } from "../../utils";
const { resetMocks, startServer, stopServer, mockRequest } = createHttpMockingServer();
describe("useQueue [ Resolve Queue Items ]", () => {
let request = createRequest({ method: "POST" });
beforeAll(() => {
startServer();
});
afterEach(() => {
resetMocks();
});
afterAll(() => {
stopServer();
});
beforeEach(() => {
vi.resetModules();
client.clear();
request = createRequest({ method: "POST" });
});
describe("given queue event contains class instances", () => {
describe("when the queue change event fires", () => {
it("should pass them through without transformation", async () => {
mockRequest(request);
const { result } = renderUseQueue(request);
act(() => {
addQueueElement(request, { stop: true });
});
await waitFor(() => {
expect(result.current.requests).toHaveLength(1);
expect(result.current.requests[0].request).toBe(request);
});
});
});
});
describe("given queue event contains JSON-serialized requests", () => {
describe("when the queue change event fires", () => {
it("should reconstruct JSON items into Request class instances", async () => {
mockRequest(request);
const [dispatcher] = getRequestDispatcher(request, "auto");
const queryKey = scopeKey(request.queryKey, request.scope);
dispatcher.stop(queryKey);
const { result } = renderUseQueue(request);
const json = request.toJSON();
act(() => {
dispatcher.events.emitQueueChanged({
queryKey,
stopped: true,
requests: [
{
requestId: "json-request-1",
request: json as any,
retries: 0,
timestamp: +new Date(),
stopped: false,
resolved: false,
},
],
});
});
await waitFor(() => {
expect(result.current.requests).toHaveLength(1);
expect(result.current.requests[0].requestId).toBe("json-request-1");
expect(result.current.requests[0].request).not.toBe(json);
expect(result.current.requests[0].request.endpoint).toBe(request.endpoint);
expect(result.current.requests[0].request.method).toBe(request.method);
});
});
it("should reconstruct JSON items from status change events", async () => {
mockRequest(request);
const [dispatcher] = getRequestDispatcher(request, "auto");
const queryKey = scopeKey(request.queryKey, request.scope);
dispatcher.stop(queryKey);
const { result } = renderUseQueue(request);
const json = request.toJSON();
act(() => {
dispatcher.events.emitQueueStatusChanged({
queryKey,
stopped: false,
requests: [
{
requestId: "json-status-1",
request: json as any,
retries: 0,
timestamp: +new Date(),
stopped: false,
resolved: false,
},
],
});
});
await waitFor(() => {
expect(result.current.requests).toHaveLength(1);
expect(result.current.requests[0].requestId).toBe("json-status-1");
expect(result.current.requests[0].request.endpoint).toBe(request.endpoint);
});
});
});
});
describe("given queue event contains a mix of class instances and JSON", () => {
describe("when the queue change event fires", () => {
it("should resolve JSON items while keeping class instances intact", async () => {
mockRequest(request);
const [dispatcher] = getRequestDispatcher(request, "auto");
const queryKey = scopeKey(request.queryKey, request.scope);
dispatcher.stop(queryKey);
const { result } = renderUseQueue(request);
const json = request.toJSON();
act(() => {
dispatcher.events.emitQueueChanged({
queryKey,
stopped: true,
requests: [
{
requestId: "class-instance-1",
request,
retries: 0,
timestamp: +new Date(),
stopped: false,
resolved: false,
},
{
requestId: "json-item-1",
request: json as any,
retries: 0,
timestamp: +new Date(),
stopped: false,
resolved: false,
},
],
});
});
await waitFor(() => {
expect(result.current.requests).toHaveLength(2);
const classItem = result.current.requests.find((r: any) => r.requestId === "class-instance-1");
const jsonItem = result.current.requests.find((r: any) => r.requestId === "json-item-1");
expect(classItem?.request).toBe(request);
expect(jsonItem?.request).not.toBe(json);
expect(jsonItem?.request.endpoint).toBe(request.endpoint);
expect(jsonItem?.request.method).toBe(request.method);
});
});
});
});
});