Skip to content

Commit 5b61eea

Browse files
committed
feat(react-query): add unit test for useInfiniteQuery
1 parent 2d7495b commit 5b61eea

File tree

3 files changed

+153
-7
lines changed

3 files changed

+153
-7
lines changed

packages/openapi-react-query/test/fixtures/api.d.ts

+52
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,58 @@
44
*/
55

66
export interface paths {
7+
"/paginated-data": {
8+
parameters: {
9+
query?: never;
10+
header?: never;
11+
path?: never;
12+
cookie?: never;
13+
};
14+
get: {
15+
parameters: {
16+
query: {
17+
limit: number;
18+
};
19+
header?: never;
20+
path?: never;
21+
cookie?: never;
22+
};
23+
requestBody?: never;
24+
responses: {
25+
/** @description Successful response */
26+
200: {
27+
headers: {
28+
[name: string]: unknown;
29+
};
30+
content: {
31+
"application/json": {
32+
items?: number[];
33+
nextPage?: number;
34+
};
35+
};
36+
};
37+
/** @description Error response */
38+
500: {
39+
headers: {
40+
[name: string]: unknown;
41+
};
42+
content: {
43+
"application/json": {
44+
code?: number;
45+
message?: string;
46+
};
47+
};
48+
};
49+
};
50+
};
51+
put?: never;
52+
post?: never;
53+
delete?: never;
54+
options?: never;
55+
head?: never;
56+
patch?: never;
57+
trace?: never;
58+
};
759
"/comment": {
860
parameters: {
961
query?: never;

packages/openapi-react-query/test/fixtures/api.yaml

+33
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,39 @@ info:
33
title: Test Specification
44
version: "1.0"
55
paths:
6+
/paginated-data:
7+
get:
8+
parameters:
9+
- in: query
10+
name: limit
11+
required: true
12+
schema:
13+
type: integer
14+
responses:
15+
'200':
16+
description: Successful response
17+
content:
18+
application/json:
19+
schema:
20+
type: object
21+
properties:
22+
items:
23+
type: array
24+
items:
25+
type: integer
26+
nextPage:
27+
type: integer
28+
'500':
29+
description: Error response
30+
content:
31+
application/json:
32+
schema:
33+
type: object
34+
properties:
35+
code:
36+
type: integer
37+
message:
38+
type: string
639
/comment:
740
put:
841
requestBody:

packages/openapi-react-query/test/index.test.tsx

+68-7
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
import { afterAll, beforeAll, describe, expect, it } from "vitest";
2-
import { server, baseUrl, useMockRequestHandler } from "./fixtures/mock-server.js";
3-
import type { paths } from "./fixtures/api.js";
4-
import createClient from "../src/index.js";
5-
import createFetchClient from "openapi-fetch";
6-
import { fireEvent, render, renderHook, screen, waitFor, act } from "@testing-library/react";
71
import {
82
QueryClient,
93
QueryClientProvider,
4+
skipToken,
105
useQueries,
116
useQuery,
127
useSuspenseQuery,
13-
skipToken,
148
} from "@tanstack/react-query";
9+
import { act, fireEvent, render, renderHook, screen, waitFor } from "@testing-library/react";
10+
import createFetchClient from "openapi-fetch";
1511
import { Suspense, type ReactNode } from "react";
1612
import { ErrorBoundary } from "react-error-boundary";
13+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
14+
import createClient from "../src/index.js";
15+
import type { paths } from "./fixtures/api.js";
16+
import { baseUrl, server, useMockRequestHandler } from "./fixtures/mock-server.js";
1717

1818
type minimalGetPaths = {
1919
// Without parameters.
@@ -789,4 +789,65 @@ describe("client", () => {
789789
});
790790
});
791791
});
792+
describe("useInfiniteQuery", () => {
793+
it("should fetch data correctly with pagination", async () => {
794+
const fetchClient = createFetchClient<paths>({ baseUrl });
795+
const client = createClient(fetchClient);
796+
797+
useMockRequestHandler({
798+
baseUrl,
799+
method: "get",
800+
path: "/paginated-data",
801+
status: 200,
802+
body: { items: [1, 2, 3], nextPage: 1 },
803+
});
804+
805+
const { result } = renderHook(
806+
() => client.useInfiniteQuery("get", "/paginated-data", { params: { query: { limit: 3 } } }),
807+
{ wrapper },
808+
);
809+
810+
await waitFor(() => expect(result.current.isSuccess).toBe(true));
811+
812+
expect((result.current.data as any).pages[0]).toEqual({ items: [1, 2, 3], nextPage: 1 });
813+
814+
// Set up mock for second page
815+
useMockRequestHandler({
816+
baseUrl,
817+
method: "get",
818+
path: "/paginated-data",
819+
status: 200,
820+
body: { items: [4, 5, 6], nextPage: 2 },
821+
});
822+
823+
await result.current.fetchNextPage();
824+
825+
await waitFor(() => expect(result.current.isFetching).toBe(false));
826+
827+
expect((result.current.data as any).pages).toHaveLength(2);
828+
expect((result.current.data as any).pages[1]).toEqual({ items: [4, 5, 6], nextPage: 2 });
829+
});
830+
831+
it("should handle errors correctly", async () => {
832+
const fetchClient = createFetchClient<paths>({ baseUrl });
833+
const client = createClient(fetchClient);
834+
835+
useMockRequestHandler({
836+
baseUrl,
837+
method: "get",
838+
path: "/paginated-data",
839+
status: 500,
840+
body: { code: 500, message: "Internal Server Error" },
841+
});
842+
843+
const { result } = renderHook(
844+
() => client.useInfiniteQuery("get", "/paginated-data", { params: { query: { limit: 3 } } }),
845+
{ wrapper },
846+
);
847+
848+
await waitFor(() => expect(result.current.isError).toBe(true));
849+
850+
expect(result.current.error).toEqual({ code: 500, message: "Internal Server Error" });
851+
});
852+
});
792853
});

0 commit comments

Comments
 (0)