Skip to content

Commit 587da5e

Browse files
committed
Add useSerial hook
1 parent e6ab6b1 commit 587da5e

3 files changed

Lines changed: 158 additions & 0 deletions

File tree

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
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 useSerialLog from "../useSerialLog";
7+
8+
import type { ReactNode } from "react";
9+
10+
const queryClient = new QueryClient({
11+
defaultOptions: {
12+
queries: {
13+
retry: false,
14+
},
15+
},
16+
});
17+
18+
const createWrapper = () => {
19+
return ({ children }: { children: ReactNode }) => (
20+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
21+
);
22+
};
23+
24+
const serialLogData = [
25+
{
26+
"brand-id": "test-brand",
27+
"created-at": "2023-09-05T11:55:53.732366",
28+
"model-name": "test-model",
29+
serial: "test-serial",
30+
"serial-assertion": "test-serial-assertion",
31+
"serial-sign-key-sha3-384": "test-sha",
32+
},
33+
];
34+
35+
const handlers = [
36+
http.get(
37+
"/api/store/test-brand/models/test-model/serial/test-serial/serial-log",
38+
() => {
39+
return HttpResponse.json({
40+
data: serialLogData,
41+
message: "",
42+
success: true,
43+
});
44+
},
45+
),
46+
http.get(
47+
"/api/store/test-brand-fail/models/test-model/serial/test-serial/serial-log",
48+
() => {
49+
return HttpResponse.json({
50+
data: [],
51+
message: "There was a problem fetching the serial log",
52+
success: false,
53+
});
54+
},
55+
),
56+
http.get(
57+
"/api/store/test-brand-error/models/test-model/serial/test-serial/serial-log",
58+
() => {
59+
return HttpResponse.error();
60+
},
61+
),
62+
];
63+
64+
const server = setupServer(...handlers);
65+
66+
beforeAll(() => {
67+
server.listen();
68+
});
69+
70+
afterEach(() => {
71+
server.resetHandlers();
72+
queryClient.clear();
73+
});
74+
75+
afterAll(() => {
76+
server.close();
77+
});
78+
79+
describe("useSerialLog", () => {
80+
test("returns serial log data", async () => {
81+
const { result } = renderHook(
82+
() => useSerialLog("test-brand", "test-model", "test-serial"),
83+
{
84+
wrapper: createWrapper(),
85+
},
86+
);
87+
88+
await waitFor(() => {
89+
expect(result.current.isSuccess).toBe(true);
90+
});
91+
92+
expect(result.current.data).toEqual(serialLogData);
93+
});
94+
95+
test("returns error if request fails", async () => {
96+
const { result } = renderHook(
97+
() => useSerialLog("test-brand-fail", "test-model", "test-serial"),
98+
{
99+
wrapper: createWrapper(),
100+
},
101+
);
102+
103+
await waitFor(() => {
104+
expect(result.current.isError).toBe(true);
105+
});
106+
107+
expect(result.current.data).toBeUndefined();
108+
});
109+
110+
test("returns error if network error", async () => {
111+
const { result } = renderHook(
112+
() => useSerialLog("test-brand-error", "test-model", "test-serial"),
113+
{
114+
wrapper: createWrapper(),
115+
},
116+
);
117+
118+
await waitFor(() => {
119+
expect(result.current.isError).toBe(true);
120+
});
121+
122+
expect(result.current.data).toBeUndefined();
123+
});
124+
});

static/js/publisher/hooks/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import useSortTableData from "./useSortTableData";
1717
import useAccountKeys from "./useAccountKeys";
1818
import useRemodels from "./useRemodels";
1919
import useSerialLogs from "./useSerialLogs";
20+
import useSerialLog from "./useSerialLog";
2021

2122
export {
2223
useValidationSets,
@@ -38,4 +39,5 @@ export {
3839
useAccountKeys,
3940
useRemodels,
4041
useSerialLogs,
42+
useSerialLog,
4143
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { useQuery, UseQueryResult } from "react-query";
2+
import type { SerialLog } from "../types/shared";
3+
4+
const useSerialLog = (
5+
brandId: string | undefined,
6+
modelId: string | undefined,
7+
serial: string | undefined,
8+
): UseQueryResult<SerialLog[], Error> => {
9+
return useQuery<SerialLog[], Error>({
10+
queryKey: ["serialLog", brandId, modelId, serial],
11+
queryFn: async () => {
12+
const response = await fetch(
13+
`/api/store/${brandId}/models/${modelId}/serial/${serial}/serial-log`,
14+
);
15+
16+
if (!response.ok) {
17+
throw new Error("There was a problem fetching the serial log");
18+
}
19+
20+
const data = await response.json();
21+
22+
if (!data.success) {
23+
throw new Error(data.message);
24+
}
25+
26+
return data.data;
27+
},
28+
enabled: !!brandId,
29+
});
30+
};
31+
32+
export default useSerialLog;

0 commit comments

Comments
 (0)