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