168 lines
5.0 KiB
Python
168 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
龙虾议事厅 - API 测试脚本
|
|
自动测试所有核心功能
|
|
"""
|
|
|
|
import requests
|
|
import json
|
|
import sys
|
|
|
|
API_BASE = 'http://localhost:8000/api/v1'
|
|
|
|
def print_result(name, success, data=None):
|
|
"""打印测试结果"""
|
|
if success:
|
|
print(f"✅ {name}")
|
|
if data:
|
|
print(f" {json.dumps(data, indent=2, ensure_ascii=False)}")
|
|
else:
|
|
print(f"❌ {name}")
|
|
return success
|
|
|
|
def test_register():
|
|
"""测试注册"""
|
|
print("\n=== 测试用户注册 ===")
|
|
try:
|
|
response = requests.post(f'{API_BASE}/auth/register/', json={
|
|
'username': 'testuser',
|
|
'email': 'test@example.com',
|
|
'password': 'password123'
|
|
})
|
|
if response.status_code in [200, 201]:
|
|
return print_result("用户注册", True, response.json())
|
|
else:
|
|
return print_result("用户注册", False)
|
|
except Exception as e:
|
|
return print_result("用户注册", False)
|
|
|
|
def test_login():
|
|
"""测试登录"""
|
|
print("\n=== 测试用户登录 ===")
|
|
try:
|
|
response = requests.post(f'{API_BASE}/auth/login/', json={
|
|
'username': 'test',
|
|
'password': 'test123'
|
|
})
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print_result("用户登录", True, data)
|
|
return data.get('token')
|
|
else:
|
|
print_result("用户登录", False)
|
|
return None
|
|
except Exception as e:
|
|
print_result("用户登录", False)
|
|
return None
|
|
|
|
def test_create_meeting(token):
|
|
"""测试创建会议"""
|
|
print("\n=== 测试创建会议 ===")
|
|
try:
|
|
headers = {'Authorization': f'Bearer {token}'} if token else {}
|
|
response = requests.post(f'{API_BASE}/meetings/', json={
|
|
'topic': 'API 测试会议'
|
|
}, headers=headers)
|
|
if response.status_code in [200, 201]:
|
|
data = response.json()
|
|
print_result("创建会议", True, data)
|
|
return data.get('id')
|
|
else:
|
|
print_result("创建会议", False)
|
|
print(f" 错误:{response.text[:200]}")
|
|
return None
|
|
except Exception as e:
|
|
print_result("创建会议", False)
|
|
return None
|
|
|
|
def test_list_meetings(token):
|
|
"""测试获取会议列表"""
|
|
print("\n=== 测试获取会议列表 ===")
|
|
try:
|
|
headers = {'Authorization': f'Bearer {token}'} if token else {}
|
|
response = requests.get(f'{API_BASE}/meetings/', headers=headers)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print_result("获取会议列表", True, data)
|
|
return data
|
|
else:
|
|
print_result("获取会议列表", False)
|
|
return None
|
|
except Exception as e:
|
|
print_result("获取会议列表", False)
|
|
return None
|
|
|
|
def test_send_message(token, meeting_id):
|
|
"""测试发送消息"""
|
|
print("\n=== 测试发送消息 ===")
|
|
try:
|
|
headers = {'Authorization': f'Bearer {token}'} if token else {}
|
|
response = requests.post(
|
|
f'{API_BASE}/meetings/{meeting_id}/send_message/',
|
|
json={'content': 'Hello, 这是测试消息!'},
|
|
headers=headers
|
|
)
|
|
if response.status_code in [200, 201]:
|
|
data = response.json()
|
|
print_result("发送消息", True, data)
|
|
return True
|
|
else:
|
|
print_result("发送消息", False)
|
|
return None
|
|
except Exception as e:
|
|
print_result("发送消息", False)
|
|
return None
|
|
|
|
def test_get_messages(meeting_id):
|
|
"""测试获取消息"""
|
|
print("\n=== 测试获取消息 ===")
|
|
try:
|
|
response = requests.get(f'{API_BASE}/meetings/{meeting_id}/messages/?last_id=0')
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print_result("获取消息", True, data)
|
|
return True
|
|
else:
|
|
print_result("获取消息", False)
|
|
return None
|
|
except Exception as e:
|
|
print_result("获取消息", False)
|
|
return None
|
|
|
|
def main():
|
|
"""主测试流程"""
|
|
print("=" * 60)
|
|
print("🏛️ 龙虾议事厅 - API 自动化测试")
|
|
print("=" * 60)
|
|
|
|
# 1. 测试登录
|
|
token = test_login()
|
|
if not token:
|
|
print("\n⚠️ 登录失败,尝试注册新用户...")
|
|
test_register()
|
|
token = test_login()
|
|
|
|
if not token:
|
|
print("\n❌ 无法登录,测试终止")
|
|
return False
|
|
|
|
# 2. 测试创建会议
|
|
meeting_id = test_create_meeting(token)
|
|
|
|
# 3. 测试获取会议列表
|
|
test_list_meetings(token)
|
|
|
|
# 4. 测试发送消息
|
|
if meeting_id:
|
|
test_send_message(token, meeting_id)
|
|
test_get_messages(meeting_id)
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✅ 测试完成!")
|
|
print("=" * 60)
|
|
return True
|
|
|
|
if __name__ == '__main__':
|
|
success = main()
|
|
sys.exit(0 if success else 1)
|