101 lines
3.7 KiB
Python
101 lines
3.7 KiB
Python
"""
|
|
用户认证API测试
|
|
"""
|
|
import pytest
|
|
from fastapi import status
|
|
|
|
|
|
@pytest.mark.unit
|
|
@pytest.mark.auth
|
|
class TestAuth:
|
|
"""认证相关测试"""
|
|
|
|
def test_register_user(self, client, test_user_data):
|
|
"""测试用户注册"""
|
|
response = client.post("/api/v1/auth/register", json=test_user_data)
|
|
assert response.status_code == status.HTTP_201_CREATED
|
|
data = response.json()
|
|
assert "id" in data
|
|
assert data["username"] == test_user_data["username"]
|
|
assert data["email"] == test_user_data["email"]
|
|
assert "password_hash" not in data # 密码哈希不应该返回
|
|
|
|
def test_register_duplicate_username(self, client, test_user_data):
|
|
"""测试重复用户名注册"""
|
|
# 第一次注册
|
|
response1 = client.post("/api/v1/auth/register", json=test_user_data)
|
|
assert response1.status_code == status.HTTP_201_CREATED
|
|
|
|
# 第二次注册相同用户名
|
|
response2 = client.post("/api/v1/auth/register", json=test_user_data)
|
|
assert response2.status_code == status.HTTP_400_BAD_REQUEST
|
|
|
|
def test_register_duplicate_email(self, client, test_user_data):
|
|
"""测试重复邮箱注册"""
|
|
# 第一次注册
|
|
response1 = client.post("/api/v1/auth/register", json=test_user_data)
|
|
assert response1.status_code == status.HTTP_201_CREATED
|
|
|
|
# 使用相同邮箱但不同用户名
|
|
duplicate_data = test_user_data.copy()
|
|
duplicate_data["username"] = "another_user"
|
|
response2 = client.post("/api/v1/auth/register", json=duplicate_data)
|
|
assert response2.status_code == status.HTTP_400_BAD_REQUEST
|
|
|
|
def test_login_success(self, client, test_user_data):
|
|
"""测试登录成功"""
|
|
# 先注册
|
|
client.post("/api/v1/auth/register", json=test_user_data)
|
|
|
|
# 登录
|
|
response = client.post(
|
|
"/api/v1/auth/login",
|
|
data={
|
|
"username": test_user_data["username"],
|
|
"password": test_user_data["password"]
|
|
}
|
|
)
|
|
assert response.status_code == status.HTTP_200_OK
|
|
data = response.json()
|
|
assert "access_token" in data
|
|
assert data["token_type"] == "bearer"
|
|
|
|
def test_login_wrong_password(self, client, test_user_data):
|
|
"""测试错误密码登录"""
|
|
# 先注册
|
|
client.post("/api/v1/auth/register", json=test_user_data)
|
|
|
|
# 使用错误密码登录
|
|
response = client.post(
|
|
"/api/v1/auth/login",
|
|
data={
|
|
"username": test_user_data["username"],
|
|
"password": "wrongpassword"
|
|
}
|
|
)
|
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
|
def test_login_nonexistent_user(self, client):
|
|
"""测试不存在的用户登录"""
|
|
response = client.post(
|
|
"/api/v1/auth/login",
|
|
data={
|
|
"username": "nonexistent",
|
|
"password": "password123"
|
|
}
|
|
)
|
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
|
def test_get_current_user(self, authenticated_client, test_user_data):
|
|
"""测试获取当前用户信息"""
|
|
response = authenticated_client.get("/api/v1/auth/me")
|
|
assert response.status_code == status.HTTP_200_OK
|
|
data = response.json()
|
|
assert data["username"] == test_user_data["username"]
|
|
assert data["email"] == test_user_data["email"]
|
|
|
|
def test_get_current_user_unauthorized(self, client):
|
|
"""测试未授权访问当前用户信息"""
|
|
response = client.get("/api/v1/auth/me")
|
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|