from collections.abc import AsyncIterator, Iterator from typing import Any import pytest from src.llm.backend import CompletionResult, ProviderBackend, StreamChunk class FakeBackend(ProviderBackend): """Simple backend for request-builder and orchestration tests.""" def __init__(self, responses: list[CompletionResult] | None = None) -> None: self.calls: list[dict[str, Any]] = [] self._responses: Iterator[CompletionResult] = iter( responses or [CompletionResult(content="ok")] ) async def complete(self, **kwargs: Any) -> CompletionResult: self.calls.append(kwargs) return next(self._responses) async def stream(self, **kwargs: Any) -> AsyncIterator[StreamChunk]: self.calls.append(kwargs) result = next(self._responses) yield StreamChunk(content=result.content, is_done=True) @pytest.fixture def fake_backend() -> FakeBackend: return FakeBackend()