@@ -111,12 +111,20 @@ def make_mock_budget_impact_data(
111111 }
112112
113113
114- def make_http_status_error (status_code : int , payload : dict ) -> httpx .HTTPStatusError :
114+ def make_http_status_error (
115+ status_code : int ,
116+ payload : dict | None = None ,
117+ text : str | None = None ,
118+ ) -> httpx .HTTPStatusError :
115119 request = httpx .Request (
116120 "POST" ,
117121 "https://policyengine-staging--policyengine-simulation-gateway-web-app.modal.run/simulate/economy/budget-window" ,
118122 )
119- response = httpx .Response (status_code , json = payload , request = request )
123+ response = (
124+ httpx .Response (status_code , json = payload , request = request )
125+ if payload is not None
126+ else httpx .Response (status_code , text = text or "" , request = request )
127+ )
120128 return httpx .HTTPStatusError (
121129 f"Client error '{ status_code } '" ,
122130 request = request ,
@@ -1081,6 +1089,46 @@ def test__given_modal_non_validation_error_on_batch_submission__raises(
10811089 )
10821090 mock_budget_window_cache .store_batch_job_id .assert_not_called ()
10831091
1092+ @pytest .mark .parametrize (
1093+ ("payload" , "expected_message" ),
1094+ [
1095+ ({"message" : "gateway validation failed" }, "gateway validation failed" ),
1096+ ({"error" : "invalid request" }, "invalid request" ),
1097+ ],
1098+ )
1099+ def test__given_modal_validation_json_error__extracts_message (
1100+ self , economy_service , payload , expected_message
1101+ ):
1102+ error = make_http_status_error (400 , payload )
1103+
1104+ message = economy_service ._build_budget_window_submission_error_message (
1105+ error
1106+ )
1107+
1108+ assert message == expected_message
1109+
1110+ def test__given_modal_validation_plain_text_error__extracts_response_text (
1111+ self , economy_service
1112+ ):
1113+ error = make_http_status_error (400 , text = "plain validation failed" )
1114+
1115+ message = economy_service ._build_budget_window_submission_error_message (
1116+ error
1117+ )
1118+
1119+ assert message == "plain validation failed"
1120+
1121+ def test__given_modal_validation_empty_error__falls_back_to_exception_text (
1122+ self , economy_service
1123+ ):
1124+ error = make_http_status_error (400 , text = "" )
1125+
1126+ message = economy_service ._build_budget_window_submission_error_message (
1127+ error
1128+ )
1129+
1130+ assert message == str (error )
1131+
10841132 def test__given_cliff_target__raises_value_error (
10851133 self , economy_service , base_params
10861134 ):
0 commit comments