diff --git a/pyproject.toml b/pyproject.toml index 01f60cfc..e7a8a5aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,6 @@ omit = [ "*/__init__.py", "*/tests/*", "*/pyzbar/*", - "*/gui/*" ] skip_covered = true skip_empty = true diff --git a/tests/test_flows_l10n.py b/tests/test_flows_l10n.py new file mode 100644 index 00000000..8ebe8aee --- /dev/null +++ b/tests/test_flows_l10n.py @@ -0,0 +1,28 @@ +from gettext import gettext as _ + +# Must import test base before the Controller +from base import FlowTest, FlowStep + +from seedsigner.gui.screens.screen import RET_CODE__BACK_BUTTON, ButtonOption +from seedsigner.models.settings_definition import SettingsConstants, SettingsDefinition +from seedsigner.views import settings_views +from seedsigner.views.view import MainMenuView + + + +class TestL10nFlows(FlowTest): + def test_change_locale(self): + settings_entry = SettingsDefinition.get_settings_entry(SettingsConstants.SETTING__LOCALE) + spanish_display_name = [locale_tuple[1] for locale_tuple in SettingsConstants.ALL_LOCALES if locale_tuple[0] == SettingsConstants.LOCALE__SPANISH][0] + + # Initially we get English + assert _(MainMenuView.SCAN.button_label) == "Scan" + + self.run_sequence([ + FlowStep(MainMenuView, button_data_selection=MainMenuView.SETTINGS), + FlowStep(settings_views.SettingsMenuView, button_data_selection=ButtonOption(settings_entry.display_name)), + FlowStep(settings_views.SettingsEntryUpdateSelectionView, button_data_selection=ButtonOption(spanish_display_name)), + ]) + + # Now we don't get English + assert _(MainMenuView.SCAN.button_label) != "Scan" diff --git a/tests/test_l10n.py b/tests/test_l10n.py new file mode 100644 index 00000000..a2358278 --- /dev/null +++ b/tests/test_l10n.py @@ -0,0 +1,104 @@ +from gettext import gettext as _ + +from base import BaseTest +from seedsigner.gui.screens.screen import ButtonOption +from seedsigner.helpers.l10n import mark_for_translation as _mft +from seedsigner.models.settings import Settings +from seedsigner.models.settings_definition import SettingsConstants +from seedsigner.views.view import MainMenuView + + + +class TestGettext(BaseTest): + def test_english_as_default(self): + # Key is available in other languages, but we get English back + assert _("Home") == "Home" + + def test_missing_key_returns_english_key(self): + test_str = "This is not in our translation library" + assert _(test_str) == test_str + + + def test_basic_spanish(self): + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + assert _("Home") != "Home" + + + def test_locale_changes(self): + settings = Settings.get_instance() + + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + spanish_str = _("Home") + + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__ENGLISH) + assert spanish_str != _("Home") + assert _("Home") == "Home" + + + +class TestButtonOption(BaseTest): + def test_english_key_not_translated(self): + """ ButtonOption should always return its English key, regardless of current locale setting. """ + button_option = ButtonOption("Home") + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + + assert button_option.button_label == "Home" + + brand_new_button_option = ButtonOption("Tools") + assert brand_new_button_option.button_label == "Tools" + + + def test_class_level_button_option_english_key_not_translated(self): + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + + class FooClass: + HOME = ButtonOption("Home") + + assert FooClass.HOME.button_label == "Home" + + + def test_gettext_translates_class_level_button_option(self): + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + + class BarClass: + HOME = ButtonOption("Home") + + assert _(BarClass.HOME.button_label) != "Home" + + + +class TestMarkForTranslation(BaseTest): + def test_english_key_not_translated(self): + """ _mft() should always return its English key, regardless of current locale setting. """ + mft_attr = _mft("Home") + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + + assert mft_attr == "Home" + + brand_new_mft_attr = _mft("Tools") + assert brand_new_mft_attr == "Tools" + + + def test_class_level_mft_attr_english_key_not_translated(self): + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + + class FooClass: + home = _mft("Home") + + assert FooClass.home == "Home" + + + def test_gettext_translates_class_level_mft_attr(self): + settings = Settings.get_instance() + settings.set_value(SettingsConstants.SETTING__LOCALE, SettingsConstants.LOCALE__SPANISH) + + class BarClass: + home = _mft("Home") + + assert _(BarClass.home) != "Home"