import pytest from httpx import AsyncClient from tests.conftest import auth_header class TestListUsers: async def test_admin_list_users(self, client: AsyncClient, admin_token): resp = await client.get("/api/v1/users", headers=auth_header(admin_token)) assert resp.status_code == 200 data = resp.json() assert isinstance(data, dict) and "items" in data async def test_non_admin_list_users(self, client: AsyncClient, developer_token): resp = await client.get("/api/v1/users", headers=auth_header(developer_token)) assert resp.status_code == 403 class TestCreateUser: async def test_create_user_success(self, client: AsyncClient, admin_token): resp = await client.post("/api/v1/users", headers=auth_header(admin_token), json={ "username": "newuser", "display_name": "新用户", "password": "123456", "role": "developer", }) assert resp.status_code == 201 data = resp.json() assert data["username"] == "newuser" assert data["role"] == "developer" assert "id" in data async def test_create_duplicate_username(self, client: AsyncClient, admin_user, admin_token): resp = await client.post("/api/v1/users", headers=auth_header(admin_token), json={ "username": "admin", "display_name": "重复", "password": "123456", "role": "developer", }) assert resp.status_code == 400 class TestGetUser: async def test_get_single_user(self, client: AsyncClient, admin_user, admin_token): resp = await client.get(f"/api/v1/users/{admin_user.id}", headers=auth_header(admin_token)) assert resp.status_code == 200 assert resp.json()["username"] == "admin" async def test_get_nonexistent_user(self, client: AsyncClient, admin_token): resp = await client.get("/api/v1/users/9999", headers=auth_header(admin_token)) assert resp.status_code == 404 class TestUpdateUser: async def test_update_user(self, client: AsyncClient, admin_user, admin_token): resp = await client.put( f"/api/v1/users/{admin_user.id}", headers=auth_header(admin_token), json={"display_name": "管理员改名"}, ) assert resp.status_code == 200 assert resp.json()["display_name"] == "管理员改名" class TestDeleteUser: async def test_delete_user(self, client: AsyncClient, admin_user, dba_user, admin_token): resp = await client.delete( f"/api/v1/users/{dba_user.id}", headers=auth_header(admin_token), ) assert resp.status_code == 200 async def test_delete_self(self, client: AsyncClient, admin_user, admin_token): resp = await client.delete( f"/api/v1/users/{admin_user.id}", headers=auth_header(admin_token), ) assert resp.status_code == 400