fischer-agentkit/tests/unit/test_skill_registry.py

120 lines
3.9 KiB
Python

"""SkillRegistry 单元测试"""
import pytest
from agentkit.core.exceptions import SkillNotFoundError
from agentkit.skills.base import SkillConfig, Skill
from agentkit.skills.registry import SkillRegistry
def _make_skill(name: str = "test_skill") -> Skill:
config = SkillConfig.from_dict({
"name": name,
"agent_type": "test",
"task_mode": "llm_generate",
"prompt": {"identity": f"测试技能 {name}"},
})
return Skill(config)
class TestSkillRegistry:
"""SkillRegistry 注册中心测试"""
def test_register_registers_skill(self):
registry = SkillRegistry()
skill = _make_skill("skill_a")
registry.register(skill)
assert registry.has_skill("skill_a")
def test_unregister_removes_skill(self):
registry = SkillRegistry()
skill = _make_skill("skill_b")
registry.register(skill)
registry.unregister("skill_b")
assert not registry.has_skill("skill_b")
def test_get_by_name_returns_skill(self):
registry = SkillRegistry()
skill = _make_skill("skill_c")
registry.register(skill)
result = registry.get("skill_c")
assert result is skill
def test_get_nonexistent_raises_skill_not_found_error(self):
registry = SkillRegistry()
with pytest.raises(SkillNotFoundError):
registry.get("nonexistent")
def test_list_skills_returns_all_registered(self):
registry = SkillRegistry()
registry.register(_make_skill("s1"))
registry.register(_make_skill("s2"))
registry.register(_make_skill("s3"))
skills = registry.list_skills()
names = [s.name for s in skills]
assert "s1" in names
assert "s2" in names
assert "s3" in names
def test_list_skills_empty_registry(self):
registry = SkillRegistry()
assert registry.list_skills() == []
def test_update_skill_updates_config(self):
registry = SkillRegistry()
skill = _make_skill("updatable")
registry.register(skill)
new_config = SkillConfig.from_dict({
"name": "updatable",
"agent_type": "updated_type",
"task_mode": "llm_generate",
"prompt": {"identity": "更新后的技能"},
"execution_mode": "direct",
})
updated = registry.update_skill("updatable", new_config)
assert updated.config.agent_type == "updated_type"
assert updated.config.execution_mode == "direct"
def test_update_nonexistent_skill_raises_error(self):
registry = SkillRegistry()
new_config = SkillConfig.from_dict({
"name": "ghost",
"agent_type": "ghost_type",
"task_mode": "llm_generate",
"prompt": {"identity": "幽灵"},
})
with pytest.raises(SkillNotFoundError):
registry.update_skill("ghost", new_config)
def test_has_skill_returns_true(self):
registry = SkillRegistry()
registry.register(_make_skill("exists"))
assert registry.has_skill("exists") is True
def test_has_skill_returns_false(self):
registry = SkillRegistry()
assert registry.has_skill("nope") is False
def test_duplicate_registration_overwrites_old(self):
registry = SkillRegistry()
skill_v1 = _make_skill("dup")
registry.register(skill_v1)
# 用新 config 创建同名 skill
new_config = SkillConfig.from_dict({
"name": "dup",
"agent_type": "v2_type",
"task_mode": "llm_generate",
"prompt": {"identity": "V2"},
})
skill_v2 = Skill(new_config)
registry.register(skill_v2)
result = registry.get("dup")
assert result.config.agent_type == "v2_type"
def test_unregister_nonexistent_no_error(self):
registry = SkillRegistry()
registry.unregister("nonexistent") # 不应抛异常