test: use PostgreSQL and live model integrations
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user