import json import unittest from pathlib import Path from block import __main__ BASE_DIR = Path(__file__).resolve().parent data = { "hd_score_m1": 1173.0, "hd_score_g1": 1203.0, "hd_score_s1": 1240.0, "hd_score_s2": 0, "hd_score_s3": 0, "hd_score_iso_m2": 1001.0, "hd_score_g2": 0.0, } def score_data(**overrides): values = { "hd_score_m1": 1100.0, "hd_score_g1": 0.0, "hd_score_s1": 0.0, "hd_score_s2": 0.0, "hd_score_s3": 0.0, "hd_score_iso_m2": 1001.0, "hd_score_g2": 0.0, "hd_score_s4": 0.0, } values.update(overrides) return values class TestBlock(unittest.TestCase): def test_main_success(self): block_result = __main__(**data) self.assertIsInstance(block_result, dict, "Result should be a dictionary.") self.assertIn("hd_score", block_result, "Result dictionary should contain 'hd_score' if success.") def test_s4_sets_review_application_when_no_decline(self): block_result = __main__(**score_data(hd_score_s4=1191)) self.assertEqual(block_result["hd_score"], 1191) self.assertEqual(block_result["recommended_action"], "Review Application") self.assertEqual(block_result["hd_action_reasoncode"], "S4 Velocity Triggered") self.assertIn("Review Application", block_result["description"]) def test_s4_review_can_use_top_of_reserved_band(self): block_result = __main__(**score_data(hd_score_s4=1200)) self.assertEqual(block_result["hd_score"], 1200) self.assertEqual(block_result["recommended_action"], "Review Application") def test_decline_precedence_beats_s4_review(self): block_result = __main__(**score_data(hd_score_s1=1225, hd_score_s4=1200)) self.assertEqual(block_result["hd_score"], 1225) self.assertEqual(block_result["recommended_action"], "Decline Application") self.assertEqual(block_result["hd_action_reasoncode"], "S1 Triggered") def test_non_s4_pass_score_in_reserved_band_shifts_down(self): block_result = __main__(**score_data(hd_score_m1=1195, hd_score_s4=0)) self.assertEqual(block_result["hd_score"], 1185) self.assertEqual(block_result["recommended_action"], "Pass Application") self.assertEqual(block_result["hd_action_reasoncode"], "Pass") def test_non_s4_pass_score_below_reserved_band_stays_same(self): block_result = __main__(**score_data(hd_score_m1=1190, hd_score_s4=0)) self.assertEqual(block_result["hd_score"], 1190) self.assertEqual(block_result["recommended_action"], "Pass Application") def test_request_schema_adds_s4_and_response_schema_is_unchanged(self): request_schema = json.loads((BASE_DIR / "request_schema.json").read_text()) response_schema = json.loads((BASE_DIR / "response_schema.json").read_text()) self.assertEqual(request_schema["properties"]["hd_score_s4"]["type"], ["number", "null"]) self.assertEqual( set(response_schema["properties"]), {"hd_score", "recommended_action", "description", "hd_action_reasoncode"}, ) if __name__ == "__main__": unittest.main()