- Made is_available() abstract in base.py with proper implementation in providers
- Added original_error parameter to UnsupportedLanguageError and TranslationConfigError
- Added Field validation for confidence_threshold bounds (0.0-1.0)
- Changed @lru_cache to @lru_cache() for explicit style
- Added get_translation_provider to __all__ in providers/__init__.py
- Replaced deprecated asyncio.get_event_loop() with get_running_loop()
- Added debug logging to is_available() in GoogleTranslationProvider
- Added TODO comment for confidence score improvement in OpenAIProvider
- Added None check for read_query_prompt() with fallback default prompt
- Moved ClientSession outside batch loop in AzureTranslationProvider
- Fixed Optional[float] type annotation in detect_language()
- Added Note section documenting in-place mutation in translate_content()
- Added test_confidence_threshold_validation() for bounds testing
- Added descriptive assertion messages to config tests
- Converted all async tests to use @pytest.mark.asyncio decorators
- Replaced manual skip checks with @pytest.mark.skipif
- Removed manual main() blocks, tests now pytest-only
- Changed Chinese language assertion to use startswith('zh') for flexibility
151 lines
5 KiB
Python
151 lines
5 KiB
Python
"""
|
|
Unit tests for translation providers
|
|
"""
|
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from cognee.tasks.translation.providers import (
|
|
get_translation_provider,
|
|
OpenAITranslationProvider,
|
|
TranslationResult,
|
|
)
|
|
from cognee.tasks.translation.exceptions import TranslationError
|
|
|
|
|
|
def has_openai_key():
|
|
"""Check if OpenAI API key is available"""
|
|
return bool(os.environ.get("LLM_API_KEY") or os.environ.get("OPENAI_API_KEY"))
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_openai_provider_basic_translation():
|
|
"""Test basic translation with OpenAI provider"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
result = await provider.translate(text="Hola mundo", target_language="en", source_language="es")
|
|
|
|
assert isinstance(result, TranslationResult)
|
|
assert result.translated_text is not None
|
|
assert len(result.translated_text) > 0
|
|
assert result.source_language == "es"
|
|
assert result.target_language == "en"
|
|
assert result.provider == "openai"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_openai_provider_auto_detect_source():
|
|
"""Test translation with automatic source language detection"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
result = await provider.translate(
|
|
text="Bonjour le monde",
|
|
target_language="en",
|
|
# source_language not provided - should auto-detect
|
|
)
|
|
|
|
assert result.translated_text is not None
|
|
assert result.target_language == "en"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_openai_provider_long_text():
|
|
"""Test translation of longer text"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
long_text = """
|
|
La inteligencia artificial es una rama de la informática que se centra en
|
|
crear sistemas capaces de realizar tareas que normalmente requieren inteligencia humana.
|
|
Estos sistemas pueden aprender, razonar y resolver problemas complejos.
|
|
"""
|
|
|
|
result = await provider.translate(text=long_text, target_language="en", source_language="es")
|
|
|
|
assert len(result.translated_text) > 0
|
|
assert result.source_language == "es"
|
|
|
|
|
|
def test_get_translation_provider_factory():
|
|
"""Test provider factory function"""
|
|
provider = get_translation_provider("openai")
|
|
assert isinstance(provider, OpenAITranslationProvider)
|
|
|
|
|
|
def test_get_translation_provider_invalid():
|
|
"""Test provider factory with invalid provider name"""
|
|
try:
|
|
get_translation_provider("invalid_provider")
|
|
assert False, "Expected TranslationError or ValueError"
|
|
except (TranslationError, ValueError):
|
|
pass
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_openai_batch_translation():
|
|
"""Test batch translation with OpenAI provider"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
texts = ["Hola", "¿Cómo estás?", "Adiós"]
|
|
|
|
results = await provider.translate_batch(
|
|
texts=texts, target_language="en", source_language="es"
|
|
)
|
|
|
|
assert len(results) == len(texts)
|
|
for result in results:
|
|
assert isinstance(result, TranslationResult)
|
|
assert result.translated_text is not None
|
|
assert result.source_language == "es"
|
|
assert result.target_language == "en"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_translation_preserves_formatting():
|
|
"""Test that translation preserves basic formatting"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
text_with_newlines = "Primera línea.\nSegunda línea."
|
|
|
|
result = await provider.translate(
|
|
text=text_with_newlines, target_language="en", source_language="es"
|
|
)
|
|
|
|
# Should preserve structure (though exact newlines may vary)
|
|
assert result.translated_text is not None
|
|
assert len(result.translated_text) > 0
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_translation_special_characters():
|
|
"""Test translation with special characters"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
text = "¡Hola! ¿Cómo estás? Está bien."
|
|
|
|
result = await provider.translate(text=text, target_language="en", source_language="es")
|
|
|
|
assert result.translated_text is not None
|
|
assert len(result.translated_text) > 0
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(not has_openai_key(), reason="No OpenAI API key available")
|
|
async def test_empty_text_translation():
|
|
"""Test translation with empty text - should return empty or handle gracefully"""
|
|
provider = OpenAITranslationProvider()
|
|
|
|
# Empty text may either raise an error or return an empty result
|
|
try:
|
|
result = await provider.translate(text="", target_language="en", source_language="es")
|
|
# If no error, should return a TranslationResult (possibly with empty text)
|
|
assert isinstance(result, TranslationResult)
|
|
except TranslationError:
|
|
# This is also acceptable behavior
|
|
pass
|