Files
aiagent/backend/tests/test_workflow_validator.py

116 lines
3.8 KiB
Python
Raw Permalink Normal View History

2026-01-19 00:09:36 +08:00
"""
工作流验证器测试
"""
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)