PMFlow/backend/tests/test_prompt_runtime_service.py

84 lines
2.7 KiB
Python

from __future__ import annotations
import pytest
import pytest_asyncio
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
from app.models.base import Base
from app.models.reply_iteration import PromptRelease
from app.services.prompt_release.service import PromptReleaseService
from app.services.prompt_runtime_service import PromptRuntimeService
@pytest_asyncio.fixture
async def db_session():
engine = create_async_engine("sqlite+aiosqlite:///:memory:")
async with engine.begin() as conn:
await conn.run_sync(
lambda sync_conn: Base.metadata.create_all(
sync_conn,
tables=[PromptRelease.__table__],
)
)
maker = async_sessionmaker(engine, expire_on_commit=False)
async with maker() as session:
yield session
await engine.dispose()
@pytest.mark.asyncio
async def test_prompt_runtime_service_prefers_active_release(db_session) -> None:
release = await PromptReleaseService(db_session).create_release(
tenant_id=1,
prompt_key="PROMPT_FEISHU_DIRECT_QA",
body_snapshot="active: {question}",
created_by=1001,
)
await PromptReleaseService(db_session).activate_release(
tenant_id=1,
release_id=release["id"],
actor_id=1001,
)
result = await PromptRuntimeService(db_session).render(
tenant_id=1,
prompt_key="PROMPT_FEISHU_DIRECT_QA",
fallback_template="fallback: {question}",
question="hello",
)
assert result.prompt == "active: hello"
assert result.source == "active_release"
assert result.release_id == release["id"]
assert result.routing_meta()["prompt_key"] == "PROMPT_FEISHU_DIRECT_QA"
assert result.routing_meta()["prompt_release_id"] == release["id"]
assert result.format_error is False
@pytest.mark.asyncio
async def test_prompt_runtime_service_falls_back_on_active_release_format_error(db_session) -> None:
release = await PromptReleaseService(db_session).create_release(
tenant_id=1,
prompt_key="PROMPT_FEISHU_DIRECT_QA",
body_snapshot="broken: {missing}",
created_by=1001,
)
await PromptReleaseService(db_session).activate_release(
tenant_id=1,
release_id=release["id"],
actor_id=1001,
)
result = await PromptRuntimeService(db_session).render(
tenant_id=1,
prompt_key="PROMPT_FEISHU_DIRECT_QA",
fallback_template="fallback: {question}",
question="hello",
)
assert result.prompt == "fallback: hello"
assert result.source == "default_fallback"
assert result.release_id is None
assert result.routing_meta()["prompt_format_error"] is True
assert result.format_error is True