123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #!/usr/bin/env python3
- """
- 测试 API 参数验证和错误处理改进
- 验证JSON格式错误处理和用户ID一致性校验
- """
- import requests
- import json
- def test_validation_improvements():
- """测试参数验证改进"""
-
- api_url = "http://localhost:8000/api/chat"
-
- print("🧪 开始测试 API 参数验证改进...")
- print("=" * 80)
-
- # 测试用例1: JSON格式错误 - 尾随逗号
- print(f"\n📋 测试用例1: JSON格式错误(尾随逗号)")
- malformed_json = '{ "question": "测试问题", "user_id": "wang01", "thread_id": "wang01:20250714102158117", }'
- try:
- response = requests.post(
- api_url,
- data=malformed_json, # 使用data而不是json,模拟原始JSON字符串
- headers={"Content-Type": "application/json"},
- timeout=10
- )
- print(f"📊 响应状态码: {response.status_code}")
- result = response.json()
- print(f"📝 响应内容: {json.dumps(result, ensure_ascii=False, indent=2)}")
-
- # 验证是否是400错误且有明确的错误信息
- if response.status_code == 400 and "JSON格式" in result.get("error", ""):
- print("✅ JSON格式错误处理正确")
- else:
- print("❌ JSON格式错误处理有问题")
-
- except Exception as e:
- print(f"❌ 测试JSON格式错误失败: {e}")
-
- # 测试用例2: 用户ID不一致 - thread_id
- print(f"\n📋 测试用例2: 用户ID不一致(thread_id)")
- test_case_2 = {
- "question": "测试用户ID不一致",
- "user_id": "alice",
- "thread_id": "bob:20250714120000001" # 用户ID不匹配
- }
- try:
- response = requests.post(
- api_url,
- json=test_case_2,
- headers={"Content-Type": "application/json"},
- timeout=10
- )
- print(f"📊 响应状态码: {response.status_code}")
- result = response.json()
- print(f"📝 响应内容: {json.dumps(result, ensure_ascii=False, indent=2)}")
-
- # 验证是否正确检测到用户ID不一致
- if response.status_code == 400 and "会话归属验证失败" in result.get("error", ""):
- print("✅ 用户ID一致性校验正确")
- else:
- print("❌ 用户ID一致性校验有问题")
-
- except Exception as e:
- print(f"❌ 测试用户ID一致性失败: {e}")
-
- # 测试用例3: 用户ID不一致 - conversation_id
- print(f"\n📋 测试用例3: 用户ID不一致(conversation_id)")
- test_case_3 = {
- "question": "测试conversation_id用户ID不一致",
- "user_id": "charlie",
- "conversation_id": "david:20250714120000002" # 用户ID不匹配
- }
- try:
- response = requests.post(
- api_url,
- json=test_case_3,
- headers={"Content-Type": "application/json"},
- timeout=10
- )
- print(f"📊 响应状态码: {response.status_code}")
- result = response.json()
- print(f"📝 响应内容: {json.dumps(result, ensure_ascii=False, indent=2)}")
-
- if response.status_code == 400 and "会话归属验证失败" in result.get("error", ""):
- print("✅ conversation_id用户ID一致性校验正确")
- else:
- print("❌ conversation_id用户ID一致性校验有问题")
-
- except Exception as e:
- print(f"❌ 测试conversation_id用户ID一致性失败: {e}")
-
- # 测试用例4: 会话ID格式错误
- print(f"\n📋 测试用例4: 会话ID格式错误(缺少冒号)")
- test_case_4 = {
- "question": "测试会话ID格式错误",
- "user_id": "eve",
- "thread_id": "eve20250714120000003" # 缺少冒号
- }
- try:
- response = requests.post(
- api_url,
- json=test_case_4,
- headers={"Content-Type": "application/json"},
- timeout=10
- )
- print(f"📊 响应状态码: {response.status_code}")
- result = response.json()
- print(f"📝 响应内容: {json.dumps(result, ensure_ascii=False, indent=2)}")
-
- if response.status_code == 400 and "会话ID格式无效" in result.get("error", ""):
- print("✅ 会话ID格式校验正确")
- else:
- print("❌ 会话ID格式校验有问题")
-
- except Exception as e:
- print(f"❌ 测试会话ID格式错误失败: {e}")
-
- # 测试用例5: 正常情况 - 验证修改不影响正常流程
- print(f"\n📋 测试用例5: 正常情况(验证修改不影响正常流程)")
- test_case_5 = {
- "question": "这是一个正常的测试问题",
- "user_id": "frank",
- "thread_id": "frank:20250714120000005"
- }
- try:
- response = requests.post(
- api_url,
- json=test_case_5,
- headers={"Content-Type": "application/json"},
- timeout=30
- )
- print(f"📊 响应状态码: {response.status_code}")
-
- if response.status_code == 200:
- result = response.json()
- print("✅ 正常请求处理成功")
- print(f" - conversation_id: {result.get('data', {}).get('conversation_id')}")
- print(f" - user_id: {result.get('data', {}).get('user_id')}")
- else:
- print(f"❌ 正常请求处理失败: {response.text}")
-
- except Exception as e:
- print(f"❌ 测试正常情况失败: {e}")
-
- # 测试用例6: guest用户不受限制
- print(f"\n📋 测试用例6: guest用户不受会话ID限制")
- test_case_6 = {
- "question": "guest用户测试",
- "user_id": "guest",
- "thread_id": "someuser:20250714120000006" # guest用户应该不受限制
- }
- try:
- response = requests.post(
- api_url,
- json=test_case_6,
- headers={"Content-Type": "application/json"},
- timeout=30
- )
- print(f"📊 响应状态码: {response.status_code}")
-
- if response.status_code == 200:
- print("✅ guest用户不受会话ID限制,处理正确")
- else:
- result = response.json()
- print(f"❌ guest用户处理有问题: {result}")
-
- except Exception as e:
- print(f"❌ 测试guest用户失败: {e}")
-
- print("\n" + "=" * 80)
- print("🎯 测试完成!")
- print("\n💡 预期结果总结:")
- print("1. JSON格式错误应该返回400错误,明确指出JSON格式问题")
- print("2. 用户ID与thread_id/conversation_id不一致应该返回400错误")
- print("3. 会话ID格式错误应该返回400错误")
- print("4. 正常请求应该不受影响")
- print("5. guest用户不受会话ID限制")
- def test_edge_cases():
- """测试边界情况"""
-
- api_url = "http://localhost:8000/api/chat"
-
- print("\n🔍 测试边界情况...")
- print("-" * 60)
-
- # 边界情况1: 复杂的会话ID格式
- test_edge_1 = {
- "question": "测试复杂会话ID",
- "user_id": "user:with:colons",
- "thread_id": "user:with:colons:20250714120000001:extra"
- }
-
- try:
- response = requests.post(api_url, json=test_edge_1, timeout=10)
- print(f"🔬 复杂会话ID测试 - 状态码: {response.status_code}")
- if response.status_code == 200:
- print("✅ 复杂会话ID处理正确")
- else:
- result = response.json()
- print(f"📝 错误信息: {result.get('error', '')}")
- except Exception as e:
- print(f"❌ 复杂会话ID测试失败: {e}")
- if __name__ == "__main__":
- test_validation_improvements()
- test_edge_cases()
|