Compare commits

...

1 Commits

Author SHA1 Message Date
Stephen Zhou
4b2964a0dd test: fix window is not defined 2026-01-21 13:01:13 +08:00

View File

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