|
|
""" |
|
|
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 |
|
|
|