|
|
import { describe, it, expect } from 'vitest' |
|
|
import { renderHook, waitFor, act } from '@testing-library/react' |
|
|
import { server } from '../../mocks/server' |
|
|
import { errorHandlers } from '../../mocks/handlers' |
|
|
import { useSegmentation } from '../useSegmentation' |
|
|
|
|
|
describe('useSegmentation', () => { |
|
|
it('starts with null result and not loading', () => { |
|
|
const { result } = renderHook(() => useSegmentation()) |
|
|
|
|
|
expect(result.current.result).toBeNull() |
|
|
expect(result.current.isLoading).toBe(false) |
|
|
expect(result.current.error).toBeNull() |
|
|
}) |
|
|
|
|
|
it('sets loading state during segmentation', async () => { |
|
|
const { result } = renderHook(() => useSegmentation()) |
|
|
|
|
|
act(() => { |
|
|
result.current.runSegmentation('sub-stroke0001') |
|
|
}) |
|
|
|
|
|
expect(result.current.isLoading).toBe(true) |
|
|
|
|
|
await waitFor(() => { |
|
|
expect(result.current.isLoading).toBe(false) |
|
|
}) |
|
|
}) |
|
|
|
|
|
it('returns result on success', async () => { |
|
|
const { result } = renderHook(() => useSegmentation()) |
|
|
|
|
|
await act(async () => { |
|
|
await result.current.runSegmentation('sub-stroke0001') |
|
|
}) |
|
|
|
|
|
expect(result.current.result).not.toBeNull() |
|
|
expect(result.current.result?.metrics.caseId).toBe('sub-stroke0001') |
|
|
expect(result.current.result?.metrics.diceScore).toBe(0.847) |
|
|
expect(result.current.result?.dwiUrl).toContain('dwi.nii.gz') |
|
|
}) |
|
|
|
|
|
it('sets error on failure', async () => { |
|
|
server.use(errorHandlers.segmentServerError) |
|
|
|
|
|
const { result } = renderHook(() => useSegmentation()) |
|
|
|
|
|
await act(async () => { |
|
|
await result.current.runSegmentation('sub-stroke0001') |
|
|
}) |
|
|
|
|
|
expect(result.current.error).toMatch(/segmentation failed/i) |
|
|
expect(result.current.result).toBeNull() |
|
|
}) |
|
|
|
|
|
it('clears previous error on new request', async () => { |
|
|
server.use(errorHandlers.segmentServerError) |
|
|
const { result } = renderHook(() => useSegmentation()) |
|
|
|
|
|
|
|
|
await act(async () => { |
|
|
await result.current.runSegmentation('sub-stroke0001') |
|
|
}) |
|
|
expect(result.current.error).not.toBeNull() |
|
|
|
|
|
|
|
|
server.resetHandlers() |
|
|
|
|
|
|
|
|
await act(async () => { |
|
|
await result.current.runSegmentation('sub-stroke0001') |
|
|
}) |
|
|
|
|
|
expect(result.current.error).toBeNull() |
|
|
expect(result.current.result).not.toBeNull() |
|
|
}) |
|
|
|
|
|
it('clears previous result on new request', async () => { |
|
|
const { result } = renderHook(() => useSegmentation()) |
|
|
|
|
|
|
|
|
await act(async () => { |
|
|
await result.current.runSegmentation('sub-stroke0001') |
|
|
}) |
|
|
expect(result.current.result).not.toBeNull() |
|
|
|
|
|
|
|
|
act(() => { |
|
|
result.current.runSegmentation('sub-stroke0002') |
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
expect(result.current.isLoading).toBe(true) |
|
|
}) |
|
|
}) |
|
|
|