ForcePilot/backend/test/integration/api/test_department_router.py
Kris f9f08221fc chore: 整理代码风格与优化细节
本次提交包含多类代码优化:
1. 修复多处单行代码换行格式,统一代码排版
2. 为外部系统模块新增快捷菜单配置
3. 优化前端API请求参数命名一致性
4. 补充媒体下载超限错误码与领域异常类
5. 完善仓储层更新逻辑,支持显式清空字段
6. 优化部分测试用例与工具函数代码结构
7. 为微信插件白名单缓存增加过期时间
2026-07-14 15:13:29 +08:00

104 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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"] == "默认部门不允许删除"