chatbot / tests /conftest.py
jawadsaghir12's picture
new update
8c77cd6
"""Pytest configuration and fixtures for all tests."""
import pytest
import pytest_asyncio
import asyncio
from typing import AsyncGenerator
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
from sqlalchemy.orm import sessionmaker
from src.db.models import User, SQLModel
from src.core.config.config import settings
# Configure pytest-asyncio
pytest_plugins = ("pytest_asyncio",)
@pytest.fixture(scope="session")
def event_loop():
"""Create event loop for async tests."""
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
yield loop
loop.close()
@pytest_asyncio.fixture(scope="session")
async def test_db_engine() -> AsyncGenerator[AsyncEngine, None]:
"""Create test database engine."""
# Use in-memory SQLite for testing
engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
future=True,
)
# Create tables
async with engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.create_all)
yield engine
# Cleanup
await engine.dispose()
@pytest_asyncio.fixture(scope="session")
async def test_session_maker(test_db_engine: AsyncEngine):
"""Create session maker for test database."""
return sessionmaker(
bind=test_db_engine,
class_=AsyncSession,
expire_on_commit=False,
future=True,
)
@pytest_asyncio.fixture
async def session(test_session_maker) -> AsyncGenerator[AsyncSession, None]:
"""Provide database session for tests."""
async with test_session_maker() as session:
yield session
await session.rollback()
@pytest_asyncio.fixture
async def test_user(session: AsyncSession) -> User:
"""Create a test user."""
user = User(
email="testuser@example.com",
name="Test User",
password_hash="hashed_password",
is_active=True,
)
session.add(user)
await session.commit()
await session.refresh(user)
return user
@pytest_asyncio.fixture
async def test_user_1(session: AsyncSession) -> User:
"""Create first test user."""
user = User(
email="user1@example.com",
name="Test User 1",
password_hash="hashed_password_1",
is_active=True,
)
session.add(user)
await session.commit()
await session.refresh(user)
return user
@pytest_asyncio.fixture
async def test_user_2(session: AsyncSession) -> User:
"""Create second test user."""
user = User(
email="user2@example.com",
name="Test User 2",
password_hash="hashed_password_2",
is_active=True,
)
session.add(user)
await session.commit()
await session.refresh(user)
return user