chore: 整理项目结构,清理归档文件,更新部署配置

This commit is contained in:
Simon
2026-07-04 21:01:39 +08:00
parent 8bd4ab0366
commit 64ff1bf7d5
508 changed files with 43575 additions and 14129 deletions
+102 -23
View File
@@ -2,18 +2,18 @@
# 企微IT智能服务台 — 消息体验功能测试
# =============================================================================
# 说明:测试消息体验相关功能,包括:
# 1. 撤回消息 (POST /api/messages/{id}/recall)
# 2. 删除消息 (DELETE /api/messages/{id})
# 1. 撤回消息 (POST /messages/{id}/recall)
# 2. 删除消息 (DELETE /messages/{id})
# 3. 标记已读 (POST /api/conversations/{id}/mark-read)
# 4. 图片上传 (POST /api/messages/image)
# 5. 文件上传 (POST /api/messages/file)
# 4. 图片上传 (POST /messages/image)
# 5. 文件上传 (POST /messages/file)
# =============================================================================
import pytest
import pytest_asyncio
from datetime import datetime, timedelta
from uuid import uuid4
from tests.conftest import create_test_conversation, create_test_agent, MockRedis
from tests.conftest import create_test_conversation, create_test_agent, MockRedis, login_test_agent
# =============================================================================
@@ -45,8 +45,14 @@ async def test_recall_message_within_2min(client, db_session, mock_redis):
db_session.add(message)
await db_session.flush()
# 调用撤回消息接口
response = await client.post(f"/api/messages/{message.id}/recall")
# 获取认证token
token = await login_test_agent(client, db_session, "test_agent_001", "测试坐席")
# 调用撤回消息接口(带认证)
response = await client.post(
f"/messages/{message.id}/recall",
headers={"Authorization": f"Bearer {token}"}
)
# 验证
assert response.status_code == 200
@@ -79,10 +85,17 @@ async def test_recall_message_after_2min_fails(client, db_session, mock_redis):
db_session.add(message)
await db_session.flush()
response = await client.post(f"/api/messages/{message.id}/recall")
# 获取认证token
token = await login_test_agent(client, db_session, "test_agent_001", "测试坐席")
response = await client.post(
f"/messages/{message.id}/recall",
headers={"Authorization": f"Bearer {token}"}
)
# 应该返回403错误
assert response.status_code == 403 or (response.status_code == 200 and response.json().get("code") == 403)
await db_session.flush()
@pytest.mark.asyncio
@@ -92,13 +105,20 @@ async def test_recall_nonexistent_message(client, db_session, mock_redis):
预期:返回404错误
"""
fake_id = str(uuid4())
response = await client.post(f"/api/messages/{fake_id}/recall")
assert response.status_code == 404
# 需要坐席认证才能调用撤回接口
token = await login_test_agent(client, db_session, "test_recall_nx", "测试坐席")
response = await client.post(
f"/messages/{fake_id}/recall",
headers={"Authorization": f"Bearer {token}"}
)
# 端点返回 200,错误码在 body.code 中
assert response.status_code == 200
assert response.json().get("code") == 404
@pytest.mark.asyncio
async def test_recall_non_agent_message_fails(client, db_session, mock_redis):
"""测试回非坐席发送的消息
"""测试回非坐席发送的消息
预期:返回403错误(只能撤回坐席发送的消息)
"""
@@ -119,7 +139,12 @@ async def test_recall_non_agent_message_fails(client, db_session, mock_redis):
db_session.add(message)
await db_session.flush()
response = await client.post(f"/api/messages/{message.id}/recall")
# 需要认证:撤回接口需要坐席认证
token = await login_test_agent(client, db_session, "test_recall_emp", "测试坐席")
response = await client.post(
f"/messages/{message.id}/recall",
headers={"Authorization": f"Bearer {token}"}
)
# 应该返回403错误
assert response.status_code == 403 or (response.status_code == 200 and response.json().get("code") == 403)
@@ -151,7 +176,12 @@ async def test_delete_message_success(client, db_session, mock_redis):
db_session.add(message)
await db_session.flush()
response = await client.delete(f"/api/messages/{message.id}")
# 获取认证token
token = await login_test_agent(client, db_session, "test_agent_001", "测试坐席")
response = await client.delete(
f"/messages/{message.id}",
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code in [200, 204]
@@ -163,8 +193,15 @@ async def test_delete_nonexistent_message(client, db_session, mock_redis):
预期:返回404错误
"""
fake_id = str(uuid4())
response = await client.delete(f"/api/messages/{fake_id}")
assert response.status_code == 404
# 需要坐席认证
token = await login_test_agent(client, db_session, "test_del_nx", "测试坐席")
response = await client.delete(
f"/messages/{fake_id}",
headers={"Authorization": f"Bearer {token}"}
)
# 端点返回 200,错误码在 body.code 中
assert response.status_code == 200
assert response.json().get("code") == 404
# =============================================================================
@@ -177,7 +214,12 @@ async def test_mark_read_updates_messages(client, db_session, mock_redis):
预期:返回200,所有未读消息被标记为已读
"""
# 获取认证token
token = await login_test_agent(client, db_session, "test_mark_read", "测试坐席")
conv = create_test_conversation(status="serving")
# 确保坐席是该会话的主责或协作坐席(mark_read 需要校验)
conv.assigned_agent_id = "test_mark_read"
db_session.add(conv)
await db_session.flush()
@@ -203,7 +245,10 @@ async def test_mark_read_updates_messages(client, db_session, mock_redis):
db_session.add_all([msg1, msg2])
await db_session.flush()
response = await client.post(f"/api/conversations/{conv.id}/mark-read")
response = await client.post(
f"/conversations/{conv.id}/mark-read",
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 200
data = response.json()
@@ -217,8 +262,15 @@ async def test_mark_read_nonexistent_conversation(client, db_session, mock_redis
预期:返回404错误
"""
fake_id = str(uuid4())
response = await client.post(f"/api/conversations/{fake_id}/mark-read")
assert response.status_code == 404
# 需要坐席认证
token = await login_test_agent(client, db_session, "test_mr_nx", "测试坐席")
response = await client.post(
f"/conversations/{fake_id}/mark-read",
headers={"Authorization": f"Bearer {token}"}
)
# 端点返回 200,错误码在 body.code 中
assert response.status_code == 200
assert response.json().get("code") == 3003
# =============================================================================
@@ -235,7 +287,13 @@ async def test_upload_image_within_limit(client, db_session, mock_redis):
image_data = b"\x89PNG\r\n\x1a\n" + b"fake_image_data" * 5000
files = {"file": ("test.png", image_data, "image/png")}
response = await client.post("/api/messages/image", files=files)
# 获取认证token(上传接口需要坐席认证)
token = await login_test_agent(client, db_session, "test_up_img", "测试坐席")
response = await client.post(
"/messages/image",
files=files,
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 200
data = response.json()
@@ -253,7 +311,12 @@ async def test_upload_image_exceeds_limit(client, db_session, mock_redis):
large_data = b"x" * (11 * 1024 * 1024) # 11MB
files = {"file": ("large.png", large_data, "image/png")}
response = await client.post("/api/messages/image", files=files)
token = await login_test_agent(client, db_session, "test_up_lg", "测试坐席")
response = await client.post(
"/messages/image",
files=files,
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 400 or (response.status_code == 200 and response.json().get("code") == 400)
@@ -268,7 +331,12 @@ async def test_upload_invalid_image_type(client, db_session, mock_redis):
image_data = b"fake_image"
files = {"file": ("test.bmp", image_data, "image/bmp")}
response = await client.post("/api/messages/image", files=files)
token = await login_test_agent(client, db_session, "test_up_inv", "测试坐席")
response = await client.post(
"/messages/image",
files=files,
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 400 or (response.status_code == 200 and response.json().get("code") == 400)
@@ -287,7 +355,13 @@ async def test_upload_file_within_limit(client, db_session, mock_redis):
file_data = b"fake_file_content" * 5000
files = {"file": ("test.pdf", file_data, "application/pdf")}
response = await client.post("/api/messages/file", files=files)
# 获取认证token
token = await login_test_agent(client, db_session, "test_up_file", "测试坐席")
response = await client.post(
"/messages/file",
files=files,
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 200
data = response.json()
@@ -304,6 +378,11 @@ async def test_upload_file_exceeds_limit(client, db_session, mock_redis):
large_data = b"x" * (11 * 1024 * 1024) # 11MB
files = {"file": ("large.pdf", large_data, "application/pdf")}
response = await client.post("/api/messages/file", files=files)
token = await login_test_agent(client, db_session, "test_up_fl_lg", "测试坐席")
response = await client.post(
"/messages/file",
files=files,
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 400 or (response.status_code == 200 and response.json().get("code") == 400)