feat: unify scoring and chat evidence pages
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
from fastapi.testclient import TestClient
|
||||
from sqlalchemy import select
|
||||
|
||||
from wisegrade import agent_tools
|
||||
from wisegrade.db import get_db
|
||||
from wisegrade.main import app
|
||||
from wisegrade.models import CourseVersion, CriterionScore, Project, RubricVersion, Student
|
||||
from wisegrade.models import (Conversation, CourseVersion, CriterionScore, KnowledgeChunk,
|
||||
KnowledgePage, Project, RubricVersion, Student)
|
||||
from wisegrade.rag import ingest
|
||||
from wisegrade.scoring import run_batch
|
||||
|
||||
|
||||
@@ -15,6 +18,44 @@ def client_for(session_factory):
|
||||
return TestClient(app)
|
||||
|
||||
|
||||
def test_file_page_has_text_and_image_virtual_page_has_text_only(session_factory, environment, monkeypatch):
|
||||
image = environment / "processed" / "course-1" / "report" / "page-49.png"
|
||||
image.parent.mkdir(parents=True)
|
||||
image.write_bytes(b"\x89PNG\r\n\x1a\n")
|
||||
vectors = lambda texts: [[0.1] * 1024 for _ in texts]
|
||||
with session_factory() as db:
|
||||
document = ingest(db, course_version_id=1, project_id=None, submission_file_id=None,
|
||||
title="课程报告.pdf", category="course", source_hash="file",
|
||||
pages=[{"page_number": 49, "text": "第四十九页完整文字", "tables": [{"rows": [["指标", "结果"]]}],
|
||||
"rendered_image_path": str(image)}], embedder=vectors)
|
||||
virtual = ingest(db, course_version_id=1, project_id=None, submission_file_id=None,
|
||||
title="系统生成规则", category="course", source_hash="virtual",
|
||||
pages=[{"page_number": 1, "text": "规则文字"}], embedder=vectors)
|
||||
assert db.get(KnowledgePage, (document.id, 49)).image_path == "course-1/report/page-49.png"
|
||||
chunk = db.scalar(select(KnowledgeChunk).where(KnowledgeChunk.document_id == document.id))
|
||||
monkeypatch.setattr(agent_tools, "retrieve", lambda *_, **__: [{"chunk_id": chunk.id,
|
||||
"document_id": document.id, "project_id": None, "page": 49, "text": chunk.text}])
|
||||
citation = agent_tools.execute(db, Conversation(course_version_id=1), "search_course_material",
|
||||
{"course_version_id": 1, "query": "完整文字"}, "")["citations"][0]
|
||||
assert citation["url"] == f"/api/knowledge/documents/{document.id}/pages/49"
|
||||
assert citation["image_url"] == citation["url"] + "/image"
|
||||
document_id, virtual_id = document.id, virtual.id
|
||||
client = client_for(session_factory)
|
||||
try:
|
||||
resource = client.get(f"/api/knowledge/documents/{document_id}/pages/49")
|
||||
assert resource.status_code == 200
|
||||
assert resource.json()["text"] == "第四十九页完整文字\n表格: [['指标', '结果']]"
|
||||
image_url = resource.json()["image_url"]
|
||||
assert image_url == f"/api/knowledge/documents/{document_id}/pages/49/image"
|
||||
assert client.get(image_url).content.startswith(b"\x89PNG")
|
||||
virtual_resource = client.get(f"/api/knowledge/documents/{virtual_id}/pages/1")
|
||||
assert virtual_resource.json()["text"] == "规则文字"
|
||||
assert virtual_resource.json()["image_url"] is None
|
||||
assert client.get(f"/api/knowledge/documents/{virtual_id}/pages/1/image").status_code == 404
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
|
||||
def test_course_and_rubric_versions_are_immutable(session_factory):
|
||||
client = client_for(session_factory)
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user