Skip to content

Commit d6a1198

Browse files
committed
Write useQuery tests
1 parent 2b69f32 commit d6a1198

File tree

2 files changed

+88
-15
lines changed

2 files changed

+88
-15
lines changed

packages/openapi-react-query/biome.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
"$schema": "https://biomejs.dev/schemas/1.8.1/schema.json",
33
"extends": ["../../biome.json"],
44
"files": {
5-
"include": ["./src/", "./test/"],
6-
"ignore": ["**/fixtures/**/*"]
5+
"ignore": ["./test/fixtures/"]
76
},
87
"linter": {
98
"rules": {

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

+87-13
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ import { renderHook, waitFor } from "@testing-library/react";
77
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
88
import React, { type ReactNode } from "react";
99

10+
const queryClient = new QueryClient({
11+
defaultOptions: {
12+
queries: {
13+
retry: false,
14+
},
15+
},
16+
});
17+
18+
const wrapper = ({ children }: { children: ReactNode }) => (
19+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
20+
);
21+
1022
beforeAll(() => {
1123
server.listen({
1224
onUnhandledRequest: (request) => {
@@ -15,16 +27,13 @@ beforeAll(() => {
1527
});
1628
});
1729

18-
afterEach(() => server.resetHandlers());
30+
afterEach(() => {
31+
server.resetHandlers();
32+
queryClient.removeQueries();
33+
});
1934

2035
afterAll(() => server.close());
2136

22-
const queryClient = new QueryClient();
23-
24-
const wrapper = ({ children }: { children: ReactNode }) => (
25-
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
26-
);
27-
2837
describe("client", () => {
2938
it("generates all proper functions", () => {
3039
const fetchClient = createFetchClient<paths>({ baseUrl });
@@ -35,25 +44,90 @@ describe("client", () => {
3544
});
3645

3746
describe("useQuery", () => {
38-
it("should work", async () => {
47+
it("should resolve data properly and have error as null when successfull request", async () => {
3948
const fetchClient = createFetchClient<paths>({ baseUrl });
4049
const client = createClient(fetchClient);
4150

4251
useMockRequestHandler({
4352
baseUrl,
4453
method: "get",
45-
path: "/self",
54+
path: "/string-array",
4655
status: 200,
47-
body: { message: "OK" },
56+
body: ["one", "two", "three"],
4857
});
4958

50-
const { result } = renderHook(() => client.useQuery("get", "/self"), {
59+
const { result } = renderHook(() => client.useQuery("get", "/string-array"), {
5160
wrapper,
5261
});
5362

54-
await waitFor(() => expect(result.current.isSuccess).toBe(true));
63+
await waitFor(() => expect(result.current.isFetching).toBe(false));
5564

56-
expect(result.current.data).toEqual({ message: "OK" });
65+
const { data, error } = result.current;
66+
67+
// … is initially possibly undefined
68+
// @ts-expect-error
69+
expect(data[0]).toBe("one");
70+
expect(error).toBeNull();
71+
});
72+
73+
it("should resolve error properlly and have undefined data when failed request", async () => {
74+
const fetchClient = createFetchClient<paths>({ baseUrl });
75+
const client = createClient(fetchClient);
76+
77+
useMockRequestHandler({
78+
baseUrl,
79+
method: "get",
80+
path: "/string-array",
81+
status: 500,
82+
body: { code: 500, message: "Something went wrong" },
83+
});
84+
85+
const { result } = renderHook(() => client.useQuery("get", "/string-array"), {
86+
wrapper,
87+
});
88+
89+
await waitFor(() => expect(result.current.isFetching).toBe(false));
90+
91+
const { data, error } = result.current;
92+
93+
expect(error?.message).toBe("Something went wrong");
94+
expect(data).toBeUndefined();
95+
});
96+
97+
it("should infer correct data and error type", async () => {
98+
const fetchClient = createFetchClient<paths>({ baseUrl });
99+
const client = createClient(fetchClient);
100+
101+
const { result } = renderHook(() => client.useQuery("get", "/string-array"), {
102+
wrapper,
103+
});
104+
105+
const { data, error } = result.current;
106+
107+
expectTypeOf(data).toEqualTypeOf<string[] | undefined>();
108+
expectTypeOf(error).toEqualTypeOf<{ code: number; message: string } | null>();
109+
});
110+
111+
describe("params", () => {
112+
it("typechecks", async () => {
113+
const fetchClient = createFetchClient<paths>({ baseUrl });
114+
const client = createClient(fetchClient);
115+
116+
useMockRequestHandler({
117+
baseUrl,
118+
method: "get",
119+
path: "/blogposts/:post_id",
120+
status: 200,
121+
body: { message: "OK" },
122+
});
123+
124+
// expect error on missing 'params'
125+
// @ts-expect-error
126+
const { result } = renderHook(() => client.useQuery("get", "/blogposts/{post_id}"), {
127+
wrapper,
128+
});
129+
await waitFor(() => expect(result.current.isSuccess).toBe(true));
130+
});
57131
});
58132
});
59133

0 commit comments

Comments
 (0)