# ABOUTME: Tests for locale detection and string lookup. # ABOUTME: Verifies correct language detection from env vars and /etc/locale.conf. import os from pathlib import Path from unittest.mock import patch from moonlock.i18n import Strings, detect_locale, load_strings class TestDetectLocale: """Tests for locale detection.""" @patch.dict(os.environ, {"LANG": "de_DE.UTF-8"}) def test_detects_german_from_env(self): assert detect_locale() == "de" @patch.dict(os.environ, {"LANG": "en_US.UTF-8"}) def test_detects_english_from_env(self): assert detect_locale() == "en" @patch.dict(os.environ, {"LANG": ""}, clear=False) def test_reads_locale_conf_when_env_empty(self, tmp_path: Path): locale_conf = tmp_path / "locale.conf" locale_conf.write_text("LANG=de_DE.UTF-8\n") assert detect_locale(locale_conf_path=locale_conf) == "de" @patch.dict(os.environ, {"LANG": "C"}) def test_c_locale_defaults_to_english(self): assert detect_locale() == "en" @patch.dict(os.environ, {"LANG": "POSIX"}) def test_posix_locale_defaults_to_english(self): assert detect_locale() == "en" @patch.dict(os.environ, {}, clear=True) def test_missing_env_and_no_file_defaults_to_english(self, tmp_path: Path): nonexistent = tmp_path / "nonexistent" assert detect_locale(locale_conf_path=nonexistent) == "en" class TestLoadStrings: """Tests for string table loading.""" def test_german_strings(self): strings = load_strings("de") assert isinstance(strings, Strings) assert strings.password_placeholder == "Passwort" def test_english_strings(self): strings = load_strings("en") assert strings.password_placeholder == "Password" def test_unknown_locale_falls_back_to_english(self): strings = load_strings("fr") assert strings.password_placeholder == "Password" def test_lockscreen_specific_strings_exist(self): strings = load_strings("de") assert strings.unlock_button is not None assert strings.fingerprint_prompt is not None assert strings.fingerprint_success is not None def test_faillock_template_strings(self): strings = load_strings("de") msg = strings.faillock_attempts_remaining.format(n=2) assert "2" in msg