Skip to content

Commit ca3dc87

Browse files
committed
feat: Update useSerialLogs to accept URL params
1 parent 9755ea1 commit ca3dc87

4 files changed

Lines changed: 165 additions & 4 deletions

File tree

static/js/publisher/hooks/__tests__/useSerialLogs.test.tsx

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,72 @@ describe("useSerialLogs", () => {
9090
});
9191
});
9292

93+
test("returns serial logs data with pageSize param", async () => {
94+
const { result } = renderHook(
95+
() =>
96+
useSerialLogs("test-brand-id", "test-model", {
97+
pageSize: 10,
98+
}),
99+
{
100+
wrapper: createWrapper(),
101+
},
102+
);
103+
104+
await waitFor(() => {
105+
expect(result.current.isSuccess).toBe(true);
106+
});
107+
108+
expect(result.current.data).toEqual({
109+
data: serialLogsResponse,
110+
success: true,
111+
});
112+
});
113+
114+
test("returns serial logs data with startTime and endTime params", async () => {
115+
const { result } = renderHook(
116+
() =>
117+
useSerialLogs("test-brand-id", "test-model", {
118+
startTime: "2026-03-24T04:00:23.875000",
119+
endTime: "2026-03-28T04:00:23.875000",
120+
}),
121+
{
122+
wrapper: createWrapper(),
123+
},
124+
);
125+
126+
await waitFor(() => {
127+
expect(result.current.isSuccess).toBe(true);
128+
});
129+
130+
expect(result.current.data).toEqual({
131+
data: serialLogsResponse,
132+
success: true,
133+
});
134+
});
135+
136+
test("returns serial logs data with startTime, endTime and pageSize params", async () => {
137+
const { result } = renderHook(
138+
() =>
139+
useSerialLogs("test-brand-id", "test-model", {
140+
startTime: "2026-03-24T04:00:23.875000",
141+
endTime: "2026-03-28T04:00:23.875000",
142+
pageSize: 10,
143+
}),
144+
{
145+
wrapper: createWrapper(),
146+
},
147+
);
148+
149+
await waitFor(() => {
150+
expect(result.current.isSuccess).toBe(true);
151+
});
152+
153+
expect(result.current.data).toEqual({
154+
data: serialLogsResponse,
155+
success: true,
156+
});
157+
});
158+
93159
test("returns error if request fails", async () => {
94160
const { result } = renderHook(
95161
() => useSerialLogs("test-brand-id-fail", "test-model"),

static/js/publisher/hooks/useSerialLogs.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,35 @@ import type { SerialLogResponse, ApiResponse } from "../types/shared";
44
const useSerialLogs = (
55
brandId: string | undefined,
66
modelId: string | undefined,
7+
urlSearchParams?: {
8+
startTime?: string;
9+
endTime?: string;
10+
pageSize?: number;
11+
},
712
): UseQueryResult<ApiResponse<SerialLogResponse>, Error> => {
13+
const url = new URL(
14+
`/api/store/${brandId}/models/${modelId}/serial-log`,
15+
window.location.origin,
16+
);
17+
18+
if (urlSearchParams) {
19+
const { startTime, endTime, pageSize } = urlSearchParams;
20+
21+
if (startTime && endTime) {
22+
url.searchParams.set("start-time", startTime);
23+
url.searchParams.set("end-time", endTime);
24+
}
25+
26+
if (pageSize) {
27+
url.searchParams.set("page-size", pageSize.toString());
28+
}
29+
}
30+
831
return useQuery<ApiResponse<SerialLogResponse>, Error>({
9-
queryKey: ["serials", brandId, modelId],
32+
queryKey: ["serials", brandId, modelId, urlSearchParams],
1033
queryFn: async () => {
11-
const response = await fetch(
12-
`/api/store/${brandId}/models/${modelId}/serial-log`,
13-
);
34+
const enc = encodeURI(url.toString());
35+
const response = await fetch(enc);
1436
const responseData = await response.json();
1537

1638
return responseData;

tests/endpoints/tests_models.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,3 +427,70 @@ def test_get_serial_log_general_error(self, mock_get_serial_log):
427427
self.assertEqual(response.status_code, 500)
428428
self.assertFalse(data["success"])
429429
self.assertEqual(data["message"], "Internal server error")
430+
431+
@patch(
432+
"canonicalwebteam.store_api.publishergw.PublisherGW"
433+
+ ".get_store_model_serial_logs"
434+
)
435+
def test_get_serial_log_with_time_range(self, mock_get_serial_log):
436+
mock_serial_log = []
437+
mock_get_serial_log.return_value = mock_serial_log
438+
response = self.client.get(
439+
"/api/store/1/models/test-model/serial-log"
440+
"?start-time=2026-06-01T00:00:00Z"
441+
"&end-time=2026-06-30T23:59:59Z"
442+
)
443+
data = response.json
444+
445+
self.assertEqual(response.status_code, 200)
446+
self.assertTrue(data["success"])
447+
self.assertEqual(data["data"], [])
448+
449+
@patch(
450+
"canonicalwebteam.store_api.publishergw.PublisherGW"
451+
+ ".get_store_model_serial_logs"
452+
)
453+
def test_get_serial_log_with_page_size(self, mock_get_serial_log):
454+
mock_serial_log = [
455+
{
456+
"brand-id": "test-brand-id",
457+
"created-at": "2026-03-23T04:00:23.875000",
458+
"model-name": "test-model",
459+
"serial": "test-serial",
460+
}
461+
]
462+
mock_get_serial_log.return_value = mock_serial_log
463+
response = self.client.get(
464+
"/api/store/1/models/test-model/serial-log?page-size=50"
465+
)
466+
data = response.json
467+
468+
self.assertEqual(response.status_code, 200)
469+
self.assertTrue(data["success"])
470+
self.assertEqual(data["data"], mock_serial_log)
471+
472+
@patch(
473+
"canonicalwebteam.store_api.publishergw.PublisherGW"
474+
+ ".get_store_model_serial_logs"
475+
)
476+
def test_get_serial_log_with_all_parameters(self, mock_get_serial_log):
477+
mock_serial_log = [
478+
{
479+
"brand-id": "test-brand-id",
480+
"created-at": "2026-03-23T04:00:23.875000",
481+
"model-name": "test-model",
482+
"serial": "test-serial",
483+
}
484+
]
485+
mock_get_serial_log.return_value = mock_serial_log
486+
response = self.client.get(
487+
"/api/store/1/models/test-model/serial-log"
488+
"?start-time=2026-01-01T00:00:00Z"
489+
"&end-time=2026-12-31T23:59:59Z"
490+
"&page-size=25"
491+
)
492+
data = response.json
493+
494+
self.assertEqual(response.status_code, 200)
495+
self.assertTrue(data["success"])
496+
self.assertEqual(data["data"], mock_serial_log)

webapp/endpoints/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,13 +353,19 @@ def create_remodel_allowlist(store_id: str):
353353
@login_required
354354
@exchange_required
355355
def get_serial_log(store_id: str, model_name: str):
356+
start_time = flask.request.args.get("start-time")
357+
end_time = flask.request.args.get("end-time")
358+
page_size = flask.request.args.get("page-size")
356359
res = {}
357360

358361
try:
359362
logs = publisher_gateway.get_store_model_serial_logs(
360363
flask.session,
361364
store_id,
362365
model_name,
366+
start_time,
367+
end_time,
368+
page_size,
363369
)
364370
res["data"] = logs
365371
res["success"] = True

0 commit comments

Comments
 (0)