"""灵核情绪状态 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)