/* eslint-disable react/jsx-fragments */
/* eslint-disable react/jsx-no-useless-fragment */
import { Fragment } from "react";
import type { HttpAdapterExtraType } from "@hyper-fetch/core";
import { Client } from "@hyper-fetch/core";
import { render, waitFor } from "@testing-library/react";
import type { UseFetchReturnType } from "hooks/use-fetch";
import { useFetch } from "hooks/use-fetch";
import type { UseSubmitReturnType } from "hooks/use-submit";
import { useSubmit } from "hooks/use-submit";
import { Provider } from "provider";
describe("Provider [ Hydration ]", () => {
const data = [1, 2, 3, 4, 5];
const extra: HttpAdapterExtraType = { headers: { "x-test": "test" } };
let client = new Client({
url: "http://localhost:3000",
});
let request = client.createRequest<{ response: any }>()({ endpoint: "/shared-endpoint" });
const hydrate = () => {
client.hydrate([
{
cacheKey: request.cacheKey,
cache: true,
cacheTime: Infinity,
scope: null,
staleTime: 1000,
timestamp: Date.now(),
response: {
data,
error: null,
status: 200,
extra,
success: true,
responseTimestamp: Date.now(),
requestTimestamp: Date.now(),
},
hydrated: true,
override: true,
},
]);
};
const Page = () => {
return ;
};
const App = ({ children }: { children?: React.ReactNode }) => {
return (
{children}
);
};
beforeEach(() => {
client.clear();
client = new Client({
url: "http://localhost:3000",
});
request = client.createRequest<{ response: any }>()({ endpoint: "/shared-endpoint" });
});
describe("given app is rendered on the Server", () => {
describe("when hydration data is passed down to the Provider", () => {
it("should hydrate the data for useFetch hook", async () => {
let useFetchResults: UseFetchReturnType | undefined;
hydrate();
const Children = () => {
useFetchResults = useFetch(request, { revalidate: false, disabled: true });
return ;
};
render(
,
{ hydrate: true },
);
await waitFor(() => {
expect(useFetchResults?.data).toStrictEqual(data);
expect(useFetchResults?.status).toBe(200);
expect(useFetchResults?.error).toBe(null);
expect(useFetchResults?.extra).toBe(extra);
expect(useFetchResults?.success).toBe(true);
});
});
it("should hydrate the data for useSubmit hook", async () => {
let useSubmitResults: UseSubmitReturnType | undefined;
hydrate();
const Children = () => {
useSubmitResults = useSubmit(request);
return ;
};
render(
,
{ hydrate: true },
);
await waitFor(() => {
expect(useSubmitResults?.data).toStrictEqual(data);
expect(useSubmitResults?.status).toBe(200);
expect(useSubmitResults?.error).toBe(null);
expect(useSubmitResults?.extra).toBe(extra);
});
});
});
});
describe("given app is rendered on the Client", () => {
describe("when hydration data is passed down to the Provider", () => {
it("should hydrate the data for useFetch hook", async () => {
let useFetchResults: UseFetchReturnType | undefined;
hydrate();
const Children = () => {
useFetchResults = useFetch(request);
return ;
};
render(
,
);
await waitFor(() => {
expect(useFetchResults?.data).toStrictEqual(data);
expect(useFetchResults?.status).toBe(200);
expect(useFetchResults?.error).toBe(null);
expect(useFetchResults?.extra).toBe(extra);
expect(useFetchResults?.success).toBe(true);
});
});
it("should hydrate the data for useSubmit hook", async () => {
let useSubmitResults: UseSubmitReturnType | undefined;
hydrate();
const Children = () => {
useSubmitResults = useSubmit(request);
return ;
};
render(
,
);
await waitFor(() => {
expect(useSubmitResults?.data).toStrictEqual(data);
expect(useSubmitResults?.status).toBe(200);
expect(useSubmitResults?.error).toBe(null);
expect(useSubmitResults?.extra).toBe(extra);
});
});
});
});
});