import json from hearo.config import AppConfig from hearo.models.tiers import DEFAULT_TIER def test_defaults_are_sane(): cfg = AppConfig() assert cfg.models.tier == DEFAULT_TIER assert cfg.models.target_lang == "ko" assert cfg.subtitle.font_size > 0 assert cfg.audio.silence_ms > 0 def test_save_load_roundtrip(tmp_path): path = tmp_path / "config.json" cfg = AppConfig() cfg.subtitle.font_size = 52 cfg.subtitle.text_color = "#FF00AA" cfg.models.tier = "precision" cfg.audio.target_pid = 4242 cfg.save(path) loaded = AppConfig.load(path) assert loaded.subtitle.font_size == 52 assert loaded.subtitle.text_color == "#FF00AA" assert loaded.models.tier == "precision" assert loaded.audio.target_pid == 4242 def test_missing_file_gives_defaults(tmp_path): assert AppConfig.load(tmp_path / "nope.json").models.tier == DEFAULT_TIER def test_corrupt_file_gives_defaults(tmp_path): path = tmp_path / "config.json" path.write_text("{ this is not json", encoding="utf-8") assert AppConfig.load(path).models.tier == DEFAULT_TIER def test_unknown_keys_are_ignored_and_missing_keys_defaulted(tmp_path): """스키마가 바뀌어도 사용자의 기존 설정이 깨지면 안 된다.""" path = tmp_path / "config.json" path.write_text( json.dumps( { "theme": "light", "removed_option": True, "subtitle": {"font_size": 40, "gone_field": 1}, } ), encoding="utf-8", ) cfg = AppConfig.load(path) assert cfg.theme == "light" assert cfg.subtitle.font_size == 40 assert cfg.subtitle.bold is True # 기본값 유지 assert not hasattr(cfg, "removed_option")