import pytest import os import tempfile from app import create_app, db from app.models import User, SystemSettings from werkzeug.security import generate_password_hash from datetime import datetime @pytest.fixture def app(): """创建测试应用""" # 创建临时数据库文件 db_fd, db_path = tempfile.mkstemp() # 配置测试环境 app = create_app({ 'TESTING': True, 'SQLALCHEMY_DATABASE_URI': f'sqlite:///{db_path}', 'JWT_SECRET_KEY': 'test-secret-key', 'WTF_CSRF_ENABLED': False }) with app.app_context(): db.create_all() # 创建测试系统设置 settings = SystemSettings( site_title='测试系统', max_daily_downloads=10, file_size_limit=100 * 1024 * 1024, # 100MB allowed_file_types='txt,pdf,doc,docx,xls,xlsx' ) db.session.add(settings) db.session.commit() yield app db.session.remove() db.drop_all() os.close(db_fd) os.unlink(db_path) @pytest.fixture def client(app): """创建测试客户端""" return app.test_client() @pytest.fixture def auth_headers(app): """创建认证头""" with app.app_context(): # 创建管理员用户 admin_user = User( username='admin', email='admin@test.com', password_hash=generate_password_hash('admin123'), is_admin=True, is_active=True, created_at=datetime.utcnow() ) db.session.add(admin_user) # 创建普通用户 normal_user = User( username='user', email='user@test.com', password_hash=generate_password_hash('user123'), is_admin=False, is_active=True, created_at=datetime.utcnow() ) db.session.add(normal_user) # 创建团队长用户 team_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(team_leader) db.session.commit() # 获取JWT token client = app.test_client() # 管理员token admin_response = client.post('/api/auth/login', json={ 'username': 'admin', 'password': 'admin123' }) admin_token = admin_response.json['access_token'] # 普通用户token user_response = client.post('/api/auth/login', json={ 'username': 'user', 'password': 'user123' }) user_token = user_response.json['access_token'] # 团队长token leader_response = client.post('/api/auth/login', json={ 'username': 'leader', 'password': 'leader123' }) leader_token = leader_response.json['access_token'] return { 'admin': {'Authorization': f'Bearer {admin_token}'}, 'user': {'Authorization': f'Bearer {user_token}'}, 'leader': {'Authorization': f'Bearer {leader_token}'} } @pytest.fixture def admin_auth_headers(auth_headers): """管理员认证头""" return auth_headers['admin'] @pytest.fixture def user_auth_headers(auth_headers): """普通用户认证头""" return auth_headers['user'] @pytest.fixture def leader_auth_headers(auth_headers): """团队长认证头""" return auth_headers['leader']