"""世谱注入位置测试:before/after 相对 personality_summary。""" from __future__ import annotations from app.application.chat.send_message import _contract_system_messages from app.modules.runtime.contract import RuntimeContract def _contract(**kw: object) -> RuntimeContract: base: dict[str, object] = { "character_id": "c", "session_id": "s", "run_id": "r", "model_hint": "m", "trace_id": "t", } base.update(kw) return RuntimeContract(**base) def test_lorebook_before_precedes_personality() -> None: c = _contract(personality_summary="人格X", lorebook_before="世界设定前") msgs = _contract_system_messages(c) assert msgs.index("世界设定前") < msgs.index("当前人格:\n人格X") def test_lorebook_after_follows_personality() -> None: c = _contract(personality_summary="人格X", lorebook_after="世界设定后") msgs = _contract_system_messages(c) assert msgs.index("当前人格:\n人格X") < msgs.index("世界设定后") def test_no_lorebook_when_none() -> None: msgs = _contract_system_messages(_contract()) assert not any("世界设定" in m for m in msgs) def test_lorebook_without_personality_still_injects() -> None: c = _contract(lorebook_before="前", lorebook_after="后") msgs = _contract_system_messages(c) assert "前" in msgs and "后" in msgs