mirror of
https://git.quad4.io/RNS-Things/MeshChatX.git
synced 2026-04-25 19:42:13 +00:00
126 lines
4.5 KiB
Python
126 lines
4.5 KiB
Python
import pytest
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
|
from meshchatx.src.backend.translator_handler import TranslatorHandler
|
|
|
|
|
|
def test_translator_handler_init():
|
|
handler = TranslatorHandler(libretranslate_url="http://test:5000", enabled=True)
|
|
assert handler.libretranslate_url == "http://test:5000"
|
|
assert handler.enabled is True
|
|
|
|
|
|
def test_get_supported_languages_disabled():
|
|
handler = TranslatorHandler(enabled=False)
|
|
assert handler.get_supported_languages() == []
|
|
|
|
|
|
@patch("meshchatx.src.backend.translator_handler.aiohttp.ClientSession")
|
|
def test_get_supported_languages_libretranslate(mock_session_cls):
|
|
mock_response = MagicMock()
|
|
mock_response.status = 200
|
|
mock_response.json = AsyncMock(
|
|
return_value=[
|
|
{"code": "en", "name": "English"},
|
|
{"code": "fr", "name": "French"},
|
|
],
|
|
)
|
|
mock_get = MagicMock()
|
|
mock_get.__aenter__ = AsyncMock(return_value=mock_response)
|
|
mock_get.__aexit__ = AsyncMock(return_value=None)
|
|
mock_session = MagicMock()
|
|
mock_session.get = MagicMock(return_value=mock_get)
|
|
mock_session.__aenter__ = AsyncMock(return_value=mock_session)
|
|
mock_session.__aexit__ = AsyncMock(return_value=None)
|
|
mock_session_cls.return_value = mock_session
|
|
|
|
handler = TranslatorHandler(enabled=True)
|
|
langs = handler.get_supported_languages()
|
|
assert len(langs) == 2
|
|
assert langs[0]["code"] == "en"
|
|
assert langs[0]["source"] == "libretranslate"
|
|
|
|
|
|
@patch("meshchatx.src.backend.translator_handler.aiohttp.ClientSession")
|
|
def test_translate_libretranslate(mock_session_cls):
|
|
mock_response = MagicMock()
|
|
mock_response.status = 200
|
|
mock_response.json = AsyncMock(return_value={"translatedText": "Bonjour"})
|
|
mock_post = MagicMock()
|
|
mock_post.__aenter__ = AsyncMock(return_value=mock_response)
|
|
mock_post.__aexit__ = AsyncMock(return_value=None)
|
|
mock_session = MagicMock()
|
|
mock_session.post = MagicMock(return_value=mock_post)
|
|
mock_session.__aenter__ = AsyncMock(return_value=mock_session)
|
|
mock_session.__aexit__ = AsyncMock(return_value=None)
|
|
mock_session_cls.return_value = mock_session
|
|
|
|
handler = TranslatorHandler(enabled=True)
|
|
result = handler.translate_text("Hello", source_lang="en", target_lang="fr")
|
|
assert result["translated_text"] == "Bonjour"
|
|
|
|
|
|
@patch("subprocess.run")
|
|
def test_translate_argos_cli(mock_run):
|
|
mock_result = MagicMock()
|
|
mock_result.stdout = "Hola"
|
|
mock_run.return_value = mock_result
|
|
|
|
handler = TranslatorHandler(enabled=True)
|
|
handler.has_argos_cli = True
|
|
handler.has_argos = True
|
|
handler.has_requests = False # Force CLI
|
|
|
|
with patch("shutil.which", return_value="/usr/bin/argos-translate"):
|
|
result = handler.translate_text(
|
|
"Hello", source_lang="en", target_lang="es", use_argos=True
|
|
)
|
|
assert result["translated_text"] == "Hola"
|
|
|
|
|
|
def test_detect_language_simple():
|
|
TranslatorHandler(enabled=True)
|
|
# _detect_language is private
|
|
pass
|
|
|
|
|
|
@patch("meshchatx.src.backend.translator_handler.aiohttp.ClientSession")
|
|
def test_detect_language_libretranslate(mock_session_cls):
|
|
mock_response = MagicMock()
|
|
mock_response.status = 200
|
|
mock_response.json = AsyncMock(
|
|
return_value={
|
|
"translatedText": "Bonjour",
|
|
"detectedLanguage": {"language": "en", "confidence": 0.99},
|
|
},
|
|
)
|
|
mock_post = MagicMock()
|
|
mock_post.__aenter__ = AsyncMock(return_value=mock_response)
|
|
mock_post.__aexit__ = AsyncMock(return_value=None)
|
|
mock_session = MagicMock()
|
|
mock_session.post = MagicMock(return_value=mock_post)
|
|
mock_session.__aenter__ = AsyncMock(return_value=mock_session)
|
|
mock_session.__aexit__ = AsyncMock(return_value=None)
|
|
mock_session_cls.return_value = mock_session
|
|
|
|
handler = TranslatorHandler(enabled=True)
|
|
result = handler.translate_text("Hello world", source_lang="auto", target_lang="fr")
|
|
assert result["source_lang"] == "en"
|
|
|
|
|
|
def test_translator_handler_errors():
|
|
handler = TranslatorHandler(enabled=False)
|
|
with pytest.raises(RuntimeError, match="Translator is disabled"):
|
|
handler.translate_text("Hello", "en", "fr")
|
|
|
|
handler.enabled = True
|
|
with pytest.raises(ValueError, match="Text cannot be empty"):
|
|
handler.translate_text("", "en", "fr")
|
|
|
|
|
|
def test_language_code_to_name():
|
|
from meshchatx.src.backend.translator_handler import LANGUAGE_CODE_TO_NAME
|
|
|
|
assert LANGUAGE_CODE_TO_NAME["en"] == "English"
|
|
assert LANGUAGE_CODE_TO_NAME["de"] == "German"
|