""" 工作流验证器测试 """ 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)