dify/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

162 lines
4.9 KiB
TypeScript

import type { SnippetInputField } from '@/models/snippet'
import { renderHook } from '@testing-library/react'
import { act } from 'react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { PipelineInputVarType } from '@/models/pipeline'
import { useSnippetDraftStore } from '../../draft-store'
import { useSnippetStartRun } from '../use-snippet-start-run'
const mockWorkflowStoreGetState = vi.fn()
vi.mock('@/app/components/workflow/store', () => ({
useWorkflowStore: () => ({
getState: mockWorkflowStoreGetState,
}),
}))
const mockHandleCancelDebugAndPreviewPanel = vi.fn()
vi.mock('@/app/components/workflow/hooks', () => ({
useWorkflowInteractions: () => ({
handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
}),
}))
const mockSetShowDebugAndPreviewPanel = vi.fn()
const mockSetShowInputsPanel = vi.fn()
const mockSetShowEnvPanel = vi.fn()
const mockSetShowGlobalVariablePanel = vi.fn()
const mockHandleRun = vi.fn()
const inputFields: SnippetInputField[] = [
{
type: PipelineInputVarType.textInput,
label: 'Query',
variable: 'query',
required: true,
},
]
describe('useSnippetStartRun', () => {
beforeEach(() => {
vi.clearAllMocks()
useSnippetDraftStore.getState().reset()
mockWorkflowStoreGetState.mockReturnValue({
workflowRunningData: undefined,
showDebugAndPreviewPanel: false,
setShowDebugAndPreviewPanel: mockSetShowDebugAndPreviewPanel,
setShowInputsPanel: mockSetShowInputsPanel,
setShowEnvPanel: mockSetShowEnvPanel,
setShowGlobalVariablePanel: mockSetShowGlobalVariablePanel,
})
})
it('should open the debug panel and input form when snippet has input fields', () => {
useSnippetDraftStore.getState().setInputFields(inputFields)
const { result } = renderHook(() =>
useSnippetStartRun({
handleRun: mockHandleRun,
}),
)
act(() => {
result.current.handleWorkflowStartRunInWorkflow()
})
expect(mockSetShowEnvPanel).toHaveBeenCalledWith(false)
expect(mockSetShowGlobalVariablePanel).toHaveBeenCalledWith(false)
expect(mockSetShowDebugAndPreviewPanel).toHaveBeenCalledWith(true)
expect(mockSetShowInputsPanel).toHaveBeenCalledWith(true)
expect(mockHandleRun).not.toHaveBeenCalled()
})
it('should run immediately when snippet has no input fields', () => {
const { result } = renderHook(() =>
useSnippetStartRun({
handleRun: mockHandleRun,
}),
)
act(() => {
result.current.handleWorkflowStartRunInWorkflow()
})
expect(mockSetShowDebugAndPreviewPanel).toHaveBeenCalledWith(true)
expect(mockSetShowInputsPanel).toHaveBeenCalledWith(false)
expect(mockHandleRun).toHaveBeenCalledWith({ inputs: {} })
})
it('should use current snippet input fields from the store before starting a run', () => {
useSnippetDraftStore.getState().setInputFields(inputFields)
const { result } = renderHook(() =>
useSnippetStartRun({
handleRun: mockHandleRun,
}),
)
act(() => {
result.current.handleWorkflowStartRunInWorkflow()
})
expect(mockSetShowDebugAndPreviewPanel).toHaveBeenCalledWith(true)
expect(mockSetShowInputsPanel).toHaveBeenCalledWith(true)
expect(mockHandleRun).not.toHaveBeenCalled()
})
it('should close the panel when debug panel is already open', () => {
useSnippetDraftStore.getState().setInputFields(inputFields)
mockWorkflowStoreGetState.mockReturnValue({
workflowRunningData: undefined,
showDebugAndPreviewPanel: true,
setShowDebugAndPreviewPanel: mockSetShowDebugAndPreviewPanel,
setShowInputsPanel: mockSetShowInputsPanel,
setShowEnvPanel: mockSetShowEnvPanel,
setShowGlobalVariablePanel: mockSetShowGlobalVariablePanel,
})
const { result } = renderHook(() =>
useSnippetStartRun({
handleRun: mockHandleRun,
}),
)
act(() => {
result.current.handleWorkflowStartRunInWorkflow()
})
expect(mockHandleCancelDebugAndPreviewPanel).toHaveBeenCalled()
})
it('should do nothing when workflow is already running', () => {
useSnippetDraftStore.getState().setInputFields(inputFields)
mockWorkflowStoreGetState.mockReturnValue({
workflowRunningData: {
result: {
status: WorkflowRunningStatus.Running,
},
},
showDebugAndPreviewPanel: false,
setShowDebugAndPreviewPanel: mockSetShowDebugAndPreviewPanel,
setShowInputsPanel: mockSetShowInputsPanel,
setShowEnvPanel: mockSetShowEnvPanel,
setShowGlobalVariablePanel: mockSetShowGlobalVariablePanel,
})
const { result } = renderHook(() =>
useSnippetStartRun({
handleRun: mockHandleRun,
}),
)
act(() => {
result.current.handleWorkflowStartRunInWorkflow()
})
expect(mockSetShowDebugAndPreviewPanel).not.toHaveBeenCalled()
expect(mockHandleRun).not.toHaveBeenCalled()
})
})