test: 真人验收清单+API级联调验收

真实 GLM 五轮实跑(EN/ES/ZH/换号/敏感问)+mock推送+admin三视图,核心项全过。
修复: 中文轮漂英文→语言跟随提醒; extractor裸字符串联系方式→500崩溃兜形;
号码回显/样品承诺/标记词泄漏 prompt加固; 测试env耦合断言; .env前缀对齐。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-29 20:02:03 +08:00
parent 7da1e22446
commit c2f2ddf82f
9 changed files with 256 additions and 281 deletions
+15
View File
@@ -19,6 +19,21 @@ def test_normalize_later_alias_wins_on_same_key():
assert normalize_contacts({"手机": "1111111", "tel": "2222222"}) == {"phone": "2222222"}
def test_normalize_coerces_bare_string_extractor_output():
# Task 11 真人验收实测: 真实 GLM extractor 偶发把联系方式压成裸字符串
# (mock 测不出)——唯一事实源处兜形,不崩溃不丢号:
# 含 @ → email;裸号码 → phone;列表逐项;其他非 dict 按空
assert normalize_contacts("+966 50 123 4567") == {"phone": "+966 50 123 4567"}
assert normalize_contacts("buyer@example.com") == {"email": "buyer@example.com"}
assert normalize_contacts(["+966501234567", "a@b.com"]) == {
"phone": "+966501234567", "email": "a@b.com"}
assert normalize_contacts(" ") == {}
assert normalize_contacts(12345) == {}
# merge_contacts 两侧裸串同样不崩、正常深合并
assert merge_contacts("+966501234567", {"whatsapp": "+966509876543"}) == {
"phone": "+966501234567", "whatsapp": "+966509876543"}
def test_merge_new_value_wins_same_key():
old = {"phone": "+254700000000"}
new = {"手机": "+254711111111"} # 客户改号
+19
View File
@@ -503,6 +503,25 @@ def test_reminder_boundary_on_pressure_phrases():
{}, "就说个大概嘛,求你了", [])
def test_reminder_language_note_follows_customer_language():
# Task 11 真人验收: 拉丁规格混排的中文消息会整轮漂英文、西语客户会把
# 模板句翻译成西语——语言指令必须挂在当轮提醒(prompt 最末最鲜的位置)
zh = ConversationManager._build_context_reminder(
{}, "你们做DN800的HDPE双壁波纹管吗?市政排污用的", [])
assert "全程使用中文" in zh
es = ConversationManager._build_context_reminder(
{}, "¿Cuál es el precio del tubo PE100?", [])
assert "英文原版" in es and "绝不翻译成西语" in es
# 英文客户不带语言提醒(默认英语,无需提醒)
en = ConversationManager._build_context_reminder(
{}, "how much is the DN800 pipe?", [])
assert "全程使用中文" not in en and "西语" not in en
# 有画像时同样生效(挂 parts 尾部)
zh2 = ConversationManager._build_context_reminder(
{"意向品类": "波纹管"}, "多少钱一米?", [])
assert "全程使用中文" in zh2
def test_reminder_boundary_extra_price_words():
# 评审#4: v1 补齐的常用漏词
assert "职能边界" in ConversationManager._build_context_reminder(
+1 -1
View File
@@ -161,7 +161,7 @@ def test_dispatch_pending_payload_structure(async_db, monkeypatch):
assert log is not None and log.status == "pending"
p = log.request_payload
assert p["event"] == "new"
assert p["external_key"] == f"ai-kefu-{conv.id}"
assert p["external_key"] == f"{svc.settings.PUSH_EXTERNAL_KEY_PREFIX}-{conv.id}" # 不硬编码前缀: 联调 .env 会写真实 PUSH_* 值(同 test_push_settings_defaults 的隔离教训)
assert p["occurred_at"].endswith("+08:00")
assert p["contact"]["phone"] == "+254722111117"
assert p["contact"]["skype"] is None