90 lines
3.0 KiB
Python
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
|