149 lines
5.0 KiB
Python
149 lines
5.0 KiB
Python
import tempfile
|
|
import unittest
|
|
from types import SimpleNamespace
|
|
from unittest.mock import AsyncMock
|
|
|
|
from api.routers.knowledge import (
|
|
confirm_document_upload,
|
|
delete_document,
|
|
get_document,
|
|
list_documents,
|
|
preview_document_upload,
|
|
)
|
|
from service.knowledge_base.upload import KnowledgeUploadService
|
|
from types import SimpleNamespace
|
|
|
|
|
|
class FakeUpload:
|
|
def __init__(self, filename, content):
|
|
self.filename = filename
|
|
self._content = content
|
|
|
|
async def read(self):
|
|
return self._content
|
|
|
|
|
|
class FakeRequest:
|
|
def __init__(self, service, form_data=None, json_data=None):
|
|
self.app = SimpleNamespace(state=SimpleNamespace(knowledge_upload_service=service))
|
|
self.form_data = form_data
|
|
self.json_data = json_data
|
|
|
|
async def form(self):
|
|
return self.form_data
|
|
|
|
async def json(self):
|
|
return self.json_data
|
|
|
|
|
|
class KnowledgeRouterTests(unittest.IsolatedAsyncioTestCase):
|
|
async def test_preview_endpoint_accepts_file_and_manual_strategy(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
service = KnowledgeUploadService(
|
|
storage_dir=tmp,
|
|
milvus_client=AsyncMock(),
|
|
embedder=AsyncMock(),
|
|
publisher=AsyncMock(),
|
|
)
|
|
request = FakeRequest(
|
|
service,
|
|
{
|
|
"file": FakeUpload("faq.md", b"Q: Q\nA: A"),
|
|
"strategy": "qa_pair",
|
|
},
|
|
)
|
|
|
|
response = await preview_document_upload(
|
|
request,
|
|
SimpleNamespace(user_type="ADMIN", employee_role=None),
|
|
)
|
|
|
|
self.assertEqual(response.code, 200)
|
|
self.assertEqual(response.data["strategy"], "qa_pair")
|
|
|
|
async def test_confirm_endpoint_returns_ingestion_result(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
service = KnowledgeUploadService(
|
|
storage_dir=tmp,
|
|
milvus_client=AsyncMock(),
|
|
embedder=AsyncMock(return_value=[[0.0] * 768]),
|
|
publisher=AsyncMock(),
|
|
)
|
|
preview = await service.preview("faq.md", b"Q: Q\nA: A", strategy="qa_pair")
|
|
request = FakeRequest(
|
|
service,
|
|
json_data={
|
|
"upload_id": preview["upload_id"],
|
|
"title": "FAQ",
|
|
"doc_id": "doc-1",
|
|
"collection_name": "fin_faq",
|
|
"strategy": "qa_pair",
|
|
},
|
|
)
|
|
|
|
response = await confirm_document_upload(
|
|
request,
|
|
SimpleNamespace(user_type="ADMIN", employee_role=None),
|
|
)
|
|
|
|
self.assertEqual(response.code, 200)
|
|
self.assertEqual(response.data["doc_id"], "doc-1")
|
|
|
|
async def test_delete_endpoint_returns_deleted_document(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
service = KnowledgeUploadService(
|
|
storage_dir=tmp,
|
|
milvus_client=AsyncMock(),
|
|
embedder=AsyncMock(),
|
|
publisher=AsyncMock(),
|
|
)
|
|
request = FakeRequest(service, json_data={"doc_id": "doc-delete-1"})
|
|
|
|
response = await delete_document(
|
|
request,
|
|
"doc-delete-1",
|
|
SimpleNamespace(user_type="ADMIN", employee_role=None),
|
|
)
|
|
|
|
self.assertEqual(response.code, 200)
|
|
self.assertEqual(response.data, {"doc_id": "doc-delete-1", "deleted": True})
|
|
|
|
async def test_list_endpoint_returns_documents(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
service = KnowledgeUploadService(
|
|
storage_dir=tmp,
|
|
milvus_client=AsyncMock(),
|
|
embedder=AsyncMock(),
|
|
publisher=AsyncMock(),
|
|
)
|
|
service.list_documents = AsyncMock(return_value=[{"doc_id": "doc-1"}])
|
|
response = await list_documents(
|
|
FakeRequest(service),
|
|
SimpleNamespace(user_type="ADMIN", employee_role=None),
|
|
)
|
|
|
|
self.assertEqual(response.code, 200)
|
|
self.assertEqual(response.data, [{"doc_id": "doc-1"}])
|
|
|
|
async def test_detail_endpoint_returns_document(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
service = KnowledgeUploadService(
|
|
storage_dir=tmp,
|
|
milvus_client=AsyncMock(),
|
|
embedder=AsyncMock(),
|
|
publisher=AsyncMock(),
|
|
)
|
|
service.get_document = AsyncMock(return_value={"doc_id": "doc-1"})
|
|
response = await get_document(
|
|
FakeRequest(service),
|
|
"doc-1",
|
|
SimpleNamespace(user_type="ADMIN", employee_role=None),
|
|
)
|
|
|
|
self.assertEqual(response.code, 200)
|
|
self.assertEqual(response.data, {"doc_id": "doc-1"})
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|