"""FluentGerman.ai — Test configuration & fixtures.""" import asyncio from collections.abc import AsyncGenerator import pytest import pytest_asyncio from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from app.config import Settings, get_settings from app.database import Base, get_db from app.main import app # Use SQLite for tests (in-memory) TEST_DATABASE_URL = "sqlite+aiosqlite:///./test.db" def get_test_settings() -> Settings: return Settings( database_url=TEST_DATABASE_URL, secret_key="test-secret-key", llm_api_key="test-key", admin_password="testadmin123", ) test_engine = create_async_engine(TEST_DATABASE_URL, echo=False) test_session = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False) async def override_get_db() -> AsyncGenerator[AsyncSession, None]: async with test_session() as session: yield session app.dependency_overrides[get_db] = override_get_db app.dependency_overrides[get_settings] = get_test_settings @pytest_asyncio.fixture(autouse=True) async def setup_database(): async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) @pytest_asyncio.fixture async def client() -> AsyncGenerator[AsyncClient, None]: transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as c: yield c @pytest_asyncio.fixture async def admin_token(client: AsyncClient) -> str: """Create admin and return token.""" from app.auth import hash_password from app.models import User async with test_session() as db: admin = User( username="admin", email="admin@test.com", hashed_password=hash_password("admin123"), is_admin=True, ) db.add(admin) await db.commit() resp = await client.post("/api/auth/login", json={"username": "admin", "password": "admin123"}) return resp.json()["access_token"] @pytest_asyncio.fixture async def user_token(client: AsyncClient, admin_token: str) -> str: """Create a regular user via admin API and return their token.""" await client.post( "/api/users/", json={"username": "testuser", "email": "user@test.com", "password": "user123"}, headers={"Authorization": f"Bearer {admin_token}"}, ) resp = await client.post("/api/auth/login", json={"username": "testuser", "password": "user123"}) return resp.json()["access_token"]