Skip to content

Commit f4b0782

Browse files
authored
chore: Add tests for publisher hooks (#5101)
1 parent 8c42f8d commit f4b0782

19 files changed

Lines changed: 799 additions & 99 deletions

static/js/publisher/hooks/__tests__/useBrand.test.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import { QueryClient, QueryClientProvider } from "react-query";
2+
import { http, HttpResponse } from "msw";
3+
import { setupServer } from "msw/node";
4+
import { renderHook, waitFor } from "@testing-library/react";
5+
6+
import useBrand from "../useBrand";
7+
8+
import type { ReactNode } from "react";
9+
10+
const queryClient = new QueryClient();
11+
12+
const createWrapper = () => {
13+
return ({ children }: { children: ReactNode }) => (
14+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
15+
);
16+
};
17+
18+
const brandResponse = {
19+
"account-id": "test-account-id",
20+
"created-at": "test-creation-date",
21+
"created-by": {
22+
"display-name": "John Doe",
23+
email: "john.doe@canonical.com",
24+
id: "test-user-id",
25+
username: "johndoe",
26+
validation: "unproven",
27+
},
28+
"modified-at": null,
29+
"modified-by": null,
30+
name: "Test brand name",
31+
};
32+
33+
const handlers = [
34+
http.get("/api/store/test-id-success/brand", () => {
35+
return HttpResponse.json({
36+
data: brandResponse,
37+
success: true,
38+
});
39+
}),
40+
http.get("/api/store/test-id-fail/brand", () => {
41+
return HttpResponse.json({
42+
data: {},
43+
message: "Unable to fetch brand data",
44+
success: false,
45+
});
46+
}),
47+
http.get("/api/store/test-id-error/brand", () => {
48+
return new HttpResponse(null, { status: 500 });
49+
}),
50+
];
51+
52+
const server = setupServer(...handlers);
53+
54+
beforeAll(() => {
55+
server.listen();
56+
});
57+
58+
afterEach(() => {
59+
server.resetHandlers();
60+
queryClient.clear();
61+
});
62+
63+
afterAll(() => {
64+
server.close();
65+
});
66+
67+
describe("useBrand", () => {
68+
test("returns brand data if request successful", async () => {
69+
const { result } = renderHook(() => useBrand("test-id-success"), {
70+
wrapper: createWrapper(),
71+
});
72+
73+
await waitFor(() => result.current.isSuccess);
74+
75+
await waitFor(() => {
76+
expect(result.current.data).toEqual(brandResponse);
77+
});
78+
});
79+
80+
test("returns no data if the request fails", async () => {
81+
const { result } = renderHook(() => useBrand("test-id-fail"), {
82+
wrapper: createWrapper(),
83+
});
84+
85+
await waitFor(() => result.current.isSuccess);
86+
87+
await waitFor(() => {
88+
expect(result.current.data).toBeUndefined();
89+
});
90+
});
91+
92+
test("returns no data if the request is an error", async () => {
93+
const { result } = renderHook(() => useBrand("test-id-error"), {
94+
wrapper: createWrapper(),
95+
});
96+
97+
await waitFor(() => result.current.isError);
98+
99+
await waitFor(() => {
100+
expect(result.current.data).toBeUndefined();
101+
});
102+
});
103+
});
Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,75 @@
1-
import * as ReactQuery from "react-query";
2-
import { renderHook } from "@testing-library/react";
1+
import { QueryClient, QueryClientProvider } from "react-query";
2+
import { http, HttpResponse } from "msw";
3+
import { setupServer } from "msw/node";
4+
import { renderHook, waitFor } from "@testing-library/react";
35

46
import { useInvites } from "../index";
57

8+
import type { ReactNode } from "react";
9+
10+
const queryClient = new QueryClient();
11+
12+
const createWrapper = () => {
13+
return ({ children }: { children: ReactNode }) => (
14+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
15+
);
16+
};
17+
18+
const invitesResponse = [
19+
{
20+
email: "john.doe@canonical.com",
21+
"expiration-date": "2025-04-13T12:40:55Z",
22+
roles: ["admin"],
23+
status: "Expired",
24+
},
25+
];
26+
27+
const handlers = [
28+
http.get("/api/store/test-id-success/invites", () => {
29+
return HttpResponse.json(invitesResponse);
30+
}),
31+
http.get("/api/store/test-id-error/invites", () => {
32+
return HttpResponse.error();
33+
}),
34+
];
35+
36+
const server = setupServer(...handlers);
37+
38+
beforeAll(() => {
39+
server.listen();
40+
});
41+
42+
afterEach(() => {
43+
server.resetHandlers();
44+
queryClient.clear();
45+
});
46+
47+
afterAll(() => {
48+
server.close();
49+
});
50+
651
describe("useInvites", () => {
7-
test("Calls useQuery", () => {
8-
jest.spyOn(ReactQuery, "useQuery").mockImplementation(jest.fn());
9-
renderHook(() => useInvites("storeId"));
10-
expect(ReactQuery.useQuery).toHaveBeenCalled();
52+
test("returns invites data", async () => {
53+
const { result } = renderHook(() => useInvites("test-id-success"), {
54+
wrapper: createWrapper(),
55+
});
56+
57+
await waitFor(() => result.current.isSuccess);
58+
59+
await waitFor(() => {
60+
expect(result.current.data).toEqual(invitesResponse);
61+
});
62+
});
63+
64+
test("returns no data if error", async () => {
65+
const { result } = renderHook(() => useInvites("test-id-error"), {
66+
wrapper: createWrapper(),
67+
});
68+
69+
await waitFor(() => result.current.isError);
70+
71+
await waitFor(() => {
72+
expect(result.current.data).toBeUndefined();
73+
});
1174
});
1275
});

static/js/publisher/hooks/__tests__/useModels.test.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { QueryClient, QueryClientProvider } from "react-query";
2+
import { renderHook, waitFor } from "@testing-library/react";
3+
import { http, HttpResponse } from "msw";
4+
import { setupServer } from "msw/node";
5+
6+
import useModels from "../useModels";
7+
8+
import type { ReactNode } from "react";
9+
10+
const queryClient = new QueryClient();
11+
12+
const createWrapper = () => {
13+
return ({ children }: { children: ReactNode }) => (
14+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
15+
);
16+
};
17+
18+
const modelsResponse = [
19+
{
20+
"api-key": "test-api-key",
21+
"brand-account-id": "test-brand-acount-id",
22+
"created-at": "2023-09-05T11:55:53.732366",
23+
"created-by": {
24+
"display-name": "John Doe",
25+
email: "john.doe@canonical.com",
26+
id: "test-id",
27+
username: "johndoe",
28+
validation: "unproven",
29+
},
30+
"modified-at": null,
31+
"modified-by": null,
32+
name: "test-model-name",
33+
series: "1",
34+
},
35+
];
36+
37+
const handlers = [
38+
http.get("/api/store/test-brand-id/models", () => {
39+
return HttpResponse.json({
40+
data: modelsResponse,
41+
message: "",
42+
success: true,
43+
});
44+
}),
45+
http.get("/api/store/test-brand-id/models", () => {
46+
return HttpResponse.json({
47+
data: [],
48+
message: "Unable to fetch models",
49+
success: false,
50+
});
51+
}),
52+
http.get("/api/store/test-brand-id/models", () => {
53+
return HttpResponse.error();
54+
}),
55+
];
56+
57+
const server = setupServer(...handlers);
58+
59+
beforeAll(() => {
60+
server.listen();
61+
});
62+
63+
afterEach(() => {
64+
server.resetHandlers();
65+
queryClient.clear();
66+
});
67+
68+
afterAll(() => {
69+
server.close();
70+
});
71+
72+
describe("useModels", () => {
73+
test("returns models data", async () => {
74+
const { result } = renderHook(() => useModels("test-brand-id"), {
75+
wrapper: createWrapper(),
76+
});
77+
78+
await waitFor(() => result.current.isSuccess);
79+
80+
await waitFor(() => {
81+
expect(result.current.data).toEqual(modelsResponse);
82+
});
83+
});
84+
85+
test("returns no data if request fails", async () => {
86+
const { result } = renderHook(() => useModels("test-brand-id"), {
87+
wrapper: createWrapper(),
88+
});
89+
90+
await waitFor(() => result.current.isSuccess);
91+
92+
await waitFor(() => {
93+
expect(result.current.data).toBeUndefined();
94+
});
95+
});
96+
97+
test("returns no data if error", async () => {
98+
const { result } = renderHook(() => useModels("test-brand-id"), {
99+
wrapper: createWrapper(),
100+
});
101+
102+
await waitFor(() => result.current.isError);
103+
104+
await waitFor(() => {
105+
expect(result.current.data).toBeUndefined();
106+
});
107+
});
108+
});

static/js/publisher/hooks/__tests__/usePolicies.test.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)