Files
Edu/services/ai/tests/test_prompt_service.py
2026-07-10 18:57:39 +08:00

90 lines
3.0 KiB
Python

"""Prompt 模板服务测试."""
from pathlib import Path
import pytest
from src.ai.errors import AIError, ErrorCode
from src.ai.prompt_service import PromptTemplateService
class TestPromptTemplateService:
"""PromptTemplateService 测试."""
def test_load_default_templates(self) -> None:
"""加载默认 prompts 目录的 5 个模板."""
svc = PromptTemplateService()
svc.load()
templates = svc.list_templates()
names = {t["name"] for t in templates}
assert "chat_system" in names
assert "generate_question" in names
assert "optimize_expression" in names
assert len(templates) == 5
def test_render_chat_system(self) -> None:
"""渲染 chat_system 模板."""
svc = PromptTemplateService()
svc.load()
result = svc.render("chat_system", {"role": "teacher"})
assert isinstance(result, str)
assert len(result) > 0
def test_render_generate_question(self) -> None:
"""渲染 generate_question 模板."""
svc = PromptTemplateService()
svc.load()
result = svc.render(
"generate_question",
{
"subject": "数学",
"grade": "三年级",
"difficulty": "easy",
"question_type": "short_answer",
"knowledge_points": ["加减法"],
"knowledge_point_ids": ["kp-1"],
"count": 1,
"prompt": "生成分数加减法",
},
)
assert "数学" in result
def test_template_not_found_raises(self) -> None:
"""模板不存在抛 AI_PROMPT_TEMPLATE_NOT_FOUND."""
svc = PromptTemplateService()
svc.load()
with pytest.raises(AIError) as exc_info:
svc.get("nonexistent_template")
assert exc_info.value.code == ErrorCode.AI_PROMPT_TEMPLATE_NOT_FOUND
def test_render_nonexistent_raises(self) -> None:
"""渲染不存在的模板抛异常."""
svc = PromptTemplateService()
svc.load()
with pytest.raises(AIError):
svc.render("nonexistent", {})
def test_load_nonexistent_dir(self) -> None:
"""目录不存在时 load 不抛异常,仅记录警告."""
svc = PromptTemplateService(templates_dir=Path("/nonexistent/path"))
svc.load()
assert svc.list_templates() == []
def test_render_with_variables(self) -> None:
"""渲染带变量的模板."""
svc = PromptTemplateService()
svc.load()
result = svc.render(
"optimize_expression",
{"text": "这是一段文字", "context": "教学场景"},
)
assert "这是一段文字" in result
def test_get_returns_template(self) -> None:
"""get() 返回 PromptTemplate 对象."""
svc = PromptTemplateService()
svc.load()
tpl = svc.get("chat_system")
assert tpl.name == "chat_system"
assert tpl.version