""" i18n 단위 테스트. """ import os import sys import pytest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from core.i18n import tr, tr_html, set_language, available_languages, language_label @pytest.fixture(autouse=True) def reset_language(): """매 테스트 후 ko로 원복.""" yield set_language('ko') class TestBasicTranslation: def test_korean_default(self): set_language('ko') assert '저장' in tr('btn.save') def test_english_switch(self): set_language('en') assert 'Save' in tr('btn.save') def test_missing_key_fallback_to_self(self): set_language('en') assert tr('non.existent.key') == 'non.existent.key' def test_missing_in_en_falls_back_to_ko(self): # ko에만 있는 키가 있으면 en에서도 ko 값 (현재 사전엔 없지만 정책 검증) # 이 테스트는 정책 보장만 함 (사전이 비대칭일 때 안전망) set_language('en') # 모든 카테고리는 양 언어 균형 있게 정의되어야 함 for key in ['btn.save', 'menu.stats', 'window.settings']: assert tr(key) != key # 빈 fallback이 아님 class TestFormatArgs: def test_minutes_arg_korean(self): set_language('ko') msg = tr('notif.clock_out_soon.body', minutes=15) assert '15' in msg def test_hours_float_arg(self): set_language('ko') msg = tr('notif.weekly_52.body', hours=58.5) assert '58.5' in msg def test_missing_arg_graceful(self): # 필요한 인자 없이 format → 빈 문자열 아님 set_language('ko') msg = tr('notif.clock_out_soon.body') assert msg # 키 그대로라도 비지 않음 class TestHelpHtml: def test_korean_html(self): set_language('ko') assert '환영' in tr_html('help.html.intro') def test_english_html(self): set_language('en') assert 'Welcome' in tr_html('help.html.intro') def test_missing_html_returns_placeholder(self): set_language('ko') result = tr_html('help.html.nonexistent') assert '
missing:' in result class TestLanguageMeta: def test_available_languages_includes_ko_en(self): langs = available_languages() assert 'ko' in langs assert 'en' in langs def test_language_label(self): assert language_label('ko') == '한국어' assert language_label('en') == 'English'