test: use PostgreSQL and live model integrations

This commit is contained in:
2026-09-25 20:30:28 +08:00
parent dd48e13cf2
commit 8bebcdb470
9 changed files with 144 additions and 77 deletions
+12 -30
View File
@@ -4,37 +4,13 @@ from pathlib import Path
import pymupdf as fitz
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import select
from wisegrade.config import get_settings
from wisegrade.db import get_db
from wisegrade.llm import ConsistencyResult, FactResult, ScoreResult
from wisegrade.main import app
from wisegrade.models import CourseVersion, CriterionScore, RubricVersion, ScoringBatch, TeacherRevision
from wisegrade.rag import retrieve
from wisegrade.scoring import run_batch
from wisegrade.storage import scan
def fake_embed(texts):
return [[1.0] + [0.0] * 1023 for _ in texts]
class FakeModel:
def json_call(self, _prompt, payload, schema, images=None):
if schema is FactResult:
return FactResult(topic="自动化实践示例")
if schema is ConsistencyResult:
return ConsistencyResult()
criterion = payload["criterion"]
evidence = payload["evidence"][0]
return ScoreResult(criterion_id=criterion["criterion_id"], score=criterion["max_score"] / 2,
max_score=criterion["max_score"], reason="示例证据支持部分要求",
evidence=[{"chunk_id": evidence["chunk_id"], "page": evidence["page"],
"quote": evidence["text"][:min(12, len(evidence["text"]))]}],
missing_evidence=[], suggestion="补充量化论证", confidence=.7)
def make_pdf(path, title):
pdf = fitz.open()
page = pdf.new_page()
@@ -70,14 +46,20 @@ def test_docs_examples_end_to_end(environment, session_factory):
response = client.post("/api/scoring-batches", json={"course_version_id": 1, "rubric_version_id": 1})
assert response.status_code == 200, response.text
batch_id = response.json()["id"]
run_batch(batch_id, session_factory=session_factory, client_factory=lambda db, batch: FakeModel(), embedder=fake_embed,
retriever=lambda db, **kwargs: retrieve(db, embedder=fake_embed, **kwargs))
run_batch(batch_id, session_factory=session_factory)
progress = client.get(f"/api/scoring-batches/{batch_id}/progress").json()
assert progress["status"] == "completed", progress
assert progress["progress_done"] == progress["progress_total"] == 22
result = client.get(f"/api/projects/{project_id}/scores?batch_id={batch_id}").json()
assert result["totals"]["overall"] == 50
assert all(row["evidence"] and row["evidence"][0]["page"] >= 1 for row in result["rows"])
assert client.get(result["rows"][0]["evidence"][0]["image_url"]).content[:8] == b"\x89PNG\r\n\x1a\n"
assert result["totals"]["overall"] is not None
assert all(row["status"] == "scored" and
(row["model_score"] == 0 or row["evidence"] and row["evidence"][0]["page"] >= 1)
for row in result["rows"]), result["rows"]
evidence_row = next(row for row in result["rows"] if row["evidence"] and row["evidence"][0]["image_url"])
assert client.get(evidence_row["evidence"][0]["image_url"]).content[:8] == b"\x89PNG\r\n\x1a\n"
score_id = result["rows"][0]["score_id"]
reviewed = client.put(f"/api/criterion-scores/{score_id}/review", json={"score": 20, "comment": "教师核定", "reason": "核查原文"})
teacher_score = 0 if result["rows"][0]["model_score"] != 0 else 1
reviewed = client.put(f"/api/criterion-scores/{score_id}/review", json={"score": teacher_score, "comment": "教师核定", "reason": "核查原文"})
assert reviewed.status_code == 200
assert reviewed.json()["model_score"] != reviewed.json()["teacher_score"]
assert len(client.get(f"/api/criterion-scores/{score_id}/revisions").json()) == 1