generated from john/python-template
This commit is contained in:
@@ -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"}}'
|
||||
|
||||
Reference in New Issue
Block a user