import pytest from httpx import ASGITransport, AsyncClient from sqlalchemy import NullPool, insert from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine from src.api.dependacies.db_dep import get_db from src.core.auth_manager import AuthManager from src.core.database import Base from src.core.db_manager import DBManager from src.main import app from src.models import * # noqa: F403 engine_null_pool = create_async_engine( "sqlite+aiosqlite:///tests/test_db.db", poolclass=NullPool ) test_session_maker = async_sessionmaker(engine_null_pool, expire_on_commit=False) class TestDBManager(DBManager): def __init__(self): self.session_factory = test_session_maker async def get_test_db(): async with TestDBManager() as db: yield db @pytest.fixture(scope="function") async def db(): async for db in get_test_db(): yield db @pytest.fixture(scope="function") async def ac(): async with AsyncClient( transport=ASGITransport(app=app), base_url="http://test" ) as ac: yield ac app.dependency_overrides[get_db] = get_test_db @pytest.fixture(scope="session", autouse=True) async def setup_database(): async with engine_null_pool.begin() as conn: await conn.run_sync(Base.metadata.drop_all) await conn.run_sync(Base.metadata.create_all) @pytest.fixture(scope="session", autouse=True) async def add_admin(setup_database): hashed_pass = AuthManager.get_password_hash("admin") user_admin = { "username": "admin", "hashed_password": hashed_pass, "is_superuser": True, } async with test_session_maker() as conn: result = await conn.execute( insert(UsersORM).values(user_admin).returning(UsersORM) # noqa: F405 ) await conn.commit() admin = result.scalar_one() assert admin.is_superuser is True