This commit is contained in:
Stephen Zhou
2026-03-25 19:25:22 +08:00
parent f0041ec619
commit a7178b4d5c
40 changed files with 652 additions and 156 deletions

View File

@ -142,7 +142,7 @@ describe('WorkflowPreview', () => {
it('should keep the input tab active, switch to result after running, and close the preview panel', async () => {
const user = userEvent.setup()
const { container } = renderWorkflowComponent(
const { container, store } = renderWorkflowComponent(
<WorkflowPreview />,
{
initialStoreState: {
@ -156,7 +156,20 @@ describe('WorkflowPreview', () => {
expect(screen.getByRole('button', { name: 'run-inputs' })).toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'run-inputs' }))
expect(screen.getByTestId('result-text')).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'run-inputs' })).toBeInTheDocument()
store.setState({
workflowRunningData: createWorkflowRunningData({
result: createWorkflowResult({
status: WorkflowRunningStatus.Running,
files: [],
}),
}) as NonNullable<Shape['workflowRunningData']>,
})
await waitFor(() => {
expect(screen.getByTestId('result-text')).toBeInTheDocument()
})
await user.click(container.querySelector('.flex.items-center.justify-between .cursor-pointer.p-1') as HTMLElement)
expect(mockHandleCancelDebugAndPreviewPanel).toHaveBeenCalledTimes(1)
@ -281,6 +294,7 @@ describe('WorkflowPreview', () => {
},
)
fireEvent.click(screen.getByText('runLog.tracing'))
expect(screen.getByTestId('tracing-panel')).toHaveTextContent('0')
expect(screen.getByRole('status', { name: 'appApi.loading' })).toBeInTheDocument()
})

View File

@ -1,10 +1,12 @@
import type { ConversationVariable, Node } from '@/app/components/workflow/types'
import { render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { updateConversationVariables } from '@/service/workflow'
import ChatVariablePanel from '../index'
import { ChatVarType } from '../type'
type MockWorkflowStoreState = {
appId: string
setShowChatVariablePanel: (value: boolean) => void
conversationVariables: ConversationVariable[]
setConversationVariables: (value: ConversationVariable[]) => void
@ -17,9 +19,6 @@ type MockFlowStore = {
const mockSetShowChatVariablePanel = vi.fn()
const mockSetConversationVariables = vi.fn()
const mockDoSyncWorkflowDraft = vi.fn((_sync: boolean, options?: { onSuccess?: () => void }) => {
options?.onSuccess?.()
})
const mockInvalidateConversationVarValues = vi.fn()
const mockFindUsedVarNodes = vi.fn<(selector: string[], nodes: Node[]) => Node[]>()
const mockUpdateNodeVars = vi.fn<(node: Node, current: string[], next: string[]) => Node>()
@ -61,16 +60,15 @@ vi.mock('reactflow', () => ({
vi.mock('@/app/components/workflow/store', () => ({
useStore: <T,>(selector: (state: MockWorkflowStoreState) => T) => selector({
appId: 'app-1',
setShowChatVariablePanel: mockSetShowChatVariablePanel,
conversationVariables: mockConversationVariables,
setConversationVariables: mockSetConversationVariables,
}),
}))
vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
doSyncWorkflowDraft: mockDoSyncWorkflowDraft,
}),
vi.mock('@/service/workflow', () => ({
updateConversationVariables: vi.fn(),
}))
vi.mock('../../../hooks/use-inspect-vars-crud', () => ({
@ -171,12 +169,15 @@ vi.mock('@/app/components/workflow/nodes/_base/components/remove-effect-var-conf
}))
describe('ChatVariablePanel', () => {
const mockUpdateConversationVariables = vi.mocked(updateConversationVariables)
beforeEach(() => {
vi.clearAllMocks()
mockConversationVariables = [createConversationVariable()]
mockFlowNodes = [createNode('node-1'), createNode('node-2')]
mockFindUsedVarNodes.mockReturnValue([])
mockUpdateNodeVars.mockImplementation((node: Node) => node)
mockUpdateConversationVariables.mockResolvedValue(undefined as never)
})
it('should toggle the tips area and close the panel', async () => {
@ -208,7 +209,13 @@ describe('ChatVariablePanel', () => {
createConversationVariable(),
])
})
expect(mockDoSyncWorkflowDraft).toHaveBeenCalledTimes(1)
expect(mockUpdateConversationVariables).toHaveBeenCalledWith({
appId: 'app-1',
conversationVariables: [
expect.objectContaining({ id: 'var-added', name: 'fresh_var' }),
createConversationVariable(),
],
})
expect(mockInvalidateConversationVarValues).toHaveBeenCalledTimes(1)
})

View File

@ -77,7 +77,7 @@ describe('variable-modal helpers', () => {
objectValue: [],
type: ChatVarType.Boolean,
value: undefined,
})).toBe(true)
})).toBe(false)
expect(formatChatVariableValue({
editInJSON: false,

View File

@ -109,7 +109,7 @@ vi.mock('@/app/components/base/chat/chat', () => ({
},
}))
vi.mock('../hooks', () => ({
vi.mock('../hooks/use-chat', () => ({
useChat: (...args: unknown[]) => mockUseChat(...args),
}))