test: add fixture-driven suite for config_validate
Complements the inline-dict unit tests in test_config_validate.py with 10 real JSON config files under tests/utils/fixtures/ (valid sim/real/ Normal configs, one with legacy unknown keys that must NOT fail, and six broken variants covering each distinct failure mode: missing gain, missing Inner branch, missing pid_type, missing TempCtrl entirely, wrong-typed gain, TempCtrl not a dict). test_config_fixtures.py drives all of them from one CASES table (fixture name -> expected pass/ConfigError-regex), plus a guard test that fails if fixtures/ and CASES ever drift apart. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F4oEE99rkKVU8L8tkzXWdG
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import json
|
||||
import os
|
||||
import unittest
|
||||
|
||||
from utils.config_validate import ConfigError, validate_temp_ctrl
|
||||
|
||||
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||
|
||||
# filename -> None if the fixture should pass validation, otherwise a regex
|
||||
# matched against the raised ConfigError's message.
|
||||
CASES = {
|
||||
'valid_sim.json': None,
|
||||
'valid_real.json': None,
|
||||
'valid_normal.json': None,
|
||||
'legacy_unknown_keys.json': None,
|
||||
'missing_outer_kp.json': r'TempCtrl\.Outer\.kp',
|
||||
'missing_inner_hold_branch.json': r'TempCtrl\.Inner\.Hold',
|
||||
'missing_pid_type.json': r'TempCtrl\.pid_type',
|
||||
'missing_tempctrl_section.json': r'missing required config key: TempCtrl$',
|
||||
'wrong_type_kp_string.json': r'TempCtrl\.Inner\.Heat\.kp',
|
||||
'wrong_type_tempctrl_not_dict.json': r'TempCtrl must be dict',
|
||||
}
|
||||
|
||||
|
||||
def _load(name):
|
||||
with open(os.path.join(FIXTURES_DIR, name)) as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
class TestConfigFixtures(unittest.TestCase):
|
||||
def test_every_fixture_file_is_covered(self):
|
||||
on_disk = {f for f in os.listdir(FIXTURES_DIR) if f.endswith('.json')}
|
||||
self.assertEqual(on_disk, set(CASES), "fixtures/ and CASES have drifted apart")
|
||||
|
||||
def test_fixtures_match_expected_outcome(self):
|
||||
for name, expected_error in CASES.items():
|
||||
with self.subTest(fixture=name):
|
||||
config = _load(name)
|
||||
if expected_error is None:
|
||||
validate_temp_ctrl(config) # must not raise
|
||||
else:
|
||||
with self.assertRaisesRegex(ConfigError, expected_error):
|
||||
validate_temp_ctrl(config)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user