AIstudioProxyAPI / tests /gui /test_i18n.py
peijun1's picture
Deploy AI Studio Proxy API to Hugging Face Spaces
a5784e9
Raw
History Blame Contribute Delete
6.43 kB
"""Tests for gui/i18n.py module."""
class TestLanguageState:
"""Tests for language state management."""
def test_default_language_is_english(self):
"""Default language should be English."""
from gui import i18n
# Reset to default
i18n._current_language = "en"
assert i18n.get_language() == "en"
def test_set_language_to_chinese(self):
"""Can set language to Chinese."""
from gui import i18n
i18n.set_language("zh")
assert i18n.get_language() == "zh"
# Reset
i18n.set_language("en")
def test_set_language_to_english(self):
"""Can set language to English."""
from gui import i18n
i18n.set_language("zh")
i18n.set_language("en")
assert i18n.get_language() == "en"
def test_set_invalid_language_ignored(self):
"""Setting invalid language code is ignored."""
from gui import i18n
i18n.set_language("en")
i18n.set_language("invalid")
assert i18n.get_language() == "en" # Still English
def test_set_empty_language_ignored(self):
"""Setting empty language code is ignored."""
from gui import i18n
i18n.set_language("en")
i18n.set_language("")
assert i18n.get_language() == "en"
class TestGetText:
"""Tests for get_text function."""
def test_get_text_english(self):
"""get_text returns English text when language is English."""
from gui import i18n
i18n.set_language("en")
assert i18n.get_text("title") == "🚀 AI Studio Proxy API"
def test_get_text_chinese(self):
"""get_text returns Chinese text when language is Chinese."""
from gui import i18n
i18n.set_language("zh")
result = i18n.get_text("title")
assert result == "🚀 AI Studio 代理 API"
# Reset
i18n.set_language("en")
def test_get_text_with_format_kwargs(self):
"""get_text supports format placeholders."""
from gui import i18n
i18n.set_language("en")
result = i18n.get_text("log_accounts_loaded", count=5)
assert "5" in result
assert "account" in result.lower()
def test_get_text_unknown_key_returns_placeholder(self):
"""Unknown keys return <key> placeholder."""
from gui import i18n
i18n.set_language("en")
result = i18n.get_text("nonexistent_key_12345")
assert result == "<nonexistent_key_12345>"
def test_get_text_fallback_to_english(self):
"""If Chinese translation missing, falls back to English."""
from gui import i18n
# All keys should have both translations, but test fallback logic
i18n.set_language("zh")
# Access a known key
result = i18n.get_text("btn_start")
assert result # Should not be empty
i18n.set_language("en")
class TestTranslationsCompleteness:
"""Tests for translation completeness."""
def test_all_keys_have_english(self):
"""All translation keys should have English text."""
from gui.i18n import TRANSLATIONS
for key, translations in TRANSLATIONS.items():
assert "en" in translations, f"Missing English translation for: {key}"
def test_all_keys_have_chinese(self):
"""All translation keys should have Chinese text."""
from gui.i18n import TRANSLATIONS
for key, translations in TRANSLATIONS.items():
assert "zh" in translations, f"Missing Chinese translation for: {key}"
def test_no_empty_translations(self):
"""No translation should be empty."""
from gui.i18n import TRANSLATIONS
for key, translations in TRANSLATIONS.items():
for lang, text in translations.items():
assert text, f"Empty translation for {key} in {lang}"
def test_format_placeholders_consistent(self):
"""Format placeholders should match between languages."""
import re
from gui.i18n import TRANSLATIONS
placeholder_pattern = re.compile(r"\{(\w+)\}")
for key, translations in TRANSLATIONS.items():
en_placeholders = set(
placeholder_pattern.findall(translations.get("en", ""))
)
zh_placeholders = set(
placeholder_pattern.findall(translations.get("zh", ""))
)
assert en_placeholders == zh_placeholders, (
f"Placeholder mismatch for {key}: EN={en_placeholders}, ZH={zh_placeholders}"
)
class TestTranslationCategories:
"""Tests for translation category coverage."""
def test_has_status_messages(self):
"""Should have status message translations."""
from gui.i18n import TRANSLATIONS
status_keys = [
"status_ready",
"status_running",
"status_stopping",
"status_stopped",
]
for key in status_keys:
assert key in TRANSLATIONS
def test_has_tab_labels(self):
"""Should have tab label translations."""
from gui.i18n import TRANSLATIONS
tab_keys = ["tab_control", "tab_accounts", "tab_settings", "tab_logs"]
for key in tab_keys:
assert key in TRANSLATIONS
def test_has_button_labels(self):
"""Should have button label translations."""
from gui.i18n import TRANSLATIONS
btn_keys = ["btn_start", "btn_stop", "btn_test", "btn_copy"]
for key in btn_keys:
assert key in TRANSLATIONS
def test_has_dialog_messages(self):
"""Should have dialog message translations."""
from gui.i18n import TRANSLATIONS
dialog_keys = ["confirm_title", "warning_title", "error_title", "success_title"]
for key in dialog_keys:
assert key in TRANSLATIONS
def test_has_tooltips(self):
"""Should have tooltip translations."""
from gui.i18n import TRANSLATIONS
tooltip_keys = [k for k in TRANSLATIONS.keys() if k.startswith("tooltip_")]
assert len(tooltip_keys) >= 5, "Should have multiple tooltips"
def test_has_menu_items(self):
"""Should have menu item translations."""
from gui.i18n import TRANSLATIONS
menu_keys = ["menu_file", "menu_exit", "menu_help", "menu_about"]
for key in menu_keys:
assert key in TRANSLATIONS