summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2026-07-24 13:27:46 +0200
committerYuval Adam <_@yuv.al>2026-07-24 13:27:46 +0200
commit58b465b5b84cb90424eeffd6f877c8e5ad7bd647 (patch)
tree828e16dd5eed5f74b3314a63d5e2c04762a9bc07 /tests
parent70781bce8d2c18c8292a89653b6183d2bb210441 (diff)
Replace environment configuration with TOML
Diffstat (limited to 'tests')
-rw-r--r--tests/test_config.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 0000000..2c1dac3
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,80 @@
+from pathlib import Path
+import tempfile
+import unittest
+from unittest.mock import patch
+
+from parley.config import Config, DEFAULT_MODEL_PATH, DEFAULT_TRANSCRIPT_DIR
+from parley.errors import ConfigurationError
+
+
+class ConfigTests(unittest.TestCase):
+ @patch("parley.config.shutil.which")
+ def test_system_defaults(self, which) -> None:
+ which.side_effect = lambda command: f"/usr/bin/{command}"
+
+ config = Config.load(Path("/nonexistent/parley.toml"))
+
+ self.assertEqual(config.ffmpeg, Path("/usr/bin/ffmpeg"))
+ self.assertEqual(config.transcribe_cli, Path("/usr/bin/transcribe-cli"))
+ self.assertEqual(config.model, DEFAULT_MODEL_PATH)
+ self.assertEqual(config.transcript_dir, DEFAULT_TRANSCRIPT_DIR)
+ self.assertTrue(config.auto_insert)
+ self.assertEqual(config.insertion_mode, "ibus")
+ self.assertFalse(config.notifications_enabled)
+
+ def test_loads_toml_overrides(self) -> None:
+ with tempfile.TemporaryDirectory() as temporary:
+ path = Path(temporary) / "config.toml"
+ path.write_text(
+ """
+[audio]
+ffmpeg = "/opt/ffmpeg"
+device = "studio"
+sample_rate = 48000
+
+[transcription]
+command = "/opt/transcribe"
+model = "~/model.gguf"
+language = "fr"
+
+[storage]
+transcript_directory = "~/dictation"
+
+[insertion]
+enabled = false
+mode = "clipboard"
+
+[notifications]
+enabled = true
+""",
+ encoding="utf-8",
+ )
+
+ config = Config.load(path)
+
+ self.assertEqual(config.ffmpeg, Path("/opt/ffmpeg"))
+ self.assertEqual(config.transcribe_cli, Path("/opt/transcribe"))
+ self.assertEqual(config.device, "studio")
+ self.assertEqual(config.sample_rate, 48_000)
+ self.assertEqual(config.language, "fr")
+ self.assertFalse(config.auto_insert)
+ self.assertEqual(config.insertion_mode, "clipboard")
+ self.assertTrue(config.notifications_enabled)
+
+ def test_rejects_malformed_toml(self) -> None:
+ with tempfile.TemporaryDirectory() as temporary:
+ path = Path(temporary) / "config.toml"
+ path.write_text("[audio\n", encoding="utf-8")
+ with self.assertRaisesRegex(ConfigurationError, "could not read"):
+ Config.load(path)
+
+ def test_rejects_invalid_types(self) -> None:
+ with tempfile.TemporaryDirectory() as temporary:
+ path = Path(temporary) / "config.toml"
+ path.write_text("[insertion]\nenabled = 'yes'\n", encoding="utf-8")
+ with self.assertRaisesRegex(ConfigurationError, "must be a boolean"):
+ Config.load(path)
+
+
+if __name__ == "__main__":
+ unittest.main()