import pytest from unittest.mock import MagicMock, AsyncMock @pytest.mark.asyncio async def test_create_speech_response(async_client): """Test the /speech endpoint returns audio bytes without streaming.""" test_client, mock_services = await anext(async_client) mock_audio_bytes = b"fake wav audio bytes" # Use AsyncMock for the async function create_speech_non_stream mock_services.tts_service.create_speech_non_stream = AsyncMock(return_value=mock_audio_bytes) response = await test_client.post("/speech", json={"text": "Hello, this is a test"}) assert response.status_code == 200 assert response.headers["content-type"] == "audio/wav" assert response.content == mock_audio_bytes mock_services.tts_service.create_speech_non_stream.assert_called_once_with(text="Hello, this is a test") @pytest.mark.asyncio async def test_create_speech_stream_wav_response(async_client): """Test the /speech endpoint with stream=true and as_wav=true returns a streamed WAV response.""" test_client, mock_services = await anext(async_client) mock_audio_bytes_chunks = [b"chunk1", b"chunk2", b"chunk3"] async def mock_async_generator(): for chunk in mock_audio_bytes_chunks: yield chunk # Mock `create_speech_stream` with a MagicMock returning the async generator mock_services.tts_service.create_speech_stream = MagicMock(return_value=mock_async_generator()) # Explicitly set stream=true and as_wav=true response = await test_client.post("/speech?stream=true&as_wav=true", json={"text": "Hello, this is a test"}) assert response.status_code == 200 assert response.headers["content-type"] == "audio/wav" # Read the streamed content and verify it matches the mocked chunks streamed_content = b"" async for chunk in response.aiter_bytes(): streamed_content += chunk assert streamed_content == b"".join(mock_audio_bytes_chunks) mock_services.tts_service.create_speech_stream.assert_called_once_with(text="Hello, this is a test", as_wav=True) @pytest.mark.asyncio async def test_create_speech_stream_pcm_response(async_client): """Test the /speech endpoint with stream=true and as_wav=false returns a streamed PCM response.""" test_client, mock_services = await anext(async_client) mock_audio_bytes_chunks = [b"pcm_chunk1", b"pcm_chunk2", b"pcm_chunk3"] async def mock_async_generator(): for chunk in mock_audio_bytes_chunks: yield chunk mock_services.tts_service.create_speech_stream = MagicMock(return_value=mock_async_generator()) # Set stream=true and as_wav=false response = await test_client.post("/speech?stream=true&as_wav=false", json={"text": "Hello, this is a test"}) assert response.status_code == 200 assert response.headers["content-type"] == "audio/pcm" streamed_content = b"" async for chunk in response.aiter_bytes(): streamed_content += chunk assert streamed_content == b"".join(mock_audio_bytes_chunks) mock_services.tts_service.create_speech_stream.assert_called_once_with(text="Hello, this is a test", as_wav=False)