116 lines
3.8 KiB
Python
116 lines
3.8 KiB
Python
"""
|
|
工作流验证器测试
|
|
"""
|
|
import pytest
|
|
from app.services.workflow_validator import WorkflowValidator
|
|
|
|
|
|
@pytest.mark.unit
|
|
@pytest.mark.workflow
|
|
class TestWorkflowValidator:
|
|
"""工作流验证器测试"""
|
|
|
|
def test_validate_valid_workflow(self):
|
|
"""测试验证有效工作流"""
|
|
nodes = [
|
|
{"id": "start-1", "type": "start"},
|
|
{"id": "llm-1", "type": "llm"},
|
|
{"id": "end-1", "type": "end"}
|
|
]
|
|
edges = [
|
|
{"id": "e1", "source": "start-1", "target": "llm-1"},
|
|
{"id": "e2", "source": "llm-1", "target": "end-1"}
|
|
]
|
|
|
|
validator = WorkflowValidator(nodes, edges)
|
|
is_valid, errors, warnings = validator.validate()
|
|
|
|
assert is_valid is True
|
|
assert len(errors) == 0
|
|
|
|
def test_validate_no_start_node(self):
|
|
"""测试验证缺少开始节点"""
|
|
nodes = [
|
|
{"id": "llm-1", "type": "llm"},
|
|
{"id": "end-1", "type": "end"}
|
|
]
|
|
edges = [
|
|
{"id": "e1", "source": "llm-1", "target": "end-1"}
|
|
]
|
|
|
|
validator = WorkflowValidator(nodes, edges)
|
|
is_valid, errors, warnings = validator.validate()
|
|
|
|
assert is_valid is False
|
|
assert any("开始节点" in error for error in errors)
|
|
|
|
def test_validate_duplicate_node_id(self):
|
|
"""测试验证重复节点ID"""
|
|
nodes = [
|
|
{"id": "start-1", "type": "start"},
|
|
{"id": "start-1", "type": "llm"}, # 重复ID
|
|
{"id": "end-1", "type": "end"}
|
|
]
|
|
edges = []
|
|
|
|
validator = WorkflowValidator(nodes, edges)
|
|
is_valid, errors, warnings = validator.validate()
|
|
|
|
assert is_valid is False
|
|
assert any("重复" in error for error in errors)
|
|
|
|
def test_validate_cycle_detection(self):
|
|
"""测试循环检测"""
|
|
nodes = [
|
|
{"id": "start-1", "type": "start"},
|
|
{"id": "node-1", "type": "llm"},
|
|
{"id": "node-2", "type": "llm"}
|
|
]
|
|
edges = [
|
|
{"id": "e1", "source": "start-1", "target": "node-1"},
|
|
{"id": "e2", "source": "node-1", "target": "node-2"},
|
|
{"id": "e3", "source": "node-2", "target": "node-1"} # 形成循环
|
|
]
|
|
|
|
validator = WorkflowValidator(nodes, edges)
|
|
is_valid, errors, warnings = validator.validate()
|
|
|
|
assert is_valid is False
|
|
assert any("循环" in error for error in errors)
|
|
|
|
def test_validate_invalid_edge(self):
|
|
"""测试验证无效边"""
|
|
nodes = [
|
|
{"id": "start-1", "type": "start"},
|
|
{"id": "end-1", "type": "end"}
|
|
]
|
|
edges = [
|
|
{"id": "e1", "source": "nonexistent", "target": "end-1"} # 源节点不存在
|
|
]
|
|
|
|
validator = WorkflowValidator(nodes, edges)
|
|
is_valid, errors, warnings = validator.validate()
|
|
|
|
assert is_valid is False
|
|
assert any("不存在" in error for error in errors)
|
|
|
|
def test_validate_condition_branches(self):
|
|
"""测试验证条件节点分支"""
|
|
nodes = [
|
|
{"id": "start-1", "type": "start"},
|
|
{"id": "condition-1", "type": "condition"},
|
|
{"id": "end-1", "type": "end"}
|
|
]
|
|
edges = [
|
|
{"id": "e1", "source": "start-1", "target": "condition-1"},
|
|
{"id": "e2", "source": "condition-1", "target": "end-1", "sourceHandle": "true"}
|
|
# 缺少false分支
|
|
]
|
|
|
|
validator = WorkflowValidator(nodes, edges)
|
|
is_valid, errors, warnings = validator.validate()
|
|
|
|
# 缺少分支是警告,不是错误
|
|
assert is_valid is True
|
|
assert any("False分支" in warning for warning in warnings)
|