159 lines
4.7 KiB
Python
159 lines
4.7 KiB
Python
"""
|
|
认证 API 单元测试
|
|
"""
|
|
import pytest
|
|
from app import create_app
|
|
from app.extensions import db
|
|
from app.models import User
|
|
from app.utils.security import hash_password
|
|
|
|
|
|
@pytest.fixture
|
|
def app():
|
|
"""创建测试应用"""
|
|
app = create_app('testing')
|
|
with app.app_context():
|
|
db.create_all()
|
|
yield app
|
|
db.drop_all()
|
|
|
|
|
|
@pytest.fixture
|
|
def client(app):
|
|
"""创建测试客户端"""
|
|
return app.test_client()
|
|
|
|
|
|
class TestAuthAPI:
|
|
"""认证 API 测试"""
|
|
|
|
def test_register_success(self, client):
|
|
"""测试用户注册成功"""
|
|
response = client.post('/api/auth/register', json={
|
|
'username': 'testuser',
|
|
'email': 'test@example.com',
|
|
'password': 'password123',
|
|
'nickname': 'Test User'
|
|
})
|
|
|
|
assert response.status_code == 201
|
|
data = response.get_json()
|
|
assert data['user']['username'] == 'testuser'
|
|
assert data['user']['email'] == 'test@example.com'
|
|
|
|
def test_register_duplicate_username(self, client, app):
|
|
"""测试重复用户名"""
|
|
# 创建已存在的用户
|
|
with app.app_context():
|
|
user = User(
|
|
username='testuser',
|
|
email='existing@example.com',
|
|
password_hash=hash_password('password')
|
|
)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
|
|
# 尝试注册相同用户名
|
|
response = client.post('/api/auth/register', json={
|
|
'username': 'testuser',
|
|
'email': 'new@example.com',
|
|
'password': 'password123'
|
|
})
|
|
|
|
assert response.status_code == 400
|
|
|
|
def test_register_missing_fields(self, client):
|
|
"""测试缺少必填字段"""
|
|
response = client.post('/api/auth/register', json={
|
|
'username': 'testuser'
|
|
})
|
|
|
|
assert response.status_code == 400
|
|
|
|
def test_login_success(self, client, app):
|
|
"""测试登录成功"""
|
|
# 创建用户
|
|
with app.app_context():
|
|
user = User(
|
|
username='testuser',
|
|
email='test@example.com',
|
|
password_hash=hash_password('password123')
|
|
)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
|
|
# 登录
|
|
response = client.post('/api/auth/login', json={
|
|
'username': 'testuser',
|
|
'password': 'password123'
|
|
})
|
|
|
|
assert response.status_code == 200
|
|
data = response.get_json()
|
|
assert 'access_token' in data
|
|
assert 'refresh_token' in data
|
|
|
|
def test_login_invalid_credentials(self, client):
|
|
"""测试无效凭据"""
|
|
response = client.post('/api/auth/login', json={
|
|
'username': 'nonexistent',
|
|
'password': 'wrong'
|
|
})
|
|
|
|
assert response.status_code == 401
|
|
|
|
def test_verify_token(self, client, app):
|
|
"""测试 Token 验证"""
|
|
# 创建用户
|
|
with app.app_context():
|
|
user = User(
|
|
username='testuser',
|
|
email='test@example.com',
|
|
password_hash=hash_password('password123')
|
|
)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
|
|
# 登录获取 token
|
|
login_response = client.post('/api/auth/login', json={
|
|
'username': 'testuser',
|
|
'password': 'password123'
|
|
})
|
|
token = login_response.get_json()['access_token']
|
|
|
|
# 验证 token
|
|
response = client.post('/api/auth/verify', headers={
|
|
'Authorization': f'Bearer {token}'
|
|
})
|
|
|
|
assert response.status_code == 200
|
|
data = response.get_json()
|
|
assert data['valid'] is True
|
|
|
|
|
|
class TestValidation:
|
|
"""验证测试"""
|
|
|
|
def test_validate_email(self, client):
|
|
"""测试邮箱验证"""
|
|
from app.utils.validators import validate_email
|
|
|
|
assert validate_email('test@example.com') is True
|
|
assert validate_email('invalid-email') is False
|
|
|
|
def test_validate_username(self, client):
|
|
"""测试用户名验证"""
|
|
from app.utils.validators import validate_username
|
|
|
|
assert validate_username('testuser') is True
|
|
assert validate_username('ab') is False # 太短
|
|
assert validate_username('test-user') is True
|
|
assert validate_username('test@user') is False # 包含非法字符
|
|
|
|
def test_validate_uuid(self, client):
|
|
"""测试 UUID 验证"""
|
|
from app.utils.validators import validate_uuid
|
|
|
|
assert validate_uuid('550e8400-e29b-41d4-a716-446655440000') is True
|
|
assert validate_uuid('invalid-uuid') is False
|