feat: auto committed

This commit is contained in:
SpecialX
2026-07-10 18:57:39 +08:00
parent c09d6fb7d2
commit 9ea81f1bd7
96 changed files with 13000 additions and 392 deletions

View File

@@ -0,0 +1,133 @@
"""Pydantic 模型校验测试."""
import pytest
from pydantic import ValidationError
from src.ai.models.chat import ChatData, ChatMessage, ChatRequest, Usage
from src.ai.models.expression import OptimizeExpressionRequest
from src.ai.models.question import GeneratedQuestionData, GenerateQuestionRequest
from src.ai.models.workflow import (
ConfirmRequest,
LessonPreparationRequest,
WorkflowStatusData,
)
class TestChatModels:
"""聊天模型测试."""
def test_chat_message_valid(self) -> None:
msg = ChatMessage(role="user", content="hello")
assert msg.role == "user"
def test_chat_message_empty_content_rejected(self) -> None:
with pytest.raises(ValidationError):
ChatMessage(role="user", content="")
def test_chat_message_invalid_role(self) -> None:
with pytest.raises(ValidationError):
ChatMessage(role="invalid", content="text")
def test_chat_request_defaults(self) -> None:
req = ChatRequest(messages=[ChatMessage(role="user", content="hi")])
assert req.model == "gpt-4o-mini"
assert req.temperature == 0.7
assert req.stream is False
def test_chat_request_empty_messages_rejected(self) -> None:
with pytest.raises(ValidationError):
ChatRequest(messages=[])
def test_chat_request_temperature_range(self) -> None:
with pytest.raises(ValidationError):
ChatRequest(
messages=[ChatMessage(role="user", content="hi")],
temperature=3.0,
)
def test_usage_defaults(self) -> None:
usage = Usage()
assert usage.prompt_tokens == 0
assert usage.total_tokens == 0
def test_chat_data_degraded_fields(self) -> None:
data = ChatData(
content="x", model="m", usage=Usage(),
degraded=True, degraded_reason="test",
)
assert data.degraded is True
class TestQuestionModels:
"""题目模型测试."""
def test_generate_question_request_defaults(self) -> None:
req = GenerateQuestionRequest(prompt="生成题", subject="数学")
assert req.difficulty == "medium"
assert req.question_type == "short_answer"
assert req.count == 1
def test_invalid_difficulty(self) -> None:
with pytest.raises(ValidationError):
GenerateQuestionRequest(prompt="x", subject="数学", difficulty="impossible")
def test_invalid_question_type(self) -> None:
with pytest.raises(ValidationError):
GenerateQuestionRequest(prompt="x", subject="数学", question_type="invalid")
def test_count_range(self) -> None:
with pytest.raises(ValidationError):
GenerateQuestionRequest(prompt="x", subject="数学", count=0)
with pytest.raises(ValidationError):
GenerateQuestionRequest(prompt="x", subject="数学", count=11)
def test_generated_question_data_defaults(self) -> None:
data = GeneratedQuestionData(question="q", answer="a", explanation="e")
assert data.question_type == "short_answer"
assert data.degraded is False
assert data.evaluation_score is None
class TestExpressionModels:
"""表达优化模型测试."""
def test_valid_request(self) -> None:
req = OptimizeExpressionRequest(text="优化这段")
assert req.text == "优化这段"
assert req.context == ""
def test_empty_text_rejected(self) -> None:
with pytest.raises(ValidationError):
OptimizeExpressionRequest(text="")
class TestWorkflowModels:
"""工作流模型测试."""
def test_lesson_preparation_request_defaults(self) -> None:
req = LessonPreparationRequest(
class_id="c-1",
subject_id="math",
topic="代数",
)
assert req.target_difficulty == "medium"
assert req.question_count == 5
def test_question_count_range(self) -> None:
with pytest.raises(ValidationError):
LessonPreparationRequest(
class_id="c-1",
subject_id="math",
topic="t",
question_count=0,
)
def test_confirm_request_optional(self) -> None:
req = ConfirmRequest()
assert req.modifications is None
def test_workflow_status_data_defaults(self) -> None:
data = WorkflowStatusData(workflow_id="wf-1", status="pending")
assert data.questions == []
assert data.error is None
assert data.degraded is False