diff --git a/web/app/components/datasets/create/website/watercrawl/index.spec.tsx b/web/app/components/datasets/create/website/watercrawl/index.spec.tsx index e694537895..bc70fbbc3c 100644 --- a/web/app/components/datasets/create/website/watercrawl/index.spec.tsx +++ b/web/app/components/datasets/create/website/watercrawl/index.spec.tsx @@ -41,6 +41,14 @@ const createDefaultCrawlOptions = (overrides: Partial = {}): Crawl ...overrides, }) +const createDeferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((res) => { + resolve = res + }) + return { promise, resolve } +} + const createCrawlResultItem = (overrides: Partial = {}): CrawlResultItem => ({ title: 'Test Page Title', markdown: '# Test Content\n\nThis is test markdown content.', @@ -393,7 +401,15 @@ describe('WaterCrawl', () => { it('should update controlFoldOptions when step changes', async () => { // Arrange const mockCreateTask = createWatercrawlTask as Mock - mockCreateTask.mockImplementation(() => new Promise(() => { /* pending */ })) + const mockCheckStatus = checkWatercrawlTaskStatus as Mock + const deferredCreateTask = createDeferred<{ job_id: string }>() + mockCreateTask.mockImplementation(() => deferredCreateTask.promise) + mockCheckStatus.mockResolvedValueOnce({ + status: 'completed', + current: 0, + total: 0, + data: [], + }) const props = createDefaultProps() @@ -411,6 +427,11 @@ describe('WaterCrawl', () => { await waitFor(() => { expect(screen.getByText(/totalPageScraped/i)).toBeInTheDocument() }) + + deferredCreateTask.resolve({ job_id: 'test-job' }) + await waitFor(() => { + expect(mockCheckStatus).toHaveBeenCalled() + }) }) }) @@ -1091,8 +1112,14 @@ describe('WaterCrawl', () => { const mockCreateTask = createWatercrawlTask as Mock const mockCheckStatus = checkWatercrawlTaskStatus as Mock - mockCreateTask.mockResolvedValueOnce({ job_id: 'zero-current-job' }) - mockCheckStatus.mockImplementation(() => new Promise(() => { /* never resolves */ })) + const deferredCreateTask = createDeferred<{ job_id: string }>() + mockCreateTask.mockImplementation(() => deferredCreateTask.promise) + mockCheckStatus.mockResolvedValueOnce({ + status: 'completed', + current: 0, + total: 0, + data: [], + }) const props = createDefaultProps({ crawlOptions: createDefaultCrawlOptions({ limit: 10 }), @@ -1108,6 +1135,11 @@ describe('WaterCrawl', () => { await waitFor(() => { expect(screen.getByText(/totalPageScraped.*0\/10/)).toBeInTheDocument() }) + + deferredCreateTask.resolve({ job_id: 'zero-current-job' }) + await waitFor(() => { + expect(mockCheckStatus).toHaveBeenCalled() + }) }) it('should handle crawlResult with zero total and empty limit', async () => { @@ -1115,8 +1147,14 @@ describe('WaterCrawl', () => { const mockCreateTask = createWatercrawlTask as Mock const mockCheckStatus = checkWatercrawlTaskStatus as Mock - mockCreateTask.mockResolvedValueOnce({ job_id: 'zero-total-job' }) - mockCheckStatus.mockImplementation(() => new Promise(() => { /* never resolves */ })) + const deferredCreateTask = createDeferred<{ job_id: string }>() + mockCreateTask.mockImplementation(() => deferredCreateTask.promise) + mockCheckStatus.mockResolvedValueOnce({ + status: 'completed', + current: 0, + total: 0, + data: [], + }) const props = createDefaultProps({ crawlOptions: createDefaultCrawlOptions({ limit: '0' }), @@ -1132,6 +1170,11 @@ describe('WaterCrawl', () => { await waitFor(() => { expect(screen.getByText(/totalPageScraped.*0\/0/)).toBeInTheDocument() }) + + deferredCreateTask.resolve({ job_id: 'zero-total-job' }) + await waitFor(() => { + expect(mockCheckStatus).toHaveBeenCalled() + }) }) it('should handle undefined crawlResult data in finished state', async () => { @@ -1168,8 +1211,14 @@ describe('WaterCrawl', () => { const mockCreateTask = createWatercrawlTask as Mock const mockCheckStatus = checkWatercrawlTaskStatus as Mock - mockCreateTask.mockResolvedValueOnce({ job_id: 'no-total-job' }) - mockCheckStatus.mockImplementation(() => new Promise(() => { /* never resolves */ })) + const deferredCreateTask = createDeferred<{ job_id: string }>() + mockCreateTask.mockImplementation(() => deferredCreateTask.promise) + mockCheckStatus.mockResolvedValueOnce({ + status: 'completed', + current: 0, + total: 15, + data: [], + }) const props = createDefaultProps({ crawlOptions: createDefaultCrawlOptions({ limit: 15 }), @@ -1185,6 +1234,11 @@ describe('WaterCrawl', () => { await waitFor(() => { expect(screen.getByText(/totalPageScraped.*0\/15/)).toBeInTheDocument() }) + + deferredCreateTask.resolve({ job_id: 'no-total-job' }) + await waitFor(() => { + expect(mockCheckStatus).toHaveBeenCalled() + }) }) it('should handle crawlResult with current=0 and total=0 during running', async () => { @@ -1193,6 +1247,12 @@ describe('WaterCrawl', () => { const mockCheckStatus = checkWatercrawlTaskStatus as Mock mockCreateTask.mockResolvedValueOnce({ job_id: 'both-zero-job' }) + const deferredStatus = createDeferred<{ + status: string + current: number + total: number + data: CrawlResultItem[] + }>() mockCheckStatus .mockResolvedValueOnce({ status: 'running', @@ -1200,7 +1260,7 @@ describe('WaterCrawl', () => { total: 0, data: [], }) - .mockImplementationOnce(() => new Promise(() => { /* never resolves */ })) + .mockImplementationOnce(() => deferredStatus.promise) const props = createDefaultProps({ crawlOptions: createDefaultCrawlOptions({ limit: 5 }), @@ -1216,6 +1276,16 @@ describe('WaterCrawl', () => { await waitFor(() => { expect(screen.getByText(/totalPageScraped/)).toBeInTheDocument() }) + + deferredStatus.resolve({ + status: 'completed', + current: 0, + total: 0, + data: [], + }) + await waitFor(() => { + expect(mockCheckStatus).toHaveBeenCalledTimes(2) + }) }) }) @@ -1496,8 +1566,14 @@ describe('WaterCrawl', () => { const mockCreateTask = createWatercrawlTask as Mock const mockCheckStatus = checkWatercrawlTaskStatus as Mock - mockCreateTask.mockResolvedValueOnce({ job_id: 'progress-job' }) - mockCheckStatus.mockImplementation(() => new Promise(() => { /* pending */ })) + const deferredCreateTask = createDeferred<{ job_id: string }>() + mockCreateTask.mockImplementation(() => deferredCreateTask.promise) + mockCheckStatus.mockResolvedValueOnce({ + status: 'completed', + current: 0, + total: 10, + data: [], + }) const props = createDefaultProps({ crawlOptions: createDefaultCrawlOptions({ limit: 10 }), @@ -1513,6 +1589,11 @@ describe('WaterCrawl', () => { await waitFor(() => { expect(screen.getByText(/totalPageScraped.*0\/10/)).toBeInTheDocument() }) + + deferredCreateTask.resolve({ job_id: 'progress-job' }) + await waitFor(() => { + expect(mockCheckStatus).toHaveBeenCalled() + }) }) it('should display time consumed after crawl completion', async () => {