import unittest from gridgent.tools.grid_stub import ( run_power_flow_scenario, get_feeder_summary, parse_uploaded_grid, save_uploaded_grid, reload_feeder_config, get_all_feeders, ) from pathlib import Path import json class TestTools(unittest.TestCase): def test_feeder_summary_exists(self): meta = get_feeder_summary("F1") self.assertIn("peak_mw", meta) self.assertGreater(meta["peak_mw"], 0) def test_power_flow_baseline(self): result = run_power_flow_scenario("F1", added_pv_mw=0.0, added_load_mw=0.0) self.assertIsInstance(result.peak_loading_pct, float) self.assertGreater(result.peak_loading_pct, 0) self.assertGreaterEqual(result.min_voltage_pu, 0.9) self.assertLessEqual(result.max_voltage_pu, 1.1) def test_power_flow_high_load_flags_issue(self): result = run_power_flow_scenario("F1", added_pv_mw=0.0, added_load_mw=20.0) self.assertTrue(any("overloaded" in x.lower() for x in result.overload_elements)) def test_parse_uploaded_json(self): raw = json.dumps({ "feeders": { "X1": {"name": "Custom Feeder", "base_kv": 11.0, "num_customers": 100, "peak_mw": 5.0, "pv_mw": 0.5} } }) cfg = parse_uploaded_grid(raw, "json") self.assertIn("feeders", cfg) self.assertIn("X1", cfg["feeders"]) def test_parse_uploaded_csv(self): raw = "feeder_id,name,base_kv,num_customers,peak_mw,pv_mw\n" "Y1,Feeder Y1,13.8,200,8.0,1.2\n" cfg = parse_uploaded_grid(raw, "csv") self.assertIn("Y1", cfg["feeders"]) def test_save_uploaded_overrides(self): raw = json.dumps({ "feeders": { "Z1": {"name": "Uploaded Feeder Z1", "base_kv": 13.8, "num_customers": 999, "peak_mw": 50.0, "pv_mw": 5.0} } }) cfg = parse_uploaded_grid(raw, "json") save_uploaded_grid(cfg) reload_feeder_config() feeders = get_all_feeders() self.assertIn("Z1", feeders) meta = get_feeder_summary("Z1") self.assertEqual(meta["peak_mw"], 50.0) # Clean up uploaded file base_dir = Path(__file__).resolve().parents[1] up = base_dir / "config" / "uploaded_feedermodel.json" if up.exists(): up.unlink() reload_feeder_config() if __name__ == "__main__": unittest.main()