"""GraphitiClient 语义搜索回退测试."""
import pytest
from unittest.mock import Mock, MagicMock, patch, AsyncMock
from src.graphiti_client import GraphitiClient
from src.config_manager import ConfigManager
class TestGraphitiClientSemanticSearchFallback:
"""GraphitiClient 语义搜索回退测试类."""
@pytest.fixture
def config_manager(self, temp_config_dir):
"""创建配置管理器."""
return ConfigManager(config_path=temp_config_dir / ".graphitiace" / "config.json")
@pytest.fixture
def mock_client(self, config_manager):
"""创建 Mock 客户端."""
client = GraphitiClient(config_manager)
# 配置 API 和 Neo4j
config_manager.configure_api(
provider="openai",
api_key="test_key"
)
config_manager.configure_neo4j(
uri="bolt://localhost:7687",
username="neo4j",
password="test"
)
# Mock driver 和 session
mock_driver = Mock()
mock_session = Mock()
mock_driver.session.return_value.__enter__ = Mock(return_value=mock_session)
mock_driver.session.return_value.__exit__ = Mock(return_value=None)
client.driver = mock_driver
client._connected = True
# Mock Graphiti(搜索时抛出异常,触发回退)
mock_graphiti = Mock()
mock_graphiti.search = AsyncMock(side_effect=Exception("Search error"))
client.graphiti = mock_graphiti
client._graphiti_initialized = True
# Mock search_entities(回退方法)
client.search_entities = Mock(return_value={
"success": True,
"message": "搜索成功",
"results": []
})
return client, mock_session, mock_graphiti
@pytest.mark.asyncio
async def test_semantic_search_fallback_on_error(self, mock_client):
"""测试语义搜索异常时回退到基础搜索(行1153-1156)."""
client, mock_session, mock_graphiti = mock_client
result = await client.semantic_search(
query="TypeScript",
num_results=10
)
assert result is not None
# 应该回退到 search_entities
client.search_entities.assert_called_once()