File size: 5,643 Bytes
246d201 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
"""Tests for the microagent system."""
import tempfile
from pathlib import Path
import pytest
from openhands.core.exceptions import MicroAgentValidationError
from openhands.microagent import (
BaseMicroAgent,
KnowledgeMicroAgent,
MicroAgentMetadata,
MicroAgentType,
RepoMicroAgent,
TaskMicroAgent,
load_microagents_from_dir,
)
CONTENT = (
'# dummy header\n' 'dummy content\n' '## dummy subheader\n' 'dummy subcontent\n'
)
def test_legacy_micro_agent_load(tmp_path):
"""Test loading of legacy microagents."""
legacy_file = tmp_path / '.openhands_instructions'
legacy_file.write_text(CONTENT)
micro_agent = BaseMicroAgent.load(legacy_file)
assert isinstance(micro_agent, RepoMicroAgent)
assert micro_agent.name == 'repo_legacy'
assert micro_agent.content == CONTENT
assert micro_agent.type == MicroAgentType.REPO_KNOWLEDGE
@pytest.fixture
def temp_microagents_dir():
"""Create a temporary directory with test microagents."""
with tempfile.TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
# Create test knowledge agent
knowledge_agent = """---
name: test_knowledge_agent
type: knowledge
version: 1.0.0
agent: CodeActAgent
triggers:
- test
- pytest
---
# Test Guidelines
Testing best practices and guidelines.
"""
(root / 'knowledge.md').write_text(knowledge_agent)
# Create test repo agent
repo_agent = """---
name: test_repo_agent
type: repo
version: 1.0.0
agent: CodeActAgent
---
# Test Repository Agent
Repository-specific test instructions.
"""
(root / 'repo.md').write_text(repo_agent)
# Create test task agent
task_agent = """---
name: test_task
type: task
version: 1.0.0
agent: CodeActAgent
---
# Test Task
Test task content
"""
(root / 'task.md').write_text(task_agent)
yield root
def test_knowledge_agent():
"""Test knowledge agent functionality."""
agent = KnowledgeMicroAgent(
name='test',
content='Test content',
metadata=MicroAgentMetadata(
name='test', type=MicroAgentType.KNOWLEDGE, triggers=['test', 'pytest']
),
source='test.md',
type=MicroAgentType.KNOWLEDGE,
)
assert agent.match_trigger('running a test') == 'test'
assert agent.match_trigger('using pytest') == 'test'
assert agent.match_trigger('no match here') is None
assert agent.triggers == ['test', 'pytest']
def test_load_microagents(temp_microagents_dir):
"""Test loading microagents from directory."""
repo_agents, knowledge_agents, task_agents = load_microagents_from_dir(
temp_microagents_dir
)
# Check knowledge agents
assert len(knowledge_agents) == 1
agent = knowledge_agents['test_knowledge_agent']
assert isinstance(agent, KnowledgeMicroAgent)
assert 'test' in agent.triggers
# Check repo agents
assert len(repo_agents) == 1
agent = repo_agents['test_repo_agent']
assert isinstance(agent, RepoMicroAgent)
# Check task agents
assert len(task_agents) == 1
agent = task_agents['test_task']
assert isinstance(agent, TaskMicroAgent)
def test_invalid_agent_type(temp_microagents_dir):
"""Test loading agent with invalid type."""
invalid_agent = """---
name: test_invalid
type: invalid
version: 1.0.0
agent: CodeActAgent
---
Invalid agent content
"""
(temp_microagents_dir / 'invalid.md').write_text(invalid_agent)
with pytest.raises(MicroAgentValidationError):
BaseMicroAgent.load(temp_microagents_dir / 'invalid.md')
def test_load_microagents_with_nested_dirs(temp_microagents_dir):
"""Test loading microagents from nested directories."""
# Create nested knowledge agent
nested_dir = temp_microagents_dir / 'nested' / 'dir'
nested_dir.mkdir(parents=True)
nested_agent = """---
name: nested_knowledge_agent
type: knowledge
version: 1.0.0
agent: CodeActAgent
triggers:
- nested
---
# Nested Test Guidelines
Testing nested directory loading.
"""
(nested_dir / 'nested.md').write_text(nested_agent)
repo_agents, knowledge_agents, task_agents = load_microagents_from_dir(
temp_microagents_dir
)
# Check that we can find the nested agent
assert len(knowledge_agents) == 2 # Original + nested
agent = knowledge_agents['nested_knowledge_agent']
assert isinstance(agent, KnowledgeMicroAgent)
assert 'nested' in agent.triggers
def test_load_microagents_with_trailing_slashes(temp_microagents_dir):
"""Test loading microagents when directory paths have trailing slashes."""
# Create a directory with trailing slash
knowledge_dir = temp_microagents_dir / 'knowledge/'
knowledge_dir.mkdir(exist_ok=True)
knowledge_agent = """---
name: trailing_knowledge_agent
type: knowledge
version: 1.0.0
agent: CodeActAgent
triggers:
- trailing
---
# Trailing Slash Test
Testing loading with trailing slashes.
"""
(knowledge_dir / 'trailing.md').write_text(knowledge_agent)
repo_agents, knowledge_agents, task_agents = load_microagents_from_dir(
str(temp_microagents_dir) + '/' # Add trailing slash to test
)
# Check that we can find the agent despite trailing slashes
assert len(knowledge_agents) == 2 # Original + trailing
agent = knowledge_agents['trailing_knowledge_agent']
assert isinstance(agent, KnowledgeMicroAgent)
assert 'trailing' in agent.triggers
|