"""Shared pytest fixtures.""" from __future__ import annotations import os from collections.abc import AsyncGenerator from pathlib import Path import pytest import pytest_asyncio from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine # Ensure test settings before app import os.environ.setdefault("APP_NAME", "RastroTest") os.environ.setdefault("RUN_SCHEDULER", "false") os.environ.setdefault("ENABLE_IPV6", "false") from app.config import Settings, get_settings from app.db import reset_engine from app.db.models import Base @pytest.fixture def settings(tmp_path: Path) -> Settings: get_settings.cache_clear() reset_engine() db = tmp_path / "test.db" s = Settings( APP_NAME="RastroTest", APP_DESCRIPTION="test", APP_VERSION="0.1.0", PUBLIC_URL="http://test.local", DATABASE_URL=f"sqlite+aiosqlite:///{db.as_posix()}", RUN_SCHEDULER=False, ENABLE_IPV6="false", ) return s @pytest_asyncio.fixture async def session(settings: Settings) -> AsyncGenerator[AsyncSession]: engine = create_async_engine(settings.database_url, echo=False) async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) factory = async_sessionmaker(engine, expire_on_commit=False) async with factory() as sess: yield sess await engine.dispose() @pytest_asyncio.fixture async def client( settings: Settings, monkeypatch: pytest.MonkeyPatch ) -> AsyncGenerator[AsyncClient]: get_settings.cache_clear() reset_engine() monkeypatch.setenv("DATABASE_URL", settings.database_url) monkeypatch.setenv("RUN_SCHEDULER", "false") monkeypatch.setenv("APP_NAME", "RastroTest") get_settings.cache_clear() from app.main import create_app application = create_app() transport = ASGITransport(app=application) async with AsyncClient(transport=transport, base_url="http://test") as ac: yield ac get_settings.cache_clear() reset_engine()