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
+78
View File
@@ -1,16 +1,21 @@
"""Tests for transcription.providers.openrouter."""
import asyncio
import json
import logging
from types import SimpleNamespace
from typing import cast
from uuid import uuid4
import httpx
import pytest
from openrouter import OpenRouter
from transcription.config import Settings
from transcription.providers.base import ProviderCallEvidence
from transcription.providers.base import ProviderError
from transcription.providers.base import ProviderResponseError
from transcription.providers.evidence import SourceEvidenceReference
from transcription.providers.openrouter import DEFAULT_OPENROUTER_MODEL
from transcription.providers.openrouter import OpenRouterTranscriptionProvider
@@ -245,3 +250,76 @@ class TestOpenRouterProviderTranscribe:
assert result.request_manifest is None
assert "request manifest omitted" in caplog.text.lower()
@pytest.mark.asyncio
async def test_concurrent_calls_keep_evidence_scoped_to_their_own_capture(self):
first_release = asyncio.Event()
async def handler(request: httpx.Request) -> httpx.Response:
payload = json.loads(request.content.decode("utf-8"))
prompt = payload["messages"][0]["content"][0]["text"]
if prompt == "First prompt":
await first_release.wait()
body = b'{"error":{"message":"first failure"}}'
else:
body = b'{"error":{"message":"second failure"}}'
return httpx.Response(
500,
content=body,
headers={"Content-Type": "application/json"},
request=request,
)
provider = OpenRouterTranscriptionProvider(
settings=Settings(openrouter_api_key="test-key"),
async_client=httpx.AsyncClient(transport=httpx.MockTransport(handler)),
)
first_capture = ProviderCallEvidence()
second_capture = ProviderCallEvidence()
first_task = asyncio.create_task(
provider.transcribe(
prompt_text="First prompt",
image_bytes=b"one",
mime_type="image/png",
evidence_capture=first_capture,
source_reference=SourceEvidenceReference(
source_id=uuid4(),
digest_sha256="1" * 64,
byte_size=3,
media_type="image/png",
page_number=1,
),
)
)
await asyncio.sleep(0)
second_task = asyncio.create_task(
provider.transcribe(
prompt_text="Second prompt",
image_bytes=b"two",
mime_type="image/png",
evidence_capture=second_capture,
source_reference=SourceEvidenceReference(
source_id=uuid4(),
digest_sha256="2" * 64,
byte_size=3,
media_type="image/png",
page_number=2,
),
)
)
with pytest.raises(ProviderError):
await second_task
first_release.set()
with pytest.raises(ProviderError):
await first_task
assert first_capture.request_manifest is not None
assert first_capture.request_manifest.prompt_content == "First prompt"
assert first_capture.transport_evidence is not None
assert first_capture.transport_evidence.body == b'{"error":{"message":"first failure"}}'
assert second_capture.request_manifest is not None
assert second_capture.request_manifest.prompt_content == "Second prompt"
assert second_capture.transport_evidence is not None
assert second_capture.transport_evidence.body == b'{"error":{"message":"second failure"}}'