本次提交包含多类代码优化: 1. 修复多处单行代码换行格式,统一代码排版 2. 为外部系统模块新增快捷菜单配置 3. 优化前端API请求参数命名一致性 4. 补充媒体下载超限错误码与领域异常类 5. 完善仓储层更新逻辑,支持显式清空字段 6. 优化部分测试用例与工具函数代码结构 7. 为微信插件白名单缓存增加过期时间
104 lines
4.5 KiB
Python
104 lines
4.5 KiB
Python
"""
|
||
Integration tests for department management API routes.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import uuid
|
||
|
||
import pytest
|
||
|
||
pytestmark = [pytest.mark.asyncio, pytest.mark.integration]
|
||
|
||
|
||
async def test_superadmin_can_delete_department_with_users(test_client, admin_headers):
|
||
suffix = uuid.uuid4().hex[:8]
|
||
department_payload = {
|
||
"name": f"pytest_department_{suffix}",
|
||
"description": "integration test department",
|
||
"admin_uid": f"pta_{suffix}",
|
||
"admin_password": "RouterDept123!",
|
||
}
|
||
user_payload = {
|
||
"username": f"dept_user_{suffix}",
|
||
"password": "RouterUser123!",
|
||
"role": "user",
|
||
}
|
||
|
||
department_id = None
|
||
created_user_id = None
|
||
department_admin_id = None
|
||
|
||
try:
|
||
create_department_response = await test_client.post(
|
||
"/api/departments",
|
||
json=department_payload,
|
||
headers=admin_headers,
|
||
)
|
||
assert create_department_response.status_code == 201, create_department_response.text
|
||
department_id = create_department_response.json()["id"]
|
||
|
||
create_user_response = await test_client.post(
|
||
"/api/auth/users",
|
||
json={**user_payload, "department_id": department_id},
|
||
headers=admin_headers,
|
||
)
|
||
assert create_user_response.status_code == 200, create_user_response.text
|
||
created_user_id = create_user_response.json()["id"]
|
||
|
||
list_users_response = await test_client.get("/api/auth/users", headers=admin_headers)
|
||
assert list_users_response.status_code == 200, list_users_response.text
|
||
users_before_delete = list_users_response.json()
|
||
department_admin = next(
|
||
(user for user in users_before_delete if user["uid"] == department_payload["admin_uid"]), None
|
||
)
|
||
assert department_admin is not None
|
||
department_admin_id = department_admin["id"]
|
||
|
||
delete_department_response = await test_client.delete(
|
||
f"/api/departments/{department_id}", headers=admin_headers
|
||
)
|
||
assert delete_department_response.status_code == 200, delete_department_response.text
|
||
assert delete_department_response.json()["success"] is True
|
||
department_id = None
|
||
|
||
deleted_department_response = await test_client.get(
|
||
f"/api/departments/{create_department_response.json()['id']}",
|
||
headers=admin_headers,
|
||
)
|
||
assert deleted_department_response.status_code == 404, deleted_department_response.text
|
||
|
||
list_users_after_delete_response = await test_client.get("/api/auth/users", headers=admin_headers)
|
||
assert list_users_after_delete_response.status_code == 200, list_users_after_delete_response.text
|
||
users_after_delete = list_users_after_delete_response.json()
|
||
|
||
# 删除部门后用户迁移到默认部门(代码中默认部门固定为 id=1,其名称可被用户修改)
|
||
migrated_admin = next((user for user in users_after_delete if user["id"] == department_admin_id), None)
|
||
assert migrated_admin is not None
|
||
assert migrated_admin["department_id"] == 1
|
||
|
||
migrated_user = next((user for user in users_after_delete if user["id"] == created_user_id), None)
|
||
assert migrated_user is not None
|
||
assert migrated_user["department_id"] == 1
|
||
finally:
|
||
if department_admin_id is not None:
|
||
await test_client.delete(f"/api/auth/users/{department_admin_id}", headers=admin_headers)
|
||
if created_user_id is not None:
|
||
await test_client.delete(f"/api/auth/users/{created_user_id}", headers=admin_headers)
|
||
if department_id is not None:
|
||
await test_client.delete(f"/api/departments/{department_id}", headers=admin_headers)
|
||
|
||
|
||
async def test_superadmin_cannot_delete_default_department(test_client, admin_headers):
|
||
departments_response = await test_client.get("/api/departments", headers=admin_headers)
|
||
assert departments_response.status_code == 200, departments_response.text
|
||
departments = departments_response.json()
|
||
|
||
# 默认部门在代码中固定为 id=1(受保护不可删除),其名称可被用户修改,故按 id 定位
|
||
default_department = next((department for department in departments if department["id"] == 1), None)
|
||
assert default_department is not None
|
||
|
||
delete_response = await test_client.delete(f"/api/departments/{default_department['id']}", headers=admin_headers)
|
||
assert delete_response.status_code == 400, delete_response.text
|
||
assert delete_response.json()["detail"] == "默认部门不允许删除"
|