"""Pytest configuration and fixtures for letsbe-orchestrator tests.""" import asyncio import uuid from collections.abc import AsyncGenerator import pytest import pytest_asyncio from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from app.models.base import Base from app.models.tenant import Tenant # Use in-memory SQLite for testing TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:" @pytest.fixture(scope="session") def event_loop(): """Create an instance of the default event loop for the test session.""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest_asyncio.fixture(scope="function") async def async_engine(): """Create a test async engine.""" engine = create_async_engine(TEST_DATABASE_URL, echo=False) async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield engine async with engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) await engine.dispose() @pytest_asyncio.fixture(scope="function") async def db(async_engine) -> AsyncGenerator[AsyncSession, None]: """Create a test database session.""" session_factory = async_sessionmaker( async_engine, class_=AsyncSession, expire_on_commit=False, autocommit=False, autoflush=False, ) async with session_factory() as session: yield session @pytest_asyncio.fixture(scope="function") async def test_tenant(db: AsyncSession) -> Tenant: """Create a test tenant.""" tenant = Tenant( id=uuid.uuid4(), name="Test Tenant", slug="test-tenant", ) db.add(tenant) await db.commit() await db.refresh(tenant) return tenant