Files
duty-teller/tests/test_i18n.py
Nikolay Tatarinov 263c2fefbd
All checks were successful
CI / lint-and-test (push) Successful in 14s
Add internationalization support and enhance language handling
- Introduced a new i18n module for managing translations and language normalization, supporting both Russian and English.
- Updated various handlers and services to utilize the new translation functions for user-facing messages, improving user experience based on language preferences.
- Enhanced error handling and response messages to be language-aware, ensuring appropriate feedback is provided to users in their preferred language.
- Added tests for the i18n module to validate language detection and translation functionality.
- Updated the example environment file to include a default language configuration.
2026-02-18 13:56:49 +03:00

77 lines
2.0 KiB
Python

"""Unit tests for duty_teller.i18n: get_lang, t, fallback to en."""
from unittest.mock import MagicMock
from duty_teller.i18n import get_lang, t
def test_get_lang_none_returns_en():
assert get_lang(None) == "en"
def test_get_lang_ru_returns_ru():
user = MagicMock()
user.language_code = "ru"
assert get_lang(user) == "ru"
def test_get_lang_ru_ru_returns_ru():
user = MagicMock()
user.language_code = "ru-RU"
assert get_lang(user) == "ru"
def test_get_lang_en_returns_en():
user = MagicMock()
user.language_code = "en"
assert get_lang(user) == "en"
def test_get_lang_uk_returns_en():
user = MagicMock()
user.language_code = "uk"
assert get_lang(user) == "en"
def test_get_lang_empty_returns_en():
user = MagicMock()
user.language_code = ""
assert get_lang(user) == "en"
def test_get_lang_missing_attr_returns_en():
user = MagicMock(spec=[]) # no language_code
assert get_lang(user) == "en"
def test_t_en_start_greeting():
result = t("en", "start.greeting")
assert "help" in result.lower()
assert "bot" in result.lower()
def test_t_ru_start_greeting():
result = t("ru", "start.greeting")
assert "Привет" in result or "бот" in result or "календар" in result
def test_t_fallback_to_en_when_key_missing_for_ru():
"""When key exists in en but not in ru, fallback to en."""
result = t("ru", "start.greeting")
assert len(result) > 0
# start.greeting exists in both; use a key that might be en-only for fallback
result_any = t("ru", "errors.generic")
assert "error" in result_any.lower() or "ошибк" in result_any.lower()
def test_t_placeholder_substitution():
assert t("en", "set_phone.saved", phone="+7 999") == "Phone saved: +7 999"
assert "999" in t("ru", "set_phone.saved", phone="+7 999")
def test_t_unknown_lang_normalized_to_en():
assert "help" in t("de", "start.greeting").lower() or "Hi" in t(
"de", "start.greeting"
)