| """Shared pytest fixtures.""" |
|
|
| from __future__ import annotations |
|
|
| from collections.abc import AsyncIterator |
|
|
| import pytest |
| import pytest_asyncio |
| from httpx import ASGITransport, AsyncClient |
|
|
| from docsifer.analytics import AnalyticsService, InMemoryStore |
| from docsifer.config import Settings, get_settings |
| from docsifer.main import create_app |
|
|
|
|
| @pytest.fixture |
| def settings(monkeypatch: pytest.MonkeyPatch, tmp_path) -> Settings: |
| monkeypatch.setenv("DOCSIFER_ENVIRONMENT", "development") |
| monkeypatch.setenv("DOCSIFER_LOG_JSON", "false") |
| monkeypatch.setenv("DOCSIFER_ANALYTICS_ENABLED", "false") |
| monkeypatch.setenv("DOCSIFER_MAX_UPLOAD_BYTES", str(2 * 1024 * 1024)) |
| monkeypatch.setenv("DOCSIFER_MAX_CONCURRENT_CONVERSIONS", "2") |
| monkeypatch.setenv("DOCSIFER_MAX_QUEUE_DEPTH", "4") |
| monkeypatch.setenv("DOCSIFER_MAX_PER_IP_CONCURRENT", "5") |
| monkeypatch.setenv("DOCSIFER_TMP_DIR", str(tmp_path)) |
| get_settings.cache_clear() |
| return get_settings() |
|
|
|
|
| @pytest_asyncio.fixture |
| async def app(settings: Settings): |
| application = create_app(settings) |
| async with application.router.lifespan_context(application): |
| yield application |
|
|
|
|
| @pytest_asyncio.fixture |
| async def client(app) -> AsyncIterator[AsyncClient]: |
| transport = ASGITransport(app=app) |
| async with AsyncClient(transport=transport, base_url="http://test") as ac: |
| yield ac |
|
|
|
|
| @pytest_asyncio.fixture |
| async def in_memory_analytics() -> AsyncIterator[AnalyticsService]: |
| svc = AnalyticsService(store=InMemoryStore(), sync_interval_sec=1) |
| await svc.start() |
| try: |
| yield svc |
| finally: |
| await svc.stop() |
|
|