| | """ |
| | Test Skill Tool |
| | |
| | Tests for skill tools after Progressive Disclosure optimization: |
| | - Only GetSkillTool remains (ListSkillsTool and UseSkillTool removed) |
| | - Tests verify the single-tool approach |
| | """ |
| |
|
| | import tempfile |
| | from pathlib import Path |
| |
|
| | import pytest |
| |
|
| | from mini_agent.tools.skill_loader import SkillLoader |
| | from mini_agent.tools.skill_tool import GetSkillTool, create_skill_tools |
| |
|
| |
|
| | def create_test_skill(skill_dir: Path, name: str, description: str, content: str): |
| | """Create a test skill""" |
| | skill_file = skill_dir / "SKILL.md" |
| | skill_content = f"""--- |
| | name: {name} |
| | description: {description} |
| | --- |
| | |
| | {content} |
| | """ |
| | skill_file.write_text(skill_content, encoding="utf-8") |
| |
|
| |
|
| | @pytest.fixture |
| | def skill_loader(): |
| | """Create a loader with test skills""" |
| | with tempfile.TemporaryDirectory() as tmpdir: |
| | |
| | for i in range(2): |
| | skill_dir = Path(tmpdir) / f"test-skill-{i}" |
| | skill_dir.mkdir() |
| | create_test_skill( |
| | skill_dir, |
| | f"test-skill-{i}", |
| | f"Test skill {i} description", |
| | f"Test skill {i} content and instructions.", |
| | ) |
| |
|
| | loader = SkillLoader(tmpdir) |
| | loader.discover_skills() |
| | yield loader |
| |
|
| |
|
| | @pytest.mark.asyncio |
| | async def test_get_skill_tool(skill_loader): |
| | """Test GetSkillTool""" |
| | tool = GetSkillTool(skill_loader) |
| |
|
| | result = await tool.execute(skill_name="test-skill-0") |
| |
|
| | assert result.success |
| | assert "test-skill-0" in result.content |
| | assert "Test skill 0 description" in result.content |
| | assert "Test skill 0 content" in result.content |
| |
|
| |
|
| | @pytest.mark.asyncio |
| | async def test_get_skill_tool_nonexistent(skill_loader): |
| | """Test getting non-existent skill""" |
| | tool = GetSkillTool(skill_loader) |
| |
|
| | result = await tool.execute(skill_name="nonexistent-skill") |
| |
|
| | assert not result.success |
| | assert "不存在" in result.error or "not exist" in result.error.lower() |
| |
|
| |
|
| | def test_create_skill_tools_returns_single_tool(skill_loader): |
| | """Test that create_skill_tools only returns GetSkillTool after optimization""" |
| | with tempfile.TemporaryDirectory() as tmpdir: |
| | skill_dir = Path(tmpdir) / "test-skill" |
| | skill_dir.mkdir() |
| | create_test_skill( |
| | skill_dir, "test-skill", "Test skill", "Test content" |
| | ) |
| |
|
| | tools, loader = create_skill_tools(tmpdir) |
| |
|
| | |
| | assert len(tools) == 1 |
| | assert isinstance(tools[0], GetSkillTool) |
| | assert loader is not None |
| |
|
| |
|
| | def test_tool_count_optimization(): |
| | """Verify Progressive Disclosure optimization: 3 tools -> 1 tool""" |
| | with tempfile.TemporaryDirectory() as tmpdir: |
| | |
| | skill_dir = Path(tmpdir) / "simple-skill" |
| | skill_dir.mkdir() |
| | create_test_skill( |
| | skill_dir, "simple-skill", "Simple test", "Content" |
| | ) |
| |
|
| | tools, _ = create_skill_tools(tmpdir) |
| |
|
| | |
| | |
| | assert len(tools) == 1 |
| |
|
| | |
| | tool = tools[0] |
| | assert tool.name == "get_skill" |
| | assert "get complete content" in tool.description.lower() or "获取" in tool.description |
| |
|