From 71fae81f285149b26f6c7fde660347f19e91f857 Mon Sep 17 00:00:00 2001 From: myh Date: Sat, 25 Jul 2026 14:56:04 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B0=B0=EC=B9=98=20=EC=9E=91=EC=97=85?= =?UTF-8?q?=20=EB=A1=9C=EA=B7=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=EB=A5=BC=20Pageable=20size=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=EB=A1=9C=20=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .../batch-job-log/api/batchJobLogApi.test.ts | 41 +++++++++++++++++++ .../batch-job-log/api/batchJobLogApi.ts | 7 +++- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/entities/batch-job-log/api/batchJobLogApi.test.ts diff --git a/src/entities/batch-job-log/api/batchJobLogApi.test.ts b/src/entities/batch-job-log/api/batchJobLogApi.test.ts new file mode 100644 index 0000000..c590460 --- /dev/null +++ b/src/entities/batch-job-log/api/batchJobLogApi.test.ts @@ -0,0 +1,41 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +const apiClientMock = vi.hoisted(() => ({ + get: vi.fn(), + post: vi.fn(), +})); + +vi.mock('@/shared/api', async (importOriginal) => { + const actual = await importOriginal(); + return { ...actual, apiClient: apiClientMock }; +}); + +import { fetchBatchJobLogs } from './batchJobLogApi'; + +describe('배치 작업 로그 조회 API', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('페이지 크기를 백엔드 Pageable 이름인 size로 변환해 전송한다', async () => { + apiClientMock.get.mockResolvedValue({ + data: { data: [], meta: { page: 2, totalCount: 12, totalPages: 2 } }, + }); + + await fetchBatchJobLogs({ page: 2, pageSize: 10, status: 'FAILED' }); + + expect(apiClientMock.get).toHaveBeenCalledWith('/v1/admin/batch-job-logs', { + params: { page: 2, size: 10, status: 'FAILED' }, + }); + }); + + it('응답 meta와 요청 pageSize로 PageResult를 구성한다', async () => { + apiClientMock.get.mockResolvedValue({ + data: { data: [], meta: { page: 1, totalCount: 12, totalPages: 2 } }, + }); + + const result = await fetchBatchJobLogs({ page: 1, pageSize: 10 }); + + expect(result).toEqual({ items: [], page: 1, pageSize: 10, totalCount: 12 }); + }); +}); diff --git a/src/entities/batch-job-log/api/batchJobLogApi.ts b/src/entities/batch-job-log/api/batchJobLogApi.ts index 9c54f52..529322f 100644 --- a/src/entities/batch-job-log/api/batchJobLogApi.ts +++ b/src/entities/batch-job-log/api/batchJobLogApi.ts @@ -13,11 +13,14 @@ export interface BatchJobLogSearchParams extends PageParams { export async function fetchBatchJobLogs( params: BatchJobLogSearchParams, ): Promise> { + // 백엔드는 Spring Pageable이라 페이지 크기를 `size`라는 이름으로만 받는다(policyApi #126 관례). + // `pageSize` 그대로 보내면 조용히 무시되어 @PageableDefault(size=20)로 응답해 페이지 이동이 어긋난다. + const { pageSize, ...filters } = params; const response = await apiClient.get>( '/v1/admin/batch-job-logs', - { params }, + { params: { ...filters, size: pageSize } }, ); - return toPageResult(response.data, params.pageSize); + return toPageResult(response.data, pageSize); } // 관리자 대시보드의 "수동 강제 동기화" 버튼이 호출한다. 비동기로 전체 동기화를 시작시키고 202를