summaryrefslogtreecommitdiff
path: root/tests/test_config.py
blob: 2c1dac3827f4c93f7cdd84888012d6012fbf9972 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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()