60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""道体注入与完整性校验测试。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from app.application.chat.send_message import _contract_system_messages
|
|
from app.modules.runtime.contract import RuntimeContract
|
|
from app.modules.runtime.integrity import validate_daoti_integrity
|
|
|
|
|
|
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_system_prompt_injected() -> None:
|
|
msgs = _contract_system_messages(_contract(system_prompt="特殊系统指令"))
|
|
assert "特殊系统指令" in msgs
|
|
|
|
|
|
def test_mission_injected() -> None:
|
|
msgs = _contract_system_messages(_contract(mission="守护用户"))
|
|
assert any("守护用户" in m for m in msgs)
|
|
|
|
|
|
def test_safety_guidelines_precede_safety_constraints() -> None:
|
|
c = _contract(safety_guidelines="道体边界", safety_constraints=["司命约束"])
|
|
msgs = _contract_system_messages(c)
|
|
assert msgs.index("行为边界:\n道体边界") < msgs.index("安全约束:\n- 司命约束")
|
|
|
|
|
|
def test_integrity_pass_when_consistent() -> None:
|
|
c = _contract(mission="M", safety_guidelines="S")
|
|
validate_daoti_integrity(c, mission="M", safety_guidelines="S") # 不抛即通过
|
|
|
|
|
|
def test_integrity_raises_on_mission_tamper() -> None:
|
|
c = _contract(mission="M")
|
|
with pytest.raises(ValueError):
|
|
validate_daoti_integrity(c, mission="被篡改")
|
|
|
|
|
|
def test_integrity_raises_on_safety_tamper() -> None:
|
|
c = _contract(safety_guidelines="S")
|
|
with pytest.raises(ValueError):
|
|
validate_daoti_integrity(c, safety_guidelines="被篡改")
|
|
|
|
|
|
def test_integrity_skips_none_fields() -> None:
|
|
# 道体字段未设(None)时跳过校验
|
|
validate_daoti_integrity(_contract(), mission=None, safety_guidelines=None)
|