KINDNICK bedbb1e9ec
Some checks failed
CI / test (push) Has been cancelled
Initial release v2.2.0
핵심 기능:
- 단축근무·표준·반일 등 다양한 근무 패턴 (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>
2026-04-30 12:54:40 +09:00

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'