fischer-agentkit/tests/unit/test_cli_skill_learn_risk_g...

85 lines
3.6 KiB
Python

"""CLI skill learn-risk-guards 命令单元测试"""
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from typer.testing import CliRunner
from agentkit.evolution.risk_guard_learner import RiskGuardSuggestion
runner = CliRunner()
def _make_suggestion(skill_name="code_reviewer", precondition="需要代码输入", confidence=0.8, reason="避免空输入"):
return RiskGuardSuggestion(
skill_name=skill_name,
precondition=precondition,
confidence=confidence,
reason=reason,
source_experience_ids=["e1", "e2"],
)
class TestLearnRiskGuardsCommand:
def test_renders_suggestions_with_human_review_notice(self):
"""learn() 返回 2 条建议 → 输出含 Rich 表格 + '人工审查' 提示"""
from agentkit.cli.main import app
mock_learner = MagicMock()
mock_learner.learn = AsyncMock(return_value=[_make_suggestion(), _make_suggestion("monitor", "需要网络", 0.6)])
with patch("agentkit.cli.skill._build_risk_guard_learner", return_value=mock_learner):
result = runner.invoke(app, ["skill", "learn-risk-guards"])
assert result.exit_code == 0
assert "人工审查" in result.stdout
assert "code_reviewer" in result.stdout
assert "monitor" in result.stdout
assert "需要代码输入" in result.stdout
def test_empty_suggestions_message(self):
"""learn() 返回空 → 输出'未从失败轨迹中学习到风险守卫建议'"""
from agentkit.cli.main import app
mock_learner = MagicMock()
mock_learner.learn = AsyncMock(return_value=[])
with patch("agentkit.cli.skill._build_risk_guard_learner", return_value=mock_learner):
result = runner.invoke(app, ["skill", "learn-risk-guards"])
assert result.exit_code == 0
assert "未从失败轨迹中学习到风险守卫建议" in result.stdout
def test_learner_build_failure_exits_nonzero(self):
"""_build_risk_guard_learner 返回 None → 错误信息 + 非零退出"""
from agentkit.cli.main import app
with patch("agentkit.cli.skill._build_risk_guard_learner", return_value=None):
result = runner.invoke(app, ["skill", "learn-risk-guards"])
assert result.exit_code == 1
assert "无法构建" in result.stdout or "Error" in result.stdout
def test_skill_option_passed_to_learn(self):
"""--skill 参数透传给 learn(skill_name=...)"""
from agentkit.cli.main import app
mock_learner = MagicMock()
mock_learner.learn = AsyncMock(return_value=[])
with patch("agentkit.cli.skill._build_risk_guard_learner", return_value=mock_learner):
result = runner.invoke(app, ["skill", "learn-risk-guards", "--skill", "code_reviewer"])
assert result.exit_code == 0
mock_learner.learn.assert_called_once_with(skill_name="code_reviewer", top_k=20)
def test_top_k_option_passed_to_learn(self):
from agentkit.cli.main import app
mock_learner = MagicMock()
mock_learner.learn = AsyncMock(return_value=[])
with patch("agentkit.cli.skill._build_risk_guard_learner", return_value=mock_learner):
result = runner.invoke(app, ["skill", "learn-risk-guards", "--top-k", "50"])
assert result.exit_code == 0
mock_learner.learn.assert_called_once_with(skill_name=None, top_k=50)
def test_server_url_not_supported(self):
"""--server-url 远程模式暂不支持"""
from agentkit.cli.main import app
result = runner.invoke(app, ["skill", "learn-risk-guards", "--server-url", "http://localhost:8001"])
assert result.exit_code == 1