"""Pytest configuration and fixtures""" import pytest import pytest_asyncio import asyncio import os import sys from pathlib import Path from typing import AsyncGenerator import pytest from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine ROOT_DIR = Path(__file__).resolve().parents[1] if str(ROOT_DIR) not in sys.path: sys.path.append(str(ROOT_DIR)) from app.main import app from app.database import get_db, Base from app.config import settings # Test database URL TEST_DATABASE_URL = os.getenv( "TEST_DATABASE_URL", "sqlite+aiosqlite:///./test.db" ) # Create test engine test_engine = create_async_engine(TEST_DATABASE_URL, echo=False) TestSessionLocal = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False) @pytest.fixture(scope="session") def event_loop(): """Create event loop for tests""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest_asyncio.fixture(scope="function") async def db_session() -> AsyncGenerator[AsyncSession, None]: """Create test database session""" async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) async with TestSessionLocal() as session: yield session async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) @pytest_asyncio.fixture(scope="function") async def client(db_session: AsyncSession) -> AsyncGenerator[AsyncClient, None]: """Create test client""" async def override_get_db(): yield db_session app.dependency_overrides[get_db] = override_get_db transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as client: yield client app.dependency_overrides.clear() @pytest_asyncio.fixture async def test_user(client: AsyncClient): """Create a test user""" user_data = { "username": "testuser", "email": "test@example.com", "password": "testpassword123", "full_name": "Test User" } response = await client.post("/api/auth/register", json=user_data) assert response.status_code == 201 return response.json() @pytest_asyncio.fixture async def auth_headers(client: AsyncClient, test_user): """Get authentication headers""" login_data = { "username": "testuser", "password": "testpassword123" } response = await client.post( "/api/auth/login", data=login_data ) assert response.status_code == 200 token = response.json()["access_token"] return {"Authorization": f"Bearer {token}"}