"""Tests for the sources page routes.""" import asyncio from pathlib import Path import pytest from sqlmodel import select from transcription.db import session_scope from transcription.db.models import Document from transcription.db.models import Job from transcription.db.models import Source @pytest.mark.integration class TestSourcesPageRendering: """Verify source list and detail routes render expected states.""" def test_sources_page_renders_empty_state(self, app_client): _, client = app_client response = client.get("/ui/sources") assert response.status_code == 200 assert "Sources" in response.text assert "No source file records found." in response.text def test_sources_page_lists_seeded_sources(self, app_client): _, client = app_client async def _seed() -> None: async with session_scope() as session: document = Document(name="Source Document", document_type="letter") session.add(document) await session.flush() session.add( Source( document_id=document.id, page_number=1, upload_name="page_one.png", filename="stored_page_one.png", file_path="/tmp/stored_page_one.png", ) ) await session.commit() asyncio.run(_seed()) response = client.get("/ui/sources") assert response.status_code == 200 assert "page_one.png" in response.text assert "stored_page_one.png" in response.text def test_sources_page_filters_to_document_context(self, app_client): _, client = app_client async def _seed() -> str: async with session_scope() as session: target = Document(name="Target", document_type="letter") other = Document(name="Other", document_type="record") session.add(target) session.add(other) await session.flush() session.add( Source( document_id=target.id, page_number=1, upload_name="target_page.png", filename="target_stored.png", file_path="/tmp/target_stored.png", ) ) session.add( Source( document_id=other.id, page_number=1, upload_name="other_page.png", filename="other_stored.png", file_path="/tmp/other_stored.png", ) ) await session.commit() return str(target.id) document_id = asyncio.run(_seed()) response = client.get(f"/ui/sources?document_id={document_id}") assert response.status_code == 200 assert "Sources: Target" in response.text assert "Back to Document" in response.text assert "target_page.png" in response.text assert "other_page.png" not in response.text def test_sources_page_filters_to_job_context(self, app_client, seed_job): _, client = app_client job_id = seed_job(filename="job-page.png", transcription_text="job text") response = client.get(f"/ui/sources?job_id={job_id}") assert response.status_code == 200 assert "Sources for Job" in response.text assert "Back to Job" in response.text assert "job-page.png" in response.text def test_source_detail_page_renders_preview_and_revision_box(self, app_client, seed_job): _, client = app_client fixture_path = Path(__file__).resolve().parents[1] / "fixtures" / "images" / "valid" / "small_png.png" job_id = seed_job( filename="detail-source.png", transcription_text="original transcription text", revision_text="human revision text", source_file=fixture_path, ) async def _get_source_id() -> str: async with session_scope() as session: job = await session.get(Job, job_id) assert job is not None source = ( await session.exec(select(Source).where(Source.document_id == job.document_id)) ).first() assert source is not None return str(source.id) source_id = asyncio.run(_get_source_id()) response = client.get(f"/ui/sources/{source_id}") assert response.status_code == 200 assert "Source Page 1: detail-source.png" in response.text assert "Back to Sources" in response.text assert "automated raw transcription" in response.text.lower() assert "original transcription text" in response.text assert "curated human transcription" in response.text.lower() assert "human revision text" in response.text assert "Page Number:" in response.text assert "Stored Filename:" in response.text