chore: 整理项目结构,清理归档文件,更新部署配置
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user