import json import os import unittest from components.sud import Sud FIXTURES_DIR = os.path.join(os.path.dirname(__file__), '..', '..', 'utils', 'sud_fixtures') def _load_fixture(name): with open(os.path.join(FIXTURES_DIR, name)) as f: return json.load(f) class TestSudLoadRejectsMalformedDocs(unittest.TestCase): """Sud.load() wires in utils/sud_validate.py's validate_sud() so a malformed sud.json is refused (same False-returning contract as any other load() failure - see components/sud.py's own docstring) instead of parsing cleanly and only crashing much later, mid-run or during a forecast simulation, on the unguarded ramp['rate'] lookup.""" def test_valid_doc_loads(self): sud = Sud() self.assertTrue(sud.load(_load_fixture('valid_multi_step.json'))) self.assertEqual(sud.name, 'MultiStep') def test_missing_ramp_rate_is_refused(self): sud = Sud() self.assertFalse(sud.load(_load_fixture('missing_ramp_rate.json'))) def test_wrong_type_ramp_rate_is_refused(self): sud = Sud() self.assertFalse(sud.load(_load_fixture('ramp_rate_wrong_type.json'))) def test_empty_steps_is_refused(self): sud = Sud() self.assertFalse(sud.load(_load_fixture('empty_steps_list.json'))) def test_failed_load_leaves_previous_schedule_untouched(self): sud = Sud() self.assertTrue(sud.load(_load_fixture('valid_multi_step.json'))) self.assertFalse(sud.load(_load_fixture('missing_ramp_rate.json'))) self.assertEqual(sud.name, 'MultiStep') self.assertEqual(len(sud.schedule), 3) if __name__ == '__main__': unittest.main()