Spaces:
Sleeping
Sleeping
| from typing import Any, AsyncGenerator | |
| import pytest | |
| from fastapi import FastAPI | |
| from httpx import AsyncClient | |
| from sqlalchemy.ext.asyncio import ( | |
| AsyncEngine, | |
| AsyncSession, | |
| async_sessionmaker, | |
| create_async_engine, | |
| ) | |
| from reworkd_platform.db.dependencies import get_db_session | |
| from reworkd_platform.db.utils import create_database, drop_database | |
| from reworkd_platform.settings import settings | |
| from reworkd_platform.web.application import get_app | |
| def anyio_backend() -> str: | |
| """ | |
| Backend for anyio pytest plugin. | |
| :return: backend name. | |
| """ | |
| return "asyncio" | |
| async def _engine() -> AsyncGenerator[AsyncEngine, None]: | |
| """ | |
| Create engine and databases. | |
| :yield: new engine. | |
| """ | |
| from reworkd_platform.db.meta import meta # noqa: WPS433 | |
| from reworkd_platform.db.models import load_all_models # noqa: WPS433 | |
| load_all_models() | |
| await create_database() | |
| engine = create_async_engine(str(settings.db_url)) | |
| async with engine.begin() as conn: | |
| await conn.run_sync(meta.create_all) | |
| try: | |
| yield engine | |
| finally: | |
| await engine.dispose() | |
| await drop_database() | |
| async def dbsession( | |
| _engine: AsyncEngine, | |
| ) -> AsyncGenerator[AsyncSession, None]: | |
| """ | |
| Get session to database. | |
| Fixture that returns a SQLAlchemy session with a SAVEPOINT, and the rollback to it | |
| after the test completes. | |
| :param _engine: current engine. | |
| :yields: async session. | |
| """ | |
| connection = await _engine.connect() | |
| trans = await connection.begin() | |
| session_maker = async_sessionmaker( | |
| connection, | |
| expire_on_commit=False, | |
| ) | |
| session = session_maker() | |
| try: | |
| yield session | |
| finally: | |
| await session.close() | |
| await trans.rollback() | |
| await connection.close() | |
| def fastapi_app(dbsession: AsyncSession) -> FastAPI: | |
| """ | |
| Fixture for creating FastAPI app. | |
| :return: fastapi app with mocked dependencies. | |
| """ | |
| application = get_app() | |
| application.dependency_overrides[get_db_session] = lambda: dbsession | |
| return application # noqa: WPS331 | |
| async def client( | |
| fastapi_app: FastAPI, anyio_backend: Any | |
| ) -> AsyncGenerator[AsyncClient, None]: | |
| """ | |
| Fixture that creates client for requesting server. | |
| :param fastapi_app: the application. | |
| :yield: client for the app. | |
| """ | |
| async with AsyncClient(app=fastapi_app, base_url="http://test") as ac: | |
| yield ac | |