Implement Rec - Phase 3 complete
Quality Gate / gate (push) Successful in 2m37s

This commit is contained in:
Jim Lancaster
2026-09-02 16:15:33 -05:00
parent 4410d23f5c
commit 27ec81ca5b
13 changed files with 353 additions and 116 deletions
@@ -86,6 +86,7 @@ class TestWorkflowReliability:
provider=None,
source_reference=None,
requested_model=None,
evidence_capture=None,
):
_ = (
image_path,
@@ -97,6 +98,7 @@ class TestWorkflowReliability:
provider,
source_reference,
requested_model,
evidence_capture,
)
raise TimeoutError("simulated provider timeout")
@@ -370,6 +372,64 @@ class TestWorkflowReliability:
assert result is not None
assert result.status == JobStatus.TRANSCRIBED
@pytest.mark.asyncio
async def test_intermediate_page_commit_advances_job_liveness_timestamp(
self,
default_session_factory,
monkeypatch,
):
services = ServiceBundle.from_session_factory(default_session_factory)
async with services.jobs._session_scope() as session:
document = Document(id=uuid4(), name="heartbeat-doc")
session.add(document)
await session.flush()
job = Job(document_id=document.id, status=JobStatus.QUEUED)
session.add(job)
await session.flush()
for page_number in (1, 2, 3):
source = Source(
document_id=document.id,
page_number=page_number,
upload_name=f"page-{page_number}.jpg",
filename=f"page-{page_number}.jpg",
file_path=str(Path("tests/fixtures/images/real/Book Two - page 02.jpg")),
file_hash=str(page_number) * 64,
file_size_bytes=1,
)
session.add(source)
await session.flush()
session.add(JobSource(job_id=job.id, source_id=source.id))
await session.commit()
loaded = await services.jobs.read_job(job_id=job.id, session=session)
third_started = asyncio.Event()
release_third = asyncio.Event()
call_count = 0
async def _transcribe(image_path, **kwargs):
nonlocal call_count
_ = (image_path, kwargs)
call_count += 1
if call_count == 3:
third_started.set()
await release_third.wait()
return TranscriptionResult(text=f"page {call_count}", provider="fixture", model="model")
monkeypatch.setattr("transcription.services.workflows.transcribe_document_image", _transcribe)
task = asyncio.create_task(process_queued_job(job=loaded, services=services))
await asyncio.wait_for(third_started.wait(), timeout=2)
async with services.jobs._session_scope() as session:
current_job = await session.get(Job, loaded.id)
assert current_job is not None
attempts = await services.evidence.list_execution_attempts(job_id=loaded.id, session=session)
assert len(attempts) == 2
assert current_job.date_updated >= attempts[1].finished_at
release_third.set()
await task
@pytest.mark.asyncio
async def test_failed_job_with_validation_category_is_not_requeued(self, default_session_factory):
services = ServiceBundle.from_session_factory(default_session_factory)