49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
"""灵核情绪状态 system prompt 注入测试(设计 §11.5)。
|
||
|
||
验证 ``_contract_system_messages`` 把 ``emotion_state`` 注入到正确位置
|
||
(personality_summary 后、memory_context 前),且 emotion_state=None 时不注入。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from app.application.chat.send_message import _contract_system_messages
|
||
from app.modules.runtime.contract import RuntimeContract
|
||
|
||
|
||
def _contract(**overrides) -> RuntimeContract:
|
||
base = {
|
||
"character_id": "c1",
|
||
"session_id": "s1",
|
||
"run_id": "r1",
|
||
"model_hint": "m",
|
||
"trace_id": "t",
|
||
}
|
||
base.update(overrides)
|
||
return RuntimeContract(**base)
|
||
|
||
|
||
def test_emotion_state_injected_between_personality_and_memory() -> None:
|
||
contract = _contract(
|
||
personality_summary="人格X",
|
||
emotion_state="[当前情绪] 感动(强度 70%)",
|
||
memory_context="记忆Y",
|
||
)
|
||
messages = _contract_system_messages(contract)
|
||
personality_idx = next(i for i, m in enumerate(messages) if "人格X" in m)
|
||
emotion_idx = next(i for i, m in enumerate(messages) if "感动" in m)
|
||
memory_idx = next(i for i, m in enumerate(messages) if "记忆Y" in m)
|
||
assert personality_idx < emotion_idx < memory_idx
|
||
|
||
|
||
def test_emotion_state_omitted_when_none() -> None:
|
||
contract = _contract(personality_summary="人格X", memory_context="记忆Y")
|
||
messages = _contract_system_messages(contract)
|
||
assert all("当前情绪" not in m for m in messages)
|
||
|
||
|
||
def test_emotion_state_included_without_memory() -> None:
|
||
"""emotion_state 独立于 memory_context 存在。"""
|
||
contract = _contract(emotion_state="[当前情绪] 关切(强度 50%)")
|
||
messages = _contract_system_messages(contract)
|
||
assert any("关切" in m for m in messages)
|