"""Shared fixtures for UI integration tests.""" from __future__ import annotations import asyncio from collections.abc import Callable from pathlib import Path from uuid import UUID import pytest from fastapi import FastAPI from fastapi.testclient import TestClient from transcription.app import create_app from transcription.config import Settings from transcription.config import _settings from transcription.db import get_session from transcription.models import Document from transcription.models import Job from transcription.models import JobStatus from transcription.models import Transcript @pytest.fixture def app_client(tmp_path: Path) -> tuple[FastAPI, TestClient]: """Provide a real application and test client backed by in-memory SQLite.""" settings = Settings( openrouter_api_key="test-key", database_url="sqlite:///:memory:", environment="test", upload_dir=tmp_path / "uploads", prompt_dir=tmp_path / "prompts", ) _settings.set(settings) app = create_app() with TestClient(app) as client: yield app, client @pytest.fixture def seed_job(app_client: tuple[FastAPI, TestClient]) -> Callable[..., UUID]: """Return a helper for inserting a document/job/transcript trio.""" app, _ = app_client def _seed( *, filename: str = "sample.pdf", status: JobStatus = JobStatus.TRANSCRIBED, transcript_text: str | None = "Sample transcript text", error_detail: str | None = None, ) -> UUID: async def _insert() -> UUID: async with get_session(session_factory=app.state.runtime.session_factory) as session: document = Document(filename=filename, file_path=f"uploads/{filename}") session.add(document) await session.flush() job = Job(document_id=document.id, status=status, retry_count=0) session.add(job) await session.flush() if transcript_text is not None or error_detail is not None: session.add( Transcript( job_id=job.id, provider="openrouter", prompt_name="transcribe_document", text=transcript_text, error_detail=error_detail, ) ) await session.commit() return job.id return asyncio.run(_insert()) return _seed