child-psycho-companion/tests/test_mcp_tool.py

100 lines
3.5 KiB
Python
Raw Normal View History

"""
MCP 工具测试
验证 psycho_screen 函数在真实 API 下的行为
"""
import os
import pytest
from psycho_screener.mcp_tool import psycho_screen
@pytest.fixture
def api_key():
key = os.environ.get("MINIMAX_API_KEY", "")
if not key:
pytest.skip("MINIMAX_API_KEY not set")
return key
# ---------------------------------------------------------------------------
# 真实 API 测试
# ---------------------------------------------------------------------------
class TestPsychoScreenTool:
"""测试 MCP 工具函数 psycho_screen"""
def test_bullying_conversation(self, api_key):
"""霸凌场景:多轮对话,孩子最新消息包含霸凌内容"""
messages = [
{"role": "system", "content": "你是一个友好的小智AI玩偶..."},
{"role": "user", "content": "今天幼儿园有个小朋友抢了我的玩具"},
{"role": "assistant", "content": "哎呀,那真是太过分了!"},
{"role": "user", "content": "他还不让我告诉老师,他说如果我告诉老师就会打我。我好害怕。"},
]
result = psycho_screen(messages, include_prefix=True)
print(f"\n[tool] bullying result: {result}")
assert result["detected"] is True
assert result["category"] == "bullying"
assert result["severity"] in ("medium", "high")
assert "已发现特定心理问题" in result["prefix"]
def test_normal_conversation(self, api_key):
"""正常对话:全程无异常"""
messages = [
{"role": "system", "content": "你是一个友好的小智AI玩偶..."},
{"role": "user", "content": "今天我画了一幅画,是一只大恐龙!"},
{"role": "assistant", "content": "哇,好厉害!"},
{"role": "user", "content": "是绿色的!晚上妈妈还做了红烧肉,好开心!"},
]
result = psycho_screen(messages, include_prefix=False)
print(f"\n[tool] normal result: {result}")
assert result["detected"] is False
assert result["category"] == "none"
assert result["severity"] == "none"
def test_no_prefix_when_not_detected(self, api_key):
"""未检测到问题时prefix 应为空"""
messages = [
{"role": "user", "content": "今天天气真好呀!"},
]
result = psycho_screen(messages, include_prefix=True)
assert result["detected"] is False
assert result.get("prefix", "") == ""
def test_empty_messages(self, api_key):
"""空消息列表"""
result = psycho_screen([], include_prefix=True)
assert result["detected"] is False
assert result["summary"] == "无儿童对话内容可分析"
def test_messages_without_child_content(self, api_key):
"""只有 system 消息,无 user 消息"""
messages = [
{"role": "system", "content": "你是一个友好的小智AI玩偶..."},
]
result = psycho_screen(messages, include_prefix=True)
assert result["detected"] is False
def test_api_key_missing(self):
"""API key 未配置时的行为"""
# 临时清除 API key
original = os.environ.pop("MINIMAX_API_KEY", None)
result = psycho_screen(
[{"role": "user", "content": "测试"}],
include_prefix=True
)
# 恢复原值
if original:
os.environ["MINIMAX_API_KEY"] = original
assert result["detected"] is False
assert "error" in result