266 lines
8.8 KiB
Python
266 lines
8.8 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
简单的团队长功能测试脚本
|
||
|
|
用于验证基本的团队长功能逻辑
|
||
|
|
"""
|
||
|
|
|
||
|
|
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 User, TeamMember, SystemSettings
|
||
|
|
from werkzeug.security import generate_password_hash
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
|
||
|
|
def test_team_leader_basic_functionality():
|
||
|
|
"""测试团队长基本功能"""
|
||
|
|
print("开始测试团队长基本功能...")
|
||
|
|
|
||
|
|
# 设置测试环境变量
|
||
|
|
os.environ['DATABASE_URL'] = 'sqlite:///:memory:'
|
||
|
|
os.environ['SECRET_KEY'] = 'test-secret-key'
|
||
|
|
os.environ['JWT_SECRET_KEY'] = 'test-secret-key'
|
||
|
|
|
||
|
|
# 创建测试应用
|
||
|
|
app = create_app()
|
||
|
|
|
||
|
|
with app.app_context():
|
||
|
|
# 创建数据库表
|
||
|
|
db.create_all()
|
||
|
|
|
||
|
|
# 创建系统设置
|
||
|
|
SystemSettings.set_value('site_title', '测试系统', '网站标题', 'string')
|
||
|
|
SystemSettings.set_value('max_daily_downloads', '10', '每日最大下载次数', 'int')
|
||
|
|
SystemSettings.set_value('file_size_limit', str(100 * 1024 * 1024), '文件大小限制(字节)', 'int')
|
||
|
|
SystemSettings.set_value('allowed_file_types', 'txt,pdf,doc,docx,xls,xlsx', '允许的文件类型', 'string')
|
||
|
|
|
||
|
|
# 创建测试用户(先删除已存在的用户)
|
||
|
|
User.query.filter_by(username='admin').delete()
|
||
|
|
User.query.filter_by(username='leader').delete()
|
||
|
|
User.query.filter_by(username='member').delete()
|
||
|
|
db.session.commit()
|
||
|
|
|
||
|
|
admin = User(
|
||
|
|
username='admin',
|
||
|
|
email='admin@test.com',
|
||
|
|
password_hash=generate_password_hash('admin123'),
|
||
|
|
is_admin=True,
|
||
|
|
is_team_leader=False,
|
||
|
|
is_active=True,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(admin)
|
||
|
|
|
||
|
|
leader = User(
|
||
|
|
username='leader',
|
||
|
|
email='leader@test.com',
|
||
|
|
password_hash=generate_password_hash('leader123'),
|
||
|
|
is_admin=False,
|
||
|
|
is_team_leader=True,
|
||
|
|
is_active=True,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(leader)
|
||
|
|
|
||
|
|
member = User(
|
||
|
|
username='member',
|
||
|
|
email='member@test.com',
|
||
|
|
password_hash=generate_password_hash('member123'),
|
||
|
|
is_admin=False,
|
||
|
|
is_team_leader=False,
|
||
|
|
is_active=True,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(member)
|
||
|
|
|
||
|
|
db.session.commit()
|
||
|
|
|
||
|
|
print("✓ 测试用户创建成功")
|
||
|
|
|
||
|
|
# 测试1: 验证用户角色
|
||
|
|
assert admin.is_admin is True
|
||
|
|
assert admin.is_team_leader is False
|
||
|
|
assert leader.is_admin is False
|
||
|
|
assert leader.is_team_leader is True
|
||
|
|
assert member.is_admin is False
|
||
|
|
assert member.is_team_leader is False
|
||
|
|
print("✓ 用户角色验证通过")
|
||
|
|
|
||
|
|
# 测试2: 创建团队成员关系
|
||
|
|
team_member = TeamMember(
|
||
|
|
leader_id=leader.id,
|
||
|
|
member_id=member.id,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(team_member)
|
||
|
|
db.session.commit()
|
||
|
|
print("✓ 团队成员关系创建成功")
|
||
|
|
|
||
|
|
# 测试3: 验证团队成员关系
|
||
|
|
assert team_member.leader_id == leader.id
|
||
|
|
assert team_member.member_id == member.id
|
||
|
|
print("✓ 团队成员关系验证通过")
|
||
|
|
|
||
|
|
# 测试4: 查询团队成员
|
||
|
|
leader_members = TeamMember.query.filter_by(leader_id=leader.id).all()
|
||
|
|
assert len(leader_members) == 1
|
||
|
|
assert leader_members[0].member_id == member.id
|
||
|
|
print("✓ 团队成员查询功能正常")
|
||
|
|
|
||
|
|
# 测试5: 查询用户的团队长
|
||
|
|
member_leader = TeamMember.query.filter_by(member_id=member.id).first()
|
||
|
|
assert member_leader is not None
|
||
|
|
assert member_leader.leader_id == leader.id
|
||
|
|
print("✓ 用户团队长查询功能正常")
|
||
|
|
|
||
|
|
# 测试6: 验证不能添加自己为成员
|
||
|
|
try:
|
||
|
|
self_member = TeamMember(
|
||
|
|
leader_id=leader.id,
|
||
|
|
member_id=leader.id,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(self_member)
|
||
|
|
db.session.commit()
|
||
|
|
assert False, "应该禁止添加自己为成员"
|
||
|
|
except Exception as e:
|
||
|
|
print("✓ 正确阻止了添加自己为成员的行为")
|
||
|
|
|
||
|
|
# 测试7: 验证不能重复添加成员
|
||
|
|
try:
|
||
|
|
duplicate_member = TeamMember(
|
||
|
|
leader_id=leader.id,
|
||
|
|
member_id=member.id,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(duplicate_member)
|
||
|
|
db.session.commit()
|
||
|
|
assert False, "应该禁止重复添加成员"
|
||
|
|
except Exception as e:
|
||
|
|
print("✓ 正确阻止了重复添加成员的行为")
|
||
|
|
|
||
|
|
print("\n✅ 所有团队长基本功能测试通过!")
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
def test_team_leader_permissions():
|
||
|
|
"""测试团队长权限验证"""
|
||
|
|
print("\n开始测试团队长权限验证...")
|
||
|
|
|
||
|
|
# 设置测试环境变量
|
||
|
|
os.environ['DATABASE_URL'] = 'sqlite:///:memory:'
|
||
|
|
os.environ['SECRET_KEY'] = 'test-secret-key'
|
||
|
|
os.environ['JWT_SECRET_KEY'] = 'test-secret-key'
|
||
|
|
|
||
|
|
app = create_app()
|
||
|
|
|
||
|
|
with app.app_context():
|
||
|
|
db.create_all()
|
||
|
|
|
||
|
|
# 创建系统设置
|
||
|
|
SystemSettings.set_value('site_title', '测试系统', '网站标题', 'string')
|
||
|
|
SystemSettings.set_value('max_daily_downloads', '10', '每日最大下载次数', 'int')
|
||
|
|
SystemSettings.set_value('file_size_limit', str(100 * 1024 * 1024), '文件大小限制(字节)', 'int')
|
||
|
|
SystemSettings.set_value('allowed_file_types', 'txt,pdf,doc,docx,xls,xlsx', '允许的文件类型', 'string')
|
||
|
|
|
||
|
|
# 创建用户(先删除已存在的用户)
|
||
|
|
User.query.filter_by(username='admin').delete()
|
||
|
|
User.query.filter_by(username='leader').delete()
|
||
|
|
User.query.filter_by(username='user').delete()
|
||
|
|
db.session.commit()
|
||
|
|
|
||
|
|
admin = User(
|
||
|
|
username='admin',
|
||
|
|
email='admin@test.com',
|
||
|
|
password_hash=generate_password_hash('admin123'),
|
||
|
|
is_admin=True,
|
||
|
|
is_team_leader=False,
|
||
|
|
is_active=True,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(admin)
|
||
|
|
|
||
|
|
leader = User(
|
||
|
|
username='leader',
|
||
|
|
email='leader@test.com',
|
||
|
|
password_hash=generate_password_hash('leader123'),
|
||
|
|
is_admin=False,
|
||
|
|
is_team_leader=True,
|
||
|
|
is_active=True,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(leader)
|
||
|
|
|
||
|
|
user = User(
|
||
|
|
username='user',
|
||
|
|
email='user@test.com',
|
||
|
|
password_hash=generate_password_hash('user123'),
|
||
|
|
is_admin=False,
|
||
|
|
is_team_leader=False,
|
||
|
|
is_active=True,
|
||
|
|
created_at=datetime.utcnow()
|
||
|
|
)
|
||
|
|
db.session.add(user)
|
||
|
|
|
||
|
|
db.session.commit()
|
||
|
|
|
||
|
|
# 测试权限验证装饰器逻辑
|
||
|
|
def team_leader_required(user):
|
||
|
|
"""模拟team_leader_required装饰器逻辑"""
|
||
|
|
if not user.is_team_leader:
|
||
|
|
return False, "需要团队长权限"
|
||
|
|
return True, None
|
||
|
|
|
||
|
|
# 测试管理员权限
|
||
|
|
success, error = team_leader_required(admin)
|
||
|
|
assert success is False
|
||
|
|
assert error == "需要团队长权限"
|
||
|
|
print("✓ 管理员没有团队长权限")
|
||
|
|
|
||
|
|
# 测试普通用户权限
|
||
|
|
success, error = team_leader_required(user)
|
||
|
|
assert success is False
|
||
|
|
assert error == "需要团队长权限"
|
||
|
|
print("✓ 普通用户没有团队长权限")
|
||
|
|
|
||
|
|
# 测试团队长权限
|
||
|
|
success, error = team_leader_required(leader)
|
||
|
|
assert success is True
|
||
|
|
assert error is None
|
||
|
|
print("✓ 团队长具有正确的权限")
|
||
|
|
|
||
|
|
print("\n✅ 团队长权限验证测试通过!")
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
def main():
|
||
|
|
"""运行所有测试"""
|
||
|
|
print("=" * 50)
|
||
|
|
print("团队长功能测试开始")
|
||
|
|
print("=" * 50)
|
||
|
|
|
||
|
|
try:
|
||
|
|
# 运行基本功能测试
|
||
|
|
test_team_leader_basic_functionality()
|
||
|
|
|
||
|
|
# 运行权限验证测试
|
||
|
|
test_team_leader_permissions()
|
||
|
|
|
||
|
|
print("\n" + "=" * 50)
|
||
|
|
print("🎉 所有测试通过!团队长功能正常工作")
|
||
|
|
print("=" * 50)
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print(f"\n❌ 测试失败: {str(e)}")
|
||
|
|
import traceback
|
||
|
|
traceback.print_exc()
|
||
|
|
return False
|
||
|
|
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
success = main()
|
||
|
|
sys.exit(0 if success else 1)
|