Files
2026-01-26 23:45:58 +08:00

333 lines
9.3 KiB
Python

import pytest
from httpx import AsyncClient
@pytest.mark.asyncio
@pytest.mark.integration
async def test_create_user_admin_success(
client: AsyncClient, admin_token: str
):
"""测试管理员创建用户成功"""
response = await client.post(
"/api/v1/users",
headers={"Authorization": f"Bearer {admin_token}"},
json={
"username": "newuser",
"password": "newpass123",
"real_name": "新用户",
"department": "技术部",
"role": "other",
"email": "newuser@test.com",
"phone": "13800000005",
},
)
assert response.status_code == 201
data = response.json()
assert data["success"] is True
assert data["message"] == "用户创建成功"
assert data["data"]["username"] == "newuser"
assert data["data"]["role"] == "other"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_create_user_market_forbidden(
client: AsyncClient, market_token: str
):
"""测试市场部用户创建用户被禁止"""
response = await client.post(
"/api/v1/users",
headers={"Authorization": f"Bearer {market_token}"},
json={
"username": "newuser",
"password": "newpass123",
"real_name": "新用户",
"department": "技术部",
"role": "other",
},
)
assert response.status_code == 403
data = response.json()
assert data["success"] is False
assert data["error_code"] == "3001"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_create_user_duplicate_username(
client: AsyncClient, admin_token: str, admin_user
):
"""测试创建重复用户名"""
response = await client.post(
"/api/v1/users",
headers={"Authorization": f"Bearer {admin_token}"},
json={
"username": "admin",
"password": "newpass123",
"real_name": "重复用户",
"department": "技术部",
"role": "other",
},
)
assert response.status_code == 409
data = response.json()
assert data["success"] is False
assert data["error_code"] == "2002"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_create_user_invalid_role(
client: AsyncClient, admin_token: str
):
"""测试创建用户时使用无效角色"""
response = await client.post(
"/api/v1/users",
headers={"Authorization": f"Bearer {admin_token}"},
json={
"username": "newuser",
"password": "newpass123",
"real_name": "新用户",
"department": "技术部",
"role": "invalid",
},
)
assert response.status_code == 400
data = response.json()
assert data["success"] is False
@pytest.mark.asyncio
@pytest.mark.integration
async def test_get_users_admin_success(
client: AsyncClient, admin_token: str
):
"""测试管理员获取用户列表成功"""
response = await client.get(
"/api/v1/users",
headers={"Authorization": f"Bearer {admin_token}"},
)
assert response.status_code == 200
data = response.json()
assert data["success"] is True
assert "items" in data["data"]
assert "total" in data["data"]
assert len(data["data"]["items"]) >= 1
@pytest.mark.asyncio
@pytest.mark.integration
async def test_get_users_market_forbidden(
client: AsyncClient, market_token: str
):
"""测试市场部用户获取用户列表被禁止"""
response = await client.get(
"/api/v1/users",
headers={"Authorization": f"Bearer {market_token}"},
)
assert response.status_code == 403
data = response.json()
assert data["success"] is False
assert data["error_code"] == "3001"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_get_users_with_pagination(
client: AsyncClient, admin_token: str, admin_user, market_user, other_user
):
"""测试用户列表分页"""
response = await client.get(
"/api/v1/users?page=1&page_size=2",
headers={"Authorization": f"Bearer {admin_token}"},
)
assert response.status_code == 200
data = response.json()
assert data["success"] is True
assert data["data"]["page"] == 1
assert data["data"]["page_size"] == 2
assert len(data["data"]["items"]) == 2
@pytest.mark.asyncio
@pytest.mark.integration
async def test_get_users_with_filter(
client: AsyncClient, admin_token: str, admin_user, market_user, other_user
):
"""测试用户列表筛选"""
response = await client.get(
"/api/v1/users?department=市场部",
headers={"Authorization": f"Bearer {admin_token}"},
)
assert response.status_code == 200
data = response.json()
assert data["success"] is True
for user in data["data"]["items"]:
assert user["department"] == "市场部"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_update_user_admin_success(
client: AsyncClient, admin_token: str, market_user
):
"""测试管理员更新用户成功"""
response = await client.put(
f"/api/v1/users/{market_user.id}",
headers={"Authorization": f"Bearer {admin_token}"},
json={
"real_name": "更新后的姓名",
"email": "updated@test.com",
},
)
assert response.status_code == 200
data = response.json()
assert data["success"] is True
assert data["data"]["real_name"] == "更新后的姓名"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_update_user_market_forbidden(
client: AsyncClient, market_token: str, other_user
):
"""测试市场部用户更新用户被禁止"""
response = await client.put(
f"/api/v1/users/{other_user.id}",
headers={"Authorization": f"Bearer {market_token}"},
json={"real_name": "更新后的姓名"},
)
assert response.status_code == 403
data = response.json()
assert data["success"] is False
@pytest.mark.asyncio
@pytest.mark.integration
async def test_update_user_not_found(
client: AsyncClient, admin_token: str
):
"""测试更新不存在的用户"""
response = await client.put(
"/api/v1/users/99999",
headers={"Authorization": f"Bearer {admin_token}"},
json={"real_name": "更新后的姓名"},
)
assert response.status_code == 404
data = response.json()
assert data["success"] is False
assert data["error_code"] == "2001"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_delete_user_admin_success(
client: AsyncClient, admin_token: str, other_user
):
"""测试管理员删除用户成功"""
response = await client.delete(
f"/api/v1/users/{other_user.id}",
headers={"Authorization": f"Bearer {admin_token}"},
)
assert response.status_code == 200
data = response.json()
assert data["success"] is True
assert data["message"] == "用户删除成功"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_delete_user_market_forbidden(
client: AsyncClient, market_token: str, other_user
):
"""测试市场部用户删除用户被禁止"""
response = await client.delete(
f"/api/v1/users/{other_user.id}",
headers={"Authorization": f"Bearer {market_token}"},
)
assert response.status_code == 403
data = response.json()
assert data["success"] is False
@pytest.mark.asyncio
@pytest.mark.integration
async def test_delete_user_not_found(
client: AsyncClient, admin_token: str
):
"""测试删除不存在的用户"""
response = await client.delete(
"/api/v1/users/99999",
headers={"Authorization": f"Bearer {admin_token}"},
)
assert response.status_code == 404
data = response.json()
assert data["success"] is False
assert data["error_code"] == "2001"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_reset_password_admin_success(
client: AsyncClient, admin_token: str, other_user
):
"""测试管理员重置密码成功"""
response = await client.post(
f"/api/v1/users/{other_user.id}/reset-password",
headers={"Authorization": f"Bearer {admin_token}"},
json={"new_password": "newpassword123"},
)
assert response.status_code == 200
data = response.json()
assert data["success"] is True
assert data["message"] == "密码重置成功"
@pytest.mark.asyncio
@pytest.mark.integration
async def test_reset_password_market_forbidden(
client: AsyncClient, market_token: str, other_user
):
"""测试市场部用户重置密码被禁止"""
response = await client.post(
f"/api/v1/users/{other_user.id}/reset-password",
headers={"Authorization": f"Bearer {market_token}"},
json={"new_password": "newpassword123"},
)
assert response.status_code == 403
data = response.json()
assert data["success"] is False
@pytest.mark.asyncio
@pytest.mark.integration
async def test_reset_password_invalid_password(
client: AsyncClient, admin_token: str, other_user
):
"""测试重置密码时使用无效密码格式"""
response = await client.post(
f"/api/v1/users/{other_user.id}/reset-password",
headers={"Authorization": f"Bearer {admin_token}"},
json={"new_password": "123"},
)
assert response.status_code == 400
data = response.json()
assert data["success"] is False