fix(kb): 完善知识库入库和重建索引
This commit is contained in:
@@ -3,6 +3,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.urls import reverse
|
||||
|
||||
from review_agent.knowledge_base import build_knowledge_base_context, delete_document, search_knowledge_base
|
||||
from review_agent.views import rebuild_knowledge_base_index
|
||||
from review_agent.models import KnowledgeBaseDocument
|
||||
|
||||
|
||||
@@ -16,6 +17,7 @@ def test_knowledge_base_context_reports_rule_and_sources():
|
||||
assert context["rule"]["requirement_count"] > 0
|
||||
assert context["source_count"] > 0
|
||||
assert context["collection_name"] == "nmpa_ivd_registration_v1"
|
||||
assert not any("模拟题二" in source["relative_path"] for source in context["sources"])
|
||||
|
||||
|
||||
def test_knowledge_base_page_requires_login(client):
|
||||
@@ -36,6 +38,11 @@ def test_knowledge_base_page_renders_for_user(client, django_user_model):
|
||||
content = response.content.decode("utf-8")
|
||||
tabbar = content[content.index('<div class="tabbar"') : content.index("</div>", content.index('<div class="tabbar"'))]
|
||||
assert tabbar.index("审核智能体") < tabbar.index("知识库管理") < tabbar.index("附件管理")
|
||||
assert "data-rebuild-url=" in content
|
||||
assert 'id="knowledgeRebuildIndexButton"' in content
|
||||
assert "重建索引" in content
|
||||
assert 'data-source-action="index"' in content
|
||||
assert "手动入库" in content
|
||||
|
||||
|
||||
def test_knowledge_base_status_api(client, django_user_model):
|
||||
@@ -48,6 +55,53 @@ def test_knowledge_base_status_api(client, django_user_model):
|
||||
assert response.json()["rule"]["code"] == "nmpa_ivd_registration_v1"
|
||||
|
||||
|
||||
def test_knowledge_base_rebuild_index_api(client, django_user_model, monkeypatch):
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
client.force_login(user)
|
||||
calls = []
|
||||
|
||||
monkeypatch.setattr(
|
||||
"review_agent.views.rebuild_knowledge_base_index",
|
||||
lambda: calls.append("rebuild") or {"chunk_count": 12},
|
||||
)
|
||||
|
||||
response = client.post(reverse("knowledge_base_rebuild_index"))
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json()["chunk_count"] == 12
|
||||
assert response.json()["knowledge_base"]["collection"]["count"] >= 0
|
||||
assert calls == ["rebuild"]
|
||||
|
||||
|
||||
def test_rebuild_knowledge_base_index_requests_reset(settings, tmp_path, monkeypatch):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
settings.REGULATORY_RAG_CHROMA_PATH = tmp_path / "chroma"
|
||||
settings.REGULATORY_RAG_CHROMA_PATH.mkdir()
|
||||
stale_file = settings.REGULATORY_RAG_CHROMA_PATH / "chroma.sqlite3"
|
||||
stale_file.write_text("stale", encoding="utf-8")
|
||||
calls = []
|
||||
|
||||
monkeypatch.setattr("review_agent.views.load_rule_file", lambda: {"source_material_dir": "docs/0.原始材料"})
|
||||
monkeypatch.setattr("review_agent.views.get_embedding_provider", lambda: "provider")
|
||||
monkeypatch.setattr(
|
||||
"review_agent.views.build_chroma_index",
|
||||
lambda source_dir, embedding_provider, reset=False: calls.append(
|
||||
{
|
||||
"source_dir": source_dir,
|
||||
"embedding_provider": embedding_provider,
|
||||
"reset": reset,
|
||||
}
|
||||
)
|
||||
or 8,
|
||||
)
|
||||
|
||||
payload = rebuild_knowledge_base_index()
|
||||
|
||||
assert payload["chunk_count"] == 8
|
||||
assert calls[0]["embedding_provider"] == "provider"
|
||||
assert calls[0]["reset"] is True
|
||||
|
||||
|
||||
def test_knowledge_base_search_rejects_blank_query():
|
||||
payload = search_knowledge_base("")
|
||||
|
||||
@@ -103,6 +157,8 @@ def test_knowledge_base_search_api_returns_payload(client, django_user_model):
|
||||
|
||||
def test_knowledge_base_document_crud_api(client, settings, tmp_path, django_user_model):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
settings.REGULATORY_RAG_CHROMA_PATH = tmp_path / "chroma"
|
||||
settings.REGULATORY_RAG_PROVIDER = "deterministic"
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
client.force_login(user)
|
||||
|
||||
@@ -199,6 +255,8 @@ def test_knowledge_base_document_api_is_scoped_to_owner(client, django_user_mode
|
||||
|
||||
def test_knowledge_base_document_manual_index_api(client, settings, tmp_path, django_user_model):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
settings.REGULATORY_RAG_CHROMA_PATH = tmp_path / "chroma"
|
||||
settings.REGULATORY_RAG_PROVIDER = "deterministic"
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
client.force_login(user)
|
||||
source_path = tmp_path / "manual.md"
|
||||
|
||||
Reference in New Issue
Block a user