import asyncio from collections.abc import AsyncGenerator import pytest from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from proxy_pool.config import Settings, DatabaseSettings, RedisSettings from proxy_pool.db.base import Base @pytest.fixture(scope="session") def event_loop(): loop = asyncio.new_event_loop() yield loop loop.close() @pytest.fixture(scope="session") def test_settings() -> Settings: import os return Settings( secret_key=os.environ.get("SECRET_KEY", "test-secret"), log_level=os.environ.get("LOG_LEVEL", "DEBUG"), db=DatabaseSettings( url=os.environ.get( "DB_URL", "postgresql+asyncpg://proxypool:proxypool@localhost:5432/proxypool", ), ), redis=RedisSettings( url=os.environ.get("REDIS_URL", "redis://localhost:6379/1"), ), ) @pytest.fixture(scope="session") async def engine(test_settings: Settings): engine = create_async_engine(test_settings.db.url) yield engine await engine.dispose() @pytest.fixture async def db_session(engine) -> AsyncGenerator[AsyncSession, None]: async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) session_factory = async_sessionmaker(engine, expire_on_commit=False) async with session_factory() as session: yield session await session.rollback()