refactor(web): migrate to Vitest and esm (#29974)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: yyh <yuanyouhuilyz@gmail.com>
This commit is contained in:
Stephen Zhou
2025-12-22 16:35:22 +08:00
committed by GitHub
parent 42f7ecda12
commit eabdc5f0eb
268 changed files with 5455 additions and 6307 deletions

View File

@ -5,9 +5,9 @@ import { DatasourceType } from '@/models/pipeline'
import type { PipelineExecutionLogResponse } from '@/models/pipeline'
// Mock Next.js router
const mockPush = jest.fn()
const mockBack = jest.fn()
jest.mock('next/navigation', () => ({
const mockPush = vi.fn()
const mockBack = vi.fn()
vi.mock('next/navigation', () => ({
useRouter: () => ({
push: mockPush,
back: mockBack,
@ -16,16 +16,16 @@ jest.mock('next/navigation', () => ({
// Mock dataset detail context
const mockPipelineId = 'pipeline-123'
jest.mock('@/context/dataset-detail', () => ({
vi.mock('@/context/dataset-detail', () => ({
useDatasetDetailContextWithSelector: (selector: (state: { dataset: { pipeline_id: string; doc_form: string } }) => unknown) =>
selector({ dataset: { pipeline_id: mockPipelineId, doc_form: 'text_model' } }),
}))
// Mock API hooks for PipelineSettings
const mockUsePipelineExecutionLog = jest.fn()
const mockMutateAsync = jest.fn()
const mockUseRunPublishedPipeline = jest.fn()
jest.mock('@/service/use-pipeline', () => ({
const mockUsePipelineExecutionLog = vi.fn()
const mockMutateAsync = vi.fn()
const mockUseRunPublishedPipeline = vi.fn()
vi.mock('@/service/use-pipeline', () => ({
usePipelineExecutionLog: (params: { dataset_id: string; document_id: string }) => mockUsePipelineExecutionLog(params),
useRunPublishedPipeline: () => mockUseRunPublishedPipeline(),
// For ProcessDocuments component
@ -36,16 +36,16 @@ jest.mock('@/service/use-pipeline', () => ({
}))
// Mock document invalidation hooks
const mockInvalidDocumentList = jest.fn()
const mockInvalidDocumentDetail = jest.fn()
jest.mock('@/service/knowledge/use-document', () => ({
const mockInvalidDocumentList = vi.fn()
const mockInvalidDocumentDetail = vi.fn()
vi.mock('@/service/knowledge/use-document', () => ({
useInvalidDocumentList: () => mockInvalidDocumentList,
useInvalidDocumentDetail: () => mockInvalidDocumentDetail,
}))
// Mock Form component in ProcessDocuments - internal dependencies are too complex
jest.mock('../../../create-from-pipeline/process-documents/form', () => {
return function MockForm({
vi.mock('../../../create-from-pipeline/process-documents/form', () => ({
default: function MockForm({
ref,
initialData,
configurations,
@ -84,12 +84,12 @@ jest.mock('../../../create-from-pipeline/process-documents/form', () => {
</button>
</form>
)
}
})
},
}))
// Mock ChunkPreview - has complex internal state and many dependencies
jest.mock('../../../create-from-pipeline/preview/chunk-preview', () => {
return function MockChunkPreview({
vi.mock('../../../create-from-pipeline/preview/chunk-preview', () => ({
default: function MockChunkPreview({
dataSourceType,
localFiles,
onlineDocuments,
@ -120,8 +120,8 @@ jest.mock('../../../create-from-pipeline/preview/chunk-preview', () => {
<span data-testid="has-estimate-data">{String(!!estimateData)}</span>
</div>
)
}
})
},
}))
// Test utilities
const createQueryClient = () =>
@ -163,7 +163,7 @@ const createDefaultProps = () => ({
describe('PipelineSettings', () => {
beforeEach(() => {
jest.clearAllMocks()
vi.clearAllMocks()
mockPush.mockClear()
mockBack.mockClear()
mockMutateAsync.mockClear()

View File

@ -6,14 +6,14 @@ import type { RAGPipelineVariable } from '@/models/pipeline'
// Mock dataset detail context - required for useInputVariables hook
const mockPipelineId = 'pipeline-123'
jest.mock('@/context/dataset-detail', () => ({
vi.mock('@/context/dataset-detail', () => ({
useDatasetDetailContextWithSelector: (selector: (state: { dataset: { pipeline_id: string } }) => string) =>
selector({ dataset: { pipeline_id: mockPipelineId } }),
}))
// Mock API call for pipeline processing params
const mockParamsConfig = jest.fn()
jest.mock('@/service/use-pipeline', () => ({
const mockParamsConfig = vi.fn()
vi.mock('@/service/use-pipeline', () => ({
usePublishedPipelineProcessingParams: () => ({
data: mockParamsConfig(),
isFetching: false,
@ -22,8 +22,8 @@ jest.mock('@/service/use-pipeline', () => ({
// Mock Form component - internal dependencies (useAppForm, BaseField) are too complex
// Keep the mock minimal and focused on testing the integration
jest.mock('../../../../create-from-pipeline/process-documents/form', () => {
return function MockForm({
vi.mock('../../../../create-from-pipeline/process-documents/form', () => ({
default: function MockForm({
ref,
initialData,
configurations,
@ -69,8 +69,8 @@ jest.mock('../../../../create-from-pipeline/process-documents/form', () => {
</button>
</form>
)
}
})
},
}))
// Test utilities
const createQueryClient = () =>
@ -114,15 +114,15 @@ const createDefaultProps = (overrides: Partial<{
lastRunInputData: {},
isRunning: false,
ref: { current: null } as React.RefObject<{ submit: () => void } | null>,
onProcess: jest.fn(),
onPreview: jest.fn(),
onSubmit: jest.fn(),
onProcess: vi.fn(),
onPreview: vi.fn(),
onSubmit: vi.fn(),
...overrides,
})
describe('ProcessDocuments', () => {
beforeEach(() => {
jest.clearAllMocks()
vi.clearAllMocks()
// Default: return empty variables
mockParamsConfig.mockReturnValue({ variables: [] })
})
@ -253,7 +253,7 @@ describe('ProcessDocuments', () => {
it('should expose submit method via ref', () => {
// Arrange
const ref = { current: null } as React.RefObject<{ submit: () => void } | null>
const onSubmit = jest.fn()
const onSubmit = vi.fn()
const props = createDefaultProps({ ref, onSubmit })
// Act
@ -278,7 +278,7 @@ describe('ProcessDocuments', () => {
describe('onProcess', () => {
it('should call onProcess when Save and Process button is clicked', () => {
// Arrange
const onProcess = jest.fn()
const onProcess = vi.fn()
const props = createDefaultProps({ onProcess })
// Act
@ -291,7 +291,7 @@ describe('ProcessDocuments', () => {
it('should not call onProcess when button is disabled due to isRunning', () => {
// Arrange
const onProcess = jest.fn()
const onProcess = vi.fn()
const props = createDefaultProps({ onProcess, isRunning: true })
// Act
@ -306,7 +306,7 @@ describe('ProcessDocuments', () => {
describe('onPreview', () => {
it('should call onPreview when preview button is clicked', () => {
// Arrange
const onPreview = jest.fn()
const onPreview = vi.fn()
const props = createDefaultProps({ onPreview })
// Act
@ -325,7 +325,7 @@ describe('ProcessDocuments', () => {
createMockVariable({ variable: 'chunk_size', label: 'Chunk Size', type: PipelineInputVarType.number, default_value: '100' }),
]
mockParamsConfig.mockReturnValue({ variables })
const onSubmit = jest.fn()
const onSubmit = vi.fn()
const props = createDefaultProps({ onSubmit })
// Act
@ -477,7 +477,7 @@ describe('ProcessDocuments', () => {
createMockVariable({ variable: 'field2', label: 'Field 2', type: PipelineInputVarType.number, default_value: '42' }),
]
mockParamsConfig.mockReturnValue({ variables })
const onSubmit = jest.fn()
const onSubmit = vi.fn()
const props = createDefaultProps({ onSubmit })
// Act
@ -527,8 +527,8 @@ describe('ProcessDocuments', () => {
createMockVariable({ variable: 'setting', label: 'Setting', type: PipelineInputVarType.textInput, default_value: 'initial' }),
]
mockParamsConfig.mockReturnValue({ variables })
const onProcess = jest.fn()
const onSubmit = jest.fn()
const onProcess = vi.fn()
const onSubmit = vi.fn()
const props = createDefaultProps({ onProcess, onSubmit })
// Act