mirror of
https://github.com/langgenius/dify.git
synced 2026-02-24 18:05:11 +00:00
143 lines
4.8 KiB
TypeScript
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)
|
|
})
|
|
})
|