本次同步 09-12 至 09-28 的代码变更,主要内容: 新增功能 - 修改密码:后端新增 ChangePasswordRequest DTO 与UserController/UserService 对应接口,前端新增 ChangePasswordDialog 并在 Header 接入入口 - 文件预览组件重构:file-preview 目录拆分出 VideoPreview(支持 blobUrl 直传)、 ImagePreview、AudioPreview,index.tsx 统一调度各类型预览器 - 新增 my_ops 算子模块:markitdown_parser、mineru_pdf_parser、text_quality_evaluator - 新增 tools/minio-file-server MinIO 文件服务 功能增强 - 数据清洗:cleaning_task_service/scheduler/routes 重构, data_juicer_executor 与 wrapper 增强,OperatorTable/LogsTable/TaskDetail 同步调整 - 数据标注:annotation sync.py、project.py 接口与schema 更新 - 数据采集、算子市场、首页与菜单路由相关页面调整 - DataJuicer 算子接入(useOperatorOperations、dj_ops_schema) 结构调整 - deepflow/ 更名为 deep-flow/(419 个文件重命名) - 新增 helm 部署编排、GitHub Actions 之外的自建镜像构建脚本 未纳入本次提交 - scripts-backup/、runtime/python-executor-backup/、components_backup/(备份目录) - *.backup*、__pycache__ 产物 - zh_core_web_sm-3.8.0-py3-none-any.whl(46MB 构建产物) - DataX/(内嵌独立仓库,远程亦未收录其源码)
125 lines
4.0 KiB
Python
125 lines
4.0 KiB
Python
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from unittest.mock import Mock, patch
|
|
|
|
import pytest
|
|
from langchain_core.callbacks import (
|
|
AsyncCallbackManagerForToolRun,
|
|
CallbackManagerForToolRun,
|
|
)
|
|
|
|
from src.rag import Chunk, Document, Resource, Retriever
|
|
from src.tools.retriever import RetrieverInput, RetrieverTool, get_retriever_tool
|
|
|
|
|
|
def test_retriever_input_model():
|
|
input_data = RetrieverInput(keywords="test keywords")
|
|
assert input_data.keywords == "test keywords"
|
|
|
|
|
|
def test_retriever_tool_init():
|
|
mock_retriever = Mock(spec=Retriever)
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
tool = RetrieverTool(retriever=mock_retriever, resources=resources)
|
|
|
|
assert tool.name == "local_search_tool"
|
|
assert "retrieving information" in tool.description
|
|
assert tool.args_schema == RetrieverInput
|
|
assert tool.retriever == mock_retriever
|
|
assert tool.resources == resources
|
|
|
|
|
|
def test_retriever_tool_run_with_results():
|
|
mock_retriever = Mock(spec=Retriever)
|
|
chunk = Chunk(content="test content", similarity=0.9)
|
|
doc = Document(id="doc1", chunks=[chunk])
|
|
mock_retriever.query_relevant_documents.return_value = [doc]
|
|
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
tool = RetrieverTool(retriever=mock_retriever, resources=resources)
|
|
|
|
result = tool._run("test keywords")
|
|
|
|
mock_retriever.query_relevant_documents.assert_called_once_with(
|
|
"test keywords", resources
|
|
)
|
|
assert isinstance(result, list)
|
|
assert len(result) == 1
|
|
assert result[0] == doc.to_dict()
|
|
|
|
|
|
def test_retriever_tool_run_no_results():
|
|
mock_retriever = Mock(spec=Retriever)
|
|
mock_retriever.query_relevant_documents.return_value = []
|
|
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
tool = RetrieverTool(retriever=mock_retriever, resources=resources)
|
|
|
|
result = tool._run("test keywords")
|
|
|
|
assert result == "No results found from the local knowledge base."
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_retriever_tool_arun():
|
|
mock_retriever = Mock(spec=Retriever)
|
|
chunk = Chunk(content="async content", similarity=0.8)
|
|
doc = Document(id="doc2", chunks=[chunk])
|
|
mock_retriever.query_relevant_documents.return_value = [doc]
|
|
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
tool = RetrieverTool(retriever=mock_retriever, resources=resources)
|
|
|
|
mock_run_manager = Mock(spec=AsyncCallbackManagerForToolRun)
|
|
mock_sync_manager = Mock(spec=CallbackManagerForToolRun)
|
|
mock_run_manager.get_sync.return_value = mock_sync_manager
|
|
|
|
result = await tool._arun("async keywords", mock_run_manager)
|
|
|
|
mock_run_manager.get_sync.assert_called_once()
|
|
assert isinstance(result, list)
|
|
assert len(result) == 1
|
|
assert result[0] == doc.to_dict()
|
|
|
|
|
|
@patch("src.tools.retriever.build_retriever")
|
|
def test_get_retriever_tool_success(mock_build_retriever):
|
|
mock_retriever = Mock(spec=Retriever)
|
|
mock_build_retriever.return_value = mock_retriever
|
|
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
tool = get_retriever_tool(resources)
|
|
|
|
assert isinstance(tool, RetrieverTool)
|
|
assert tool.retriever == mock_retriever
|
|
assert tool.resources == resources
|
|
|
|
|
|
def test_get_retriever_tool_empty_resources():
|
|
result = get_retriever_tool([])
|
|
assert result is None
|
|
|
|
|
|
@patch("src.tools.retriever.build_retriever")
|
|
def test_get_retriever_tool_no_retriever(mock_build_retriever):
|
|
mock_build_retriever.return_value = None
|
|
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
result = get_retriever_tool(resources)
|
|
|
|
assert result is None
|
|
|
|
|
|
def test_retriever_tool_run_with_callback_manager():
|
|
mock_retriever = Mock(spec=Retriever)
|
|
mock_retriever.query_relevant_documents.return_value = []
|
|
|
|
resources = [Resource(uri="test://uri", title="Test")]
|
|
tool = RetrieverTool(retriever=mock_retriever, resources=resources)
|
|
|
|
mock_callback_manager = Mock(spec=CallbackManagerForToolRun)
|
|
result = tool._run("test keywords", mock_callback_manager)
|
|
|
|
assert result == "No results found from the local knowledge base."
|