#!/usr/bin/env python

"""Tests for `deep_translator` package."""

from unittest.mock import patch

import pytest
import requests

from deep_translator import MicrosoftTranslator, exceptions


# mocked request.post
@patch.object(requests, "post")
def test_microsoft_successful_post_mock(mock_request_post):
    returned_json = [
        {"translations": [{"text": "See you later!", "to": "en"}]}
    ]

    def res():
        r = requests.Response()

        def json_func():
            return returned_json

        r.json = json_func
        return r

    mock_request_post.return_value = res()
    assert (
        MicrosoftTranslator(
            api_key="an_api_key", source="de", target="en"
        ).translate("auf wiedersehen!")
        == "See you later!"
    )


def test_MicrosoftAPIerror():
    with pytest.raises(exceptions.MicrosoftAPIerror):
        MicrosoftTranslator(
            api_key="empty", source="de", target="en"
        ).translate("text")


# the remaining tests are actual requests to Microsoft API and use an api key
# if APIkey variable is None, they are skipped

APIkey = None


@pytest.mark.skipif(APIkey is None, reason="api_key is not provided")
def test_microsoft_successful_post_onetarget():
    posted = MicrosoftTranslator(api_key=APIkey, target="en").translate(
        "auf wiedersehen!"
    )
    assert isinstance(posted, str)


@pytest.mark.skipif(APIkey is None, reason="api_key is not provided")
def test_microsoft_successful_post_twotargets():
    posted = MicrosoftTranslator(
        api_key=APIkey, target=["en", "ru"]
    ).translate("auf wiedersehen!")
    assert isinstance(posted, str)


@pytest.mark.skipif(APIkey is None, reason="api_key is not provided")
def test_incorrect_target_attributes():
    with pytest.raises(exceptions.ServerException):
        MicrosoftTranslator(api_key=APIkey, target="")
    with pytest.raises(exceptions.ServerException):
        MicrosoftTranslator(api_key="", target="nothing")


@pytest.mark.skipif(APIkey is None, reason="api_key is not provided")
def test_abbreviations():
    m1 = MicrosoftTranslator(api_key=APIkey, source="en", target="fr")
    m2 = MicrosoftTranslator(api_key=APIkey, source="English", target="French")
    assert "".join(m1._source) == "".join(m2._source)
    assert "".join(m1._target) == "".join(m2._target)
