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를