from unittest.mock import MagicMock, patch

import pytest

from swarms.models.openai_tts import OpenAITTS


def test_openaitts_initialization():
    tts = OpenAITTS()
    assert isinstance(tts, OpenAITTS)
    assert tts.model_name == "tts-1-1106"
    assert tts.proxy_url == "https://api.openai.com/v1/audio/speech"
    assert tts.voice == "onyx"
    assert tts.chunk_size == 1024 * 1024


def test_openaitts_initialization_custom_parameters():
    tts = OpenAITTS(
        "custom_model",
        "custom_url",
        "custom_key",
        "custom_voice",
        2048,
    )
    assert tts.model_name == "custom_model"
    assert tts.proxy_url == "custom_url"
    assert tts.openai_api_key == "custom_key"
    assert tts.voice == "custom_voice"
    assert tts.chunk_size == 2048


@patch("requests.post")
def test_run(mock_post):
    mock_response = MagicMock()
    mock_response.iter_content.return_value = [b"chunk1", b"chunk2"]
    mock_post.return_value = mock_response
    tts = OpenAITTS()
    audio = tts.run("Hello world")
    assert audio == b"chunk1chunk2"
    mock_post.assert_called_once_with(
        "https://api.openai.com/v1/audio/speech",
        headers={"Authorization": f"Bearer {tts.openai_api_key}"},
        json={
            "model": "tts-1-1106",
            "input": "Hello world",
            "voice": "onyx",
        },
    )


@patch("requests.post")
def test_run_empty_task(mock_post):
    tts = OpenAITTS()
    with pytest.raises(Exception):
        tts.run("")


@patch("requests.post")
def test_run_very_long_task(mock_post):
    tts = OpenAITTS()
    with pytest.raises(Exception):
        tts.run("A" * 10000)


@patch("requests.post")
def test_run_invalid_task(mock_post):
    tts = OpenAITTS()
    with pytest.raises(Exception):
        tts.run(None)


@patch("requests.post")
def test_run_custom_model(mock_post):
    mock_response = MagicMock()
    mock_response.iter_content.return_value = [b"chunk1", b"chunk2"]
    mock_post.return_value = mock_response
    tts = OpenAITTS("custom_model")
    audio = tts.run("Hello world")
    assert audio == b"chunk1chunk2"
    mock_post.assert_called_once_with(
        "https://api.openai.com/v1/audio/speech",
        headers={"Authorization": f"Bearer {tts.openai_api_key}"},
        json={
            "model": "custom_model",
            "input": "Hello world",
            "voice": "onyx",
        },
    )


@patch("requests.post")
def test_run_custom_voice(mock_post):
    mock_response = MagicMock()
    mock_response.iter_content.return_value = [b"chunk1", b"chunk2"]
    mock_post.return_value = mock_response
    tts = OpenAITTS(voice="custom_voice")
    audio = tts.run("Hello world")
    assert audio == b"chunk1chunk2"
    mock_post.assert_called_once_with(
        "https://api.openai.com/v1/audio/speech",
        headers={"Authorization": f"Bearer {tts.openai_api_key}"},
        json={
            "model": "tts-1-1106",
            "input": "Hello world",
            "voice": "custom_voice",
        },
    )
