98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
import json
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SRC = ROOT / "src"
|
|
if str(SRC) not in sys.path:
|
|
sys.path.insert(0, str(SRC))
|
|
|
|
from config import load
|
|
|
|
|
|
class ConfigTests(unittest.TestCase):
|
|
def test_defaults_when_file_missing(self):
|
|
missing = Path(tempfile.gettempdir()) / "lel_missing_config_test.json"
|
|
if missing.exists():
|
|
missing.unlink()
|
|
|
|
cfg = load(str(missing))
|
|
|
|
self.assertEqual(cfg.daemon.hotkey, "Cmd+m")
|
|
self.assertEqual(cfg.recording.input, "")
|
|
self.assertEqual(cfg.stt.model, "base")
|
|
self.assertEqual(cfg.stt.device, "cpu")
|
|
self.assertEqual(cfg.injection.backend, "clipboard")
|
|
self.assertTrue(cfg.ai.enabled)
|
|
self.assertFalse(cfg.logging.log_transcript)
|
|
|
|
def test_loads_nested_config(self):
|
|
payload = {
|
|
"daemon": {"hotkey": "Ctrl+space"},
|
|
"recording": {"input": 3},
|
|
"stt": {"model": "small", "device": "cuda"},
|
|
"injection": {"backend": "injection"},
|
|
"ai": {"enabled": False},
|
|
"logging": {"log_transcript": True},
|
|
}
|
|
with tempfile.TemporaryDirectory() as td:
|
|
path = Path(td) / "config.json"
|
|
path.write_text(json.dumps(payload), encoding="utf-8")
|
|
|
|
cfg = load(str(path))
|
|
|
|
self.assertEqual(cfg.daemon.hotkey, "Ctrl+space")
|
|
self.assertEqual(cfg.recording.input, 3)
|
|
self.assertEqual(cfg.stt.model, "small")
|
|
self.assertEqual(cfg.stt.device, "cuda")
|
|
self.assertEqual(cfg.injection.backend, "injection")
|
|
self.assertFalse(cfg.ai.enabled)
|
|
self.assertTrue(cfg.logging.log_transcript)
|
|
|
|
def test_loads_legacy_keys(self):
|
|
payload = {
|
|
"hotkey": "Alt+m",
|
|
"input": "Mic",
|
|
"whisper_model": "tiny",
|
|
"whisper_device": "cpu",
|
|
"injection_backend": "clipboard",
|
|
"ai_enabled": False,
|
|
"log_transcript": True,
|
|
}
|
|
with tempfile.TemporaryDirectory() as td:
|
|
path = Path(td) / "config.json"
|
|
path.write_text(json.dumps(payload), encoding="utf-8")
|
|
|
|
cfg = load(str(path))
|
|
|
|
self.assertEqual(cfg.daemon.hotkey, "Alt+m")
|
|
self.assertEqual(cfg.recording.input, "Mic")
|
|
self.assertEqual(cfg.stt.model, "tiny")
|
|
self.assertEqual(cfg.stt.device, "cpu")
|
|
self.assertEqual(cfg.injection.backend, "clipboard")
|
|
self.assertFalse(cfg.ai.enabled)
|
|
self.assertTrue(cfg.logging.log_transcript)
|
|
|
|
def test_invalid_injection_backend_raises(self):
|
|
payload = {"injection": {"backend": "invalid"}}
|
|
with tempfile.TemporaryDirectory() as td:
|
|
path = Path(td) / "config.json"
|
|
path.write_text(json.dumps(payload), encoding="utf-8")
|
|
|
|
with self.assertRaisesRegex(ValueError, "injection.backend"):
|
|
load(str(path))
|
|
|
|
def test_invalid_logging_flag_raises(self):
|
|
payload = {"logging": {"log_transcript": "yes"}}
|
|
with tempfile.TemporaryDirectory() as td:
|
|
path = Path(td) / "config.json"
|
|
path.write_text(json.dumps(payload), encoding="utf-8")
|
|
|
|
with self.assertRaisesRegex(ValueError, "logging.log_transcript"):
|
|
load(str(path))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|