Some checks failed
CI / test (push) Has been cancelled
핵심 기능: - 단축근무·표준·반일 등 다양한 근무 패턴 (5개 프리셋 + 사용자 정의) - Windows 이벤트 뷰어 자동 출퇴근 감지 - 30분 단위 연장근무 적립/사용 시스템 - 1.0/0.5/0.25일 연차·반차·반반차 - 자동 점심·저녁·외출·자동 백업·화면 잠금 자동 외출 - 한국 공휴일 자동 등록 (음력 포함, holidays 패키지) - matplotlib 차트 기반 주간/월간/패턴 통계 - 미니 위젯 + 시스템 트레이 통합 - 한국어/English i18n - 자가 업데이트 (updater.exe + Gitea Releases) 아키텍처: - core/ (db, time_calculator, notifier, i18n, version, settings_keys) - ui/ (main_window + 9 dialogs + 3 controllers) - utils/ (backup, lock_detector, debug_log, updater_client, time_format) - tests/ (66 pytest 단위) + 통합/i18n GUI 검증 CI/CD: - .gitea/workflows/ci.yml: push 시 pytest + 통합 테스트 - .gitea/workflows/release.yml: v* 태그 push 시 두 .exe 자동 빌드 + Releases 첨부 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
"""
|
|
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 '<p>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'
|