"""测试配置和fixtures""" import asyncio from typing import AsyncGenerator, Generator import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from app.main import app from app.models.base import Base from app.config.database import SessionLocal from app.core.deps import get_db # 测试数据库URL TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:" # 创建测试引擎 test_engine = create_async_engine( TEST_DATABASE_URL, connect_args={"check_same_thread": False} ) # 创建测试会话工厂 TestSessionLocal = async_sessionmaker( test_engine, class_=AsyncSession, expire_on_commit=False, autocommit=False, autoflush=False ) @pytest.fixture(scope="session") def event_loop() -> Generator: """创建事件循环""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture(scope="function") async def db_session() -> AsyncGenerator[AsyncSession, None]: """创建测试数据库会话""" async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) async with TestSessionLocal() as session: yield session await session.rollback() async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) @pytest.fixture(scope="function") async def client(db_session: AsyncSession) -> AsyncGenerator[AsyncClient, None]: """创建测试客户端""" async def override_get_db(): yield db_session app.dependency_overrides[get_db] = override_get_db async with AsyncClient(app=app, base_url="http://test") as ac: yield ac app.dependency_overrides.clear() @pytest.fixture def test_user(): """测试用户""" return { "id": 1, "username": "test_user", "role": "user", "token": "test_token" } @pytest.fixture def test_admin(): """测试管理员""" return { "id": 2, "username": "test_admin", "role": "admin", "token": "admin_token" } @pytest.fixture def auth_headers(test_user): """认证请求头""" return {"Authorization": f"Bearer {test_user['token']}"} @pytest.fixture def admin_auth_headers(test_admin): """管理员认证请求头""" return {"Authorization": f"Bearer {test_admin['token']}"}