146 lines
4.6 KiB
Python
146 lines
4.6 KiB
Python
#!/usr/bin/env python3
|
|
"""测试空消息内容和 prefill 处理的改进"""
|
|
|
|
import json
|
|
import requests
|
|
|
|
BASE_URL = "http://localhost:8080"
|
|
API_KEY = "test-key"
|
|
|
|
def safe_print_response(response):
|
|
"""安全打印响应,处理非 JSON 情况"""
|
|
try:
|
|
data = response.json()
|
|
print(f"响应: {json.dumps(data, indent=2, ensure_ascii=False)}")
|
|
return data
|
|
except (json.JSONDecodeError, ValueError):
|
|
print(f"响应 (非 JSON): {response.text}")
|
|
return None
|
|
|
|
def test_empty_content():
|
|
"""测试空消息内容应返回 400 错误"""
|
|
print("测试 1: 空消息内容")
|
|
response = requests.post(
|
|
f"{BASE_URL}/v1/messages",
|
|
headers={
|
|
"x-api-key": API_KEY,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
json={
|
|
"model": "claude-sonnet-4",
|
|
"max_tokens": 1024,
|
|
"messages": [
|
|
{"role": "user", "content": ""}
|
|
]
|
|
}
|
|
)
|
|
print(f"状态码: {response.status_code}")
|
|
data = safe_print_response(response)
|
|
assert response.status_code == 400, "应返回 400 错误"
|
|
if data:
|
|
assert "消息内容为空" in data.get("error", {}).get("message", ""), "错误消息应包含'消息内容为空'"
|
|
print("✓ 测试通过\n")
|
|
|
|
def test_empty_text_blocks():
|
|
"""测试仅包含空白文本块的消息"""
|
|
print("测试 2: 仅包含空白文本块")
|
|
response = requests.post(
|
|
f"{BASE_URL}/v1/messages",
|
|
headers={
|
|
"x-api-key": API_KEY,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
json={
|
|
"model": "claude-sonnet-4",
|
|
"max_tokens": 1024,
|
|
"messages": [
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": " "},
|
|
{"type": "text", "text": "\n\t"}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
)
|
|
print(f"状态码: {response.status_code}")
|
|
data = safe_print_response(response)
|
|
assert response.status_code == 400, "应返回 400 错误"
|
|
if data:
|
|
assert "消息内容为空" in data.get("error", {}).get("message", ""), "错误消息应包含'消息内容为空'"
|
|
print("✓ 测试通过\n")
|
|
|
|
def test_prefill_with_empty_user():
|
|
"""测试 prefill 场景下空 user 消息"""
|
|
print("测试 3: Prefill 场景下空 user 消息")
|
|
response = requests.post(
|
|
f"{BASE_URL}/v1/messages",
|
|
headers={
|
|
"x-api-key": API_KEY,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
json={
|
|
"model": "claude-sonnet-4",
|
|
"max_tokens": 1024,
|
|
"messages": [
|
|
{"role": "user", "content": ""},
|
|
{"role": "assistant", "content": "Hi there"}
|
|
]
|
|
}
|
|
)
|
|
print(f"状态码: {response.status_code}")
|
|
data = safe_print_response(response)
|
|
assert response.status_code == 400, "应返回 400 错误"
|
|
if data:
|
|
assert "消息内容为空" in data.get("error", {}).get("message", ""), "错误消息应包含'消息内容为空'"
|
|
print("✓ 测试通过\n")
|
|
|
|
def test_valid_message():
|
|
"""测试正常消息应该成功"""
|
|
print("测试 4: 正常消息(对照组)")
|
|
response = requests.post(
|
|
f"{BASE_URL}/v1/messages",
|
|
headers={
|
|
"x-api-key": API_KEY,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
json={
|
|
"model": "claude-sonnet-4",
|
|
"max_tokens": 50,
|
|
"messages": [
|
|
{"role": "user", "content": "Say 'test' only"}
|
|
]
|
|
}
|
|
)
|
|
print(f"状态码: {response.status_code}")
|
|
if response.status_code == 200:
|
|
print("✓ 测试通过:正常消息处理成功\n")
|
|
else:
|
|
safe_print_response(response)
|
|
print()
|
|
|
|
if __name__ == "__main__":
|
|
print("=" * 60)
|
|
print("空消息内容验证测试")
|
|
print("=" * 60 + "\n")
|
|
|
|
try:
|
|
test_empty_content()
|
|
test_empty_text_blocks()
|
|
test_prefill_with_empty_user()
|
|
test_valid_message()
|
|
print("=" * 60)
|
|
print("所有测试通过!")
|
|
print("=" * 60)
|
|
except AssertionError as e:
|
|
print(f"\n✗ 测试失败: {e}")
|
|
except requests.exceptions.ConnectionError:
|
|
print("\n✗ 无法连接到服务器,请确保服务正在运行")
|
|
except Exception as e:
|
|
print(f"\n✗ 发生错误: {e}")
|