diff --git a/src/api/aiRuns.ts b/src/api/aiRuns.ts index 795d60d..ff370b0 100644 --- a/src/api/aiRuns.ts +++ b/src/api/aiRuns.ts @@ -28,6 +28,7 @@ export interface AiRunResponse { status: AiRunStatus analysis_outcome: AiAnalysisOutcome | null detected_intent: string | null + evidence: string | null error_code: string | null attempt_count: number version: number diff --git a/src/pages/CreateWorkPage/CreateWorkPage.test.tsx b/src/pages/CreateWorkPage/CreateWorkPage.test.tsx index bd6925b..790aa9b 100644 --- a/src/pages/CreateWorkPage/CreateWorkPage.test.tsx +++ b/src/pages/CreateWorkPage/CreateWorkPage.test.tsx @@ -21,6 +21,7 @@ const AI_RUN = { status: 'SUCCEEDED', analysis_outcome: 'NEEDS_INFO', detected_intent: 'EXPIRY_RENEWAL', + evidence: null, error_code: null, attempt_count: 1, version: 1, diff --git a/src/pages/ReviewWorkPage/AiRunReview.test.tsx b/src/pages/ReviewWorkPage/AiRunReview.test.tsx index 4a07130..2d8ef93 100644 --- a/src/pages/ReviewWorkPage/AiRunReview.test.tsx +++ b/src/pages/ReviewWorkPage/AiRunReview.test.tsx @@ -20,6 +20,7 @@ const RUN: AiRunResponse = { status: 'SUCCEEDED', analysis_outcome: 'REVIEW_REQUIRED', detected_intent: 'EXPIRY_RENEWAL', + evidence: null, error_code: null, attempt_count: 1, version: 3, @@ -92,6 +93,7 @@ function processingRun(): AiRunResponse { status: 'RUNNING', analysis_outcome: null, detected_intent: null, + evidence: null, version: 1, questions: [], candidates: [], @@ -104,6 +106,7 @@ function needsInfoRun(): AiRunResponse { status: 'SUCCEEDED', analysis_outcome: 'NEEDS_INFO', detected_intent: 'EXPIRY_RENEWAL', + evidence: null, version: 2, questions: [ { @@ -234,6 +237,41 @@ describe('AiRunReview candidate decision', () => { }) }) +describe('AiRunReview 분석 근거', () => { + function mockCatalogAndWorkers() { + vi.mocked(fetch).mockImplementation((input) => { + const url = String(input) + if (url.includes('/workflow-catalogs')) return Promise.resolve(jsonResponse(CATALOG)) + if (url.includes('/workers')) { + return Promise.resolve(jsonResponse({ items: [], page: 0, size: 100, total_elements: 0 })) + } + return Promise.reject(new Error(`Unexpected request: ${url}`)) + }) + } + + it('renders the evidence text returned by the API', async () => { + mockCatalogAndWorkers() + render( + + + , + ) + + expect(await screen.findByText('체류만료일이 30일 이내로 확인됨')).toBeInTheDocument() + }) + + it('falls back to a placeholder when the API has no evidence yet', async () => { + mockCatalogAndWorkers() + render( + + + , + ) + + expect(await screen.findByText('현재 분석 API에서 제공하지 않음')).toBeInTheDocument() + }) +}) + describe('AiRunReview progress updates', () => { afterEach(() => { vi.useRealTimers() diff --git a/src/pages/ReviewWorkPage/AiRunReview.tsx b/src/pages/ReviewWorkPage/AiRunReview.tsx index 671e8ee..0af41d0 100644 --- a/src/pages/ReviewWorkPage/AiRunReview.tsx +++ b/src/pages/ReviewWorkPage/AiRunReview.tsx @@ -391,7 +391,9 @@ export function AiRunReview({ initialRun, initialDraft }: AiRunReviewProps) {

분석 근거

-

현재 분석 API에서 제공하지 않음

+

+ {run.evidence ?? '현재 분석 API에서 제공하지 않음'} +

diff --git a/src/pages/ReviewWorkPage/ReviewWorkPage.test.tsx b/src/pages/ReviewWorkPage/ReviewWorkPage.test.tsx index 260c7cc..64b5860 100644 --- a/src/pages/ReviewWorkPage/ReviewWorkPage.test.tsx +++ b/src/pages/ReviewWorkPage/ReviewWorkPage.test.tsx @@ -34,6 +34,7 @@ describe('ReviewWorkPage', () => { status: 'SUCCEEDED', analysis_outcome: 'NEEDS_INFO', detected_intent: 'EXPIRY_RENEWAL', + evidence: null, error_code: null, attempt_count: 1, version: 1,