Files
soundboard-py/soundboard/tests/test_config.py
T

67 lines
2.2 KiB
Python

import json
import os
import sys
import tempfile
import unittest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import config
class TestConfig(unittest.TestCase):
def setUp(self):
self.dir = tempfile.mkdtemp()
self.path = os.path.join(self.dir, "config.json")
def test_missing_file_returns_default(self):
cfg = config.load_config(self.path)
self.assertEqual(cfg, config.default_config())
self.assertEqual(cfg["buttons"], [])
self.assertIsNone(cfg["output_device"])
def test_corrupt_file_returns_default(self):
with open(self.path, "w") as fh:
fh.write("{not valid json")
self.assertEqual(config.load_config(self.path), config.default_config())
def test_round_trip(self):
cfg = config.default_config()
cfg["output_device"] = "CABLE Input"
cfg["volume"] = 55
cfg["buttons"] = [{"id": "btn_001", "label": "Air Horn", "file_path": "/x/a.mp3"}]
config.save_config(self.path, cfg)
loaded = config.load_config(self.path)
self.assertEqual(loaded, cfg)
def test_save_is_atomic_no_tmp_left(self):
config.save_config(self.path, config.default_config())
self.assertFalse(os.path.exists(self.path + ".tmp"))
self.assertTrue(os.path.exists(self.path))
def test_volume_clamped(self):
with open(self.path, "w") as fh:
json.dump({"volume": 999}, fh)
self.assertEqual(config.load_config(self.path)["volume"], 100)
def test_malformed_buttons_dropped(self):
with open(self.path, "w") as fh:
json.dump(
{
"buttons": [
{"id": "btn_001", "label": "ok", "file_path": "/a"},
{"id": "btn_002", "label": "missing path"},
"not a dict",
{"id": 5, "label": "bad id type", "file_path": "/b"},
]
},
fh,
)
buttons = config.load_config(self.path)["buttons"]
self.assertEqual(len(buttons), 1)
self.assertEqual(buttons[0]["id"], "btn_001")
if __name__ == "__main__":
unittest.main()