Kamixitong/test_refactored_admin.py
2025-11-11 21:39:12 +08:00

182 lines
5.8 KiB
Python

#!/usr/bin/env python3
"""
重构后的账号管理系统测试脚本
运行方式:
1. 确保数据库已应用迁移:
flask db upgrade
2. 运行测试:
python test_refactored_admin.py
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from app import create_app, db
from app.models import Admin, AuditLog
def test_admin_model():
"""测试Admin模型功能"""
print("=" * 50)
print("测试1: Admin模型基本功能")
print("=" * 50)
app = create_app()
with app.app_context():
# 检查is_deleted字段
admin_columns = [c.name for c in Admin.__table__.columns]
print(f"✓ Admin表字段: {', '.join(admin_columns)}")
assert 'is_deleted' in admin_columns, "is_deleted字段不存在"
print("✓ is_deleted字段已添加")
assert 'delete_time' in admin_columns, "delete_time字段不存在"
print("✓ delete_time字段已添加")
# 测试软删除功能
print("\n测试软删除功能...")
test_admin = Admin.query.filter_by(username='testuser').first()
if test_admin:
old_delete_time = test_admin.delete_time
test_admin.soft_delete()
db.session.commit()
assert test_admin.is_deleted == 1, "软删除失败"
assert test_admin.delete_time is not None, "delete_time未设置"
print("✓ 软删除功能正常")
# 恢复测试数据
test_admin.is_deleted = 0
test_admin.delete_time = None
db.session.commit()
print("✓ 测试数据已恢复")
print("\n✅ Admin模型测试通过!\n")
def test_audit_log():
"""测试审计日志功能"""
print("=" * 50)
print("测试2: 审计日志功能")
print("=" * 50)
app = create_app()
with app.app_context():
# 检查audit_log表
audit_columns = [c.name for c in AuditLog.__table__.columns]
print(f"✓ AuditLog表字段: {', '.join(audit_columns)}")
required_columns = ['log_id', 'admin_id', 'action', 'target_type', 'details', 'create_time']
for col in required_columns:
assert col in audit_columns, f"{col}字段不存在"
print(f"{col}字段存在")
# 测试记录日志
print("\n测试记录审计日志...")
admin = Admin.query.filter_by(username='admin').first()
if admin:
log_count_before = AuditLog.query.count()
AuditLog.log_action(
admin_id=admin.admin_id,
action='TEST',
target_type='ADMIN',
target_id=admin.admin_id,
details={'test': 'data'}
)
log_count_after = AuditLog.query.count()
assert log_count_after > log_count_before, "审计日志记录失败"
print("✓ 审计日志记录成功")
print("\n✅ 审计日志测试通过!\n")
def test_admin_api():
"""测试Admin API"""
print("=" * 50)
print("测试3: Admin API测试")
print("=" * 50)
app = create_app()
with app.app_context():
from app.api.admin import validate_admin_data, validate_username, validate_password, validate_email
# 测试数据验证
print("测试数据验证函数...")
# 验证用户名
assert validate_username('testuser')[0] == True, "有效用户名验证失败"
print("✓ 有效用户名验证通过")
assert validate_username('ab')[0] == False, "过短用户名应该被拒绝"
print("✓ 短用户名验证正确拒绝")
# 验证密码
assert validate_password('123456')[0] == True, "有效密码验证失败"
print("✓ 有效密码验证通过")
assert validate_password('123')[0] == False, "过短密码应该被拒绝"
print("✓ 短密码验证正确拒绝")
# 验证邮箱
assert validate_email('test@example.com')[0] == True, "有效邮箱验证失败"
print("✓ 有效邮箱验证通过")
assert validate_email('invalid-email')[0] == False, "无效邮箱应该被拒绝"
print("✓ 无效邮箱验证正确拒绝")
print("\n✅ Admin API测试通过!\n")
def test_response_structure():
"""测试响应结构"""
print("=" * 50)
print("测试4: 统一响应格式")
print("=" * 50)
from app.api.admin import create_response, ResponseCode
# 测试成功响应
success_response = create_response(True, data={'id': 1}, message='测试成功', code=ResponseCode.SUCCESS)
assert success_response[0].json['success'] == True, "成功响应格式错误"
assert 'data' in success_response[0].json, "响应缺少data字段"
assert 'message' in success_response[0].json, "响应缺少message字段"
assert 'code' in success_response[0].json, "响应缺少code字段"
print("✓ 成功响应格式正确")
# 测试失败响应
error_response = create_response(False, message='测试失败', code=ResponseCode.VALIDATION_ERROR, status_code=400)
assert error_response[0].json['success'] == False, "失败响应格式错误"
print("✓ 失败响应格式正确")
print("\n✅ 统一响应格式测试通过!\n")
def main():
"""运行所有测试"""
print("\n" + "=" * 60)
print("重构后的账号管理系统测试")
print("=" * 60 + "\n")
try:
test_admin_model()
test_audit_log()
test_admin_api()
test_response_structure()
print("=" * 60)
print("🎉 所有测试通过!")
print("=" * 60 + "\n")
return 0
except AssertionError as e:
print(f"\n❌ 测试失败: {str(e)}\n")
return 1
except Exception as e:
print(f"\n❌ 测试出错: {str(e)}\n")
import traceback
traceback.print_exc()
return 1
if __name__ == '__main__':
sys.exit(main())