Files
dify/web/app/components/workflow/constants/node-availability.spec.ts

143 lines
4.8 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { BlockEnum } from '@/app/components/workflow/types'
import {
buildNodeSelectorAvailabilityContext,
filterNodesForSelector,
isNodeAvailableInSelector,
NodeSelectorSandboxMode,
NodeSelectorScene,
} from './node-availability'
type MockNode = {
metaData: {
type: BlockEnum
}
}
describe('node-availability', () => {
it('should hide command and file-upload when sandbox is disabled', () => {
const mockNodes: MockNode[] = [
{ metaData: { type: BlockEnum.Start } },
{ metaData: { type: BlockEnum.Command } },
{ metaData: { type: BlockEnum.FileUpload } },
]
const result = filterNodesForSelector(mockNodes, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})
const nodeTypes = result.map(node => node.metaData.type)
expect(nodeTypes).toEqual([BlockEnum.Start])
})
it('should keep command and file-upload when sandbox is enabled', () => {
const mockNodes: MockNode[] = [
{ metaData: { type: BlockEnum.Start } },
{ metaData: { type: BlockEnum.Command } },
{ metaData: { type: BlockEnum.FileUpload } },
]
const result = filterNodesForSelector(mockNodes, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Enabled,
})
const nodeTypes = result.map(node => node.metaData.type)
expect(nodeTypes).toEqual([BlockEnum.Start, BlockEnum.Command, BlockEnum.FileUpload])
})
it('should return original reference when no filtering is needed', () => {
const mockNodes: MockNode[] = [
{ metaData: { type: BlockEnum.Start } },
{ metaData: { type: BlockEnum.End } },
]
const result = filterNodesForSelector(mockNodes, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})
expect(result).toBe(mockNodes)
})
it('should mark command and file-upload as sandbox-only', () => {
expect(isNodeAvailableInSelector(BlockEnum.Command, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})).toBe(false)
expect(isNodeAvailableInSelector(BlockEnum.FileUpload, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})).toBe(false)
expect(isNodeAvailableInSelector(BlockEnum.Start, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})).toBe(true)
})
it('should hide agent when sandbox is enabled', () => {
expect(isNodeAvailableInSelector(BlockEnum.Agent, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Enabled,
})).toBe(false)
expect(isNodeAvailableInSelector(BlockEnum.Agent, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})).toBe(true)
})
it('should hide human-input in rag pipeline flow', () => {
expect(isNodeAvailableInSelector(BlockEnum.HumanInput, {
scene: NodeSelectorScene.RagPipeline,
sandboxMode: NodeSelectorSandboxMode.Enabled,
})).toBe(false)
expect(isNodeAvailableInSelector(BlockEnum.HumanInput, {
scene: NodeSelectorScene.RagPipeline,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})).toBe(false)
expect(isNodeAvailableInSelector(BlockEnum.HumanInput, {
scene: NodeSelectorScene.Workflow,
sandboxMode: NodeSelectorSandboxMode.Disabled,
})).toBe(true)
})
it('should build unsupported sandbox mode for scenes that do not support sandbox', () => {
const context = buildNodeSelectorAvailabilityContext({
scene: NodeSelectorScene.RagPipeline,
isSandboxRuntime: true,
isSandboxFeatureEnabled: true,
})
expect(context.scene).toBe(NodeSelectorScene.RagPipeline)
expect(context.sandboxMode).toBe(NodeSelectorSandboxMode.Unsupported)
})
it('should allow explicit scene sandbox support override', () => {
const context = buildNodeSelectorAvailabilityContext({
scene: NodeSelectorScene.RagPipeline,
supportsSandbox: true,
isSandboxRuntime: true,
isSandboxFeatureEnabled: false,
})
expect(context.sandboxMode).toBe(NodeSelectorSandboxMode.Enabled)
})
it('should build enabled sandbox mode when runtime or feature enables sandbox', () => {
const contextByRuntime = buildNodeSelectorAvailabilityContext({
scene: NodeSelectorScene.Workflow,
isSandboxRuntime: true,
isSandboxFeatureEnabled: false,
})
const contextByFeature = buildNodeSelectorAvailabilityContext({
scene: NodeSelectorScene.Workflow,
isSandboxRuntime: false,
isSandboxFeatureEnabled: true,
})
expect(contextByRuntime.sandboxMode).toBe(NodeSelectorSandboxMode.Enabled)
expect(contextByFeature.sandboxMode).toBe(NodeSelectorSandboxMode.Enabled)
})
})