"""Tests for revision behavior in TranscriptionService.""" from uuid import uuid4 import pytest from transcription.db.models import Document from transcription.db.models import Job from transcription.db.models import JobStatus from transcription.db.models import Source from transcription.services.documents import DocumentService from transcription.services.jobs import JobService from transcription.services.transcription import TranscriptionService @pytest.mark.integration class TestTranscriptionServiceRevisionUpsert: """Verify optional single-revision create/update semantics.""" @pytest.mark.asyncio async def test_upsert_revision_creates_new_revision(self, default_session_factory): documents = DocumentService(session_factory=default_session_factory) jobs = JobService(session_factory=default_session_factory) transcriptions = TranscriptionService(session_factory=default_session_factory) document = Document(id=uuid4(), name="revision-create") await documents.create_document(document=document) job = Job(document_id=document.id, status=JobStatus.TRANSCRIBED, text="Original text") await jobs.create_job(job=job) source = Source( document_id=document.id, job_id=job.id, upload_name="source.jpg", filename="source.jpg", file_path="uploads/source.jpg", ) async with transcriptions._session_scope() as session: session.add(source) await session.commit() await session.refresh(source) revision = await transcriptions.upsert_revision_for_source(source_id=source.id, text="User revision") fetched = await transcriptions.read_revision_by_source(source.id) assert revision.source_id == source.id assert revision.text == "User revision" assert fetched is not None assert fetched.id == revision.id assert fetched.text == "User revision" @pytest.mark.asyncio async def test_upsert_revision_updates_existing_single_revision(self, default_session_factory): documents = DocumentService(session_factory=default_session_factory) jobs = JobService(session_factory=default_session_factory) transcriptions = TranscriptionService(session_factory=default_session_factory) document = Document(id=uuid4(), name="revision-update") await documents.create_document(document=document) job = Job(document_id=document.id, status=JobStatus.TRANSCRIBED, text="Original text") await jobs.create_job(job=job) source = Source( document_id=document.id, job_id=job.id, upload_name="source.jpg", filename="source.jpg", file_path="uploads/source.jpg", ) async with transcriptions._session_scope() as session: session.add(source) await session.commit() await session.refresh(source) first = await transcriptions.upsert_revision_for_source(source_id=source.id, text="Revision v1") second = await transcriptions.upsert_revision_for_source(source_id=source.id, text="Revision v2") revisions = await transcriptions.list_revisions_by_job(job.id) assert first.id == second.id assert second.text == "Revision v2" assert len(revisions) == 1 assert revisions[0].id == first.id assert revisions[0].text == "Revision v2"