"""工具语义搜索完整覆盖测试."""
import pytest
from unittest.mock import Mock, MagicMock, patch, AsyncMock
from src.tools import handle_tool_call
from src.config_manager import ConfigManager
class TestToolsSemanticSearchCompleteCoverage:
"""工具语义搜索完整覆盖测试类."""
@pytest.fixture
def config_manager(self, temp_config_dir):
"""创建配置管理器."""
return ConfigManager(config_path=temp_config_dir / ".graphitiace" / "config.json")
@pytest.mark.asyncio
async def test_semantic_search_semantic_type_with_results(self, config_manager):
"""测试语义搜索语义类型有结果."""
from src.graphiti_client import GraphitiClient
mock_client = Mock(spec=GraphitiClient)
mock_client.is_connected.return_value = True
mock_client.semantic_search = AsyncMock(return_value={
"success": True,
"message": "搜索成功",
"search_type": "semantic",
"results": [
{
"from_node": {"name": "Node1"},
"to_node": {"name": "Node2"},
"relationship": "RELATES_TO",
"description": "相关关系描述"
}
]
})
result = await handle_tool_call(
tool_name="semantic_search",
arguments={"query": "test"},
config_manager=config_manager,
graphiti_client=mock_client
)
assert result is not None
assert isinstance(result, list)
result_text = "".join([str(item.text) if hasattr(item, 'text') else str(item) for item in result])
assert "向量搜索" in result_text or "语义理解" in result_text or len(result_text) > 0
assert "找到" in result_text or "1" in result_text
@pytest.mark.asyncio
async def test_semantic_search_enhanced_keyword_type_with_results(self, config_manager):
"""测试语义搜索增强关键词类型有结果."""
from src.graphiti_client import GraphitiClient
mock_client = Mock(spec=GraphitiClient)
mock_client.is_connected.return_value = True
mock_client.semantic_search = AsyncMock(return_value={
"success": True,
"message": "搜索成功",
"search_type": "enhanced_keyword",
"results": [
{
"content": "这是一个很长的内容,应该会被截断到100个字符,然后显示省略号,因为内容长度超过了100个字符的限制。",
"name": "Entity1"
}
]
})
result = await handle_tool_call(
tool_name="semantic_search",
arguments={"query": "test"},
config_manager=config_manager,
graphiti_client=mock_client
)
assert result is not None
assert isinstance(result, list)
result_text = "".join([str(item.text) if hasattr(item, 'text') else str(item) for item in result])
assert "增强关键词" in result_text or "enhanced" in result_text.lower() or len(result_text) > 0
assert "找到" in result_text or "1" in result_text
@pytest.mark.asyncio
async def test_semantic_search_enhanced_keyword_without_content(self, config_manager):
"""测试语义搜索增强关键词类型无内容字段."""
from src.graphiti_client import GraphitiClient
mock_client = Mock(spec=GraphitiClient)
mock_client.is_connected.return_value = True
mock_client.semantic_search = AsyncMock(return_value={
"success": True,
"message": "搜索成功",
"search_type": "enhanced_keyword",
"results": [
{
"name": "Entity1",
"type": "Technology"
}
]
})
result = await handle_tool_call(
tool_name="semantic_search",
arguments={"query": "test"},
config_manager=config_manager,
graphiti_client=mock_client
)
assert result is not None
assert isinstance(result, list)
result_text = "".join([str(item.text) if hasattr(item, 'text') else str(item) for item in result])
assert len(result_text) > 0
@pytest.mark.asyncio
async def test_semantic_search_keyword_type_with_results(self, config_manager):
"""测试语义搜索关键词类型有结果."""
from src.graphiti_client import GraphitiClient
mock_client = Mock(spec=GraphitiClient)
mock_client.is_connected.return_value = True
mock_client.semantic_search = AsyncMock(return_value={
"success": True,
"message": "搜索成功",
"search_type": "keyword",
"results": [
{
"content": "Short content",
"name": "Entity1"
}
]
})
result = await handle_tool_call(
tool_name="semantic_search",
arguments={"query": "test"},
config_manager=config_manager,
graphiti_client=mock_client
)
assert result is not None
assert isinstance(result, list)
result_text = "".join([str(item.text) if hasattr(item, 'text') else str(item) for item in result])
assert "关键词搜索" in result_text or "keyword" in result_text.lower() or len(result_text) > 0
assert "找到" in result_text or "1" in result_text
@pytest.mark.asyncio
async def test_semantic_search_no_results_non_semantic_with_hint(self, config_manager):
"""测试语义搜索无结果(非语义类型,会显示提示)."""
from src.graphiti_client import GraphitiClient
mock_client = Mock(spec=GraphitiClient)
mock_client.is_connected.return_value = True
mock_client.semantic_search = AsyncMock(return_value={
"success": True,
"message": "搜索完成",
"search_type": "enhanced_keyword", # 非语义类型
"results": []
})
result = await handle_tool_call(
tool_name="semantic_search",
arguments={"query": "nonexistent"},
config_manager=config_manager,
graphiti_client=mock_client
)
assert result is not None
assert isinstance(result, list)
result_text = "".join([str(item.text) if hasattr(item, 'text') else str(item) for item in result])
assert "未找到" in result_text or "not found" in result_text.lower()
assert "提示" in result_text or "💡" in result_text or "API key" in result_text