Skip to content

Commit 4c123fc

Browse files
committed
Tighten FastAPI shell review follow-ups
1 parent 9a81e6c commit 4c123fc

4 files changed

Lines changed: 49 additions & 201 deletions

File tree

policyengine_api/services/economy_service.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class ImpactStatus(Enum):
7878
BUDGET_WINDOW_MAX_ACTIVE_YEARS = budget_window_utils.BUDGET_WINDOW_MAX_ACTIVE_YEARS
7979
BUDGET_WINDOW_MAX_YEARS = budget_window_utils.BUDGET_WINDOW_MAX_YEARS
8080
BUDGET_WINDOW_MAX_END_YEAR = budget_window_utils.BUDGET_WINDOW_MAX_END_YEAR
81+
BUDGET_WINDOW_SUBMISSION_VALIDATION_ERROR_STATUS_CODES = {400, 422}
8182

8283

8384
class EconomicImpactSetupOptions(BaseModel):
@@ -351,7 +352,10 @@ def get_budget_window_economic_impact(
351352
)
352353
except httpx.HTTPStatusError as error:
353354
budget_window_cache.clear_starting_claim(cache_key, claim_token)
354-
if 400 <= error.response.status_code < 500:
355+
if (
356+
error.response.status_code
357+
in BUDGET_WINDOW_SUBMISSION_VALIDATION_ERROR_STATUS_CODES
358+
):
355359
return BudgetWindowEconomicImpactResult.failed(
356360
self._build_budget_window_submission_error_message(error),
357361
queued_years=years,

tests/unit/services/test_economy_service.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,15 +1024,17 @@ def test__given_batch_submission_fails__clears_start_claim(
10241024
"budget-window-cache-key", MOCK_PROCESS_ID
10251025
)
10261026

1027-
def test__given_modal_rejects_batch_submission__returns_failed_result(
1027+
@pytest.mark.parametrize("status_code", [400, 422])
1028+
def test__given_modal_rejects_batch_submission_for_validation__returns_failed_result(
10281029
self,
10291030
economy_service,
10301031
base_params,
10311032
mock_simulation_api,
10321033
mock_budget_window_cache,
1034+
status_code,
10331035
):
10341036
mock_simulation_api.run_budget_window_batch.side_effect = make_http_status_error(
1035-
400,
1037+
status_code,
10361038
{
10371039
"detail": (
10381040
"Invalid Hugging Face dataset URI: "
@@ -1058,15 +1060,17 @@ def test__given_modal_rejects_batch_submission__returns_failed_result(
10581060
)
10591061
mock_budget_window_cache.store_batch_job_id.assert_not_called()
10601062

1061-
def test__given_modal_server_error_on_batch_submission__raises(
1063+
@pytest.mark.parametrize("status_code", [401, 403, 429, 500])
1064+
def test__given_modal_non_validation_error_on_batch_submission__raises(
10621065
self,
10631066
economy_service,
10641067
base_params,
10651068
mock_simulation_api,
10661069
mock_budget_window_cache,
1070+
status_code,
10671071
):
10681072
mock_simulation_api.run_budget_window_batch.side_effect = (
1069-
make_http_status_error(500, {"detail": "gateway unavailable"})
1073+
make_http_status_error(status_code, {"detail": "gateway unavailable"})
10701074
)
10711075

10721076
with pytest.raises(httpx.HTTPStatusError):

tests/unit/test_asgi_factory.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import importlib
12
import json
3+
import sys
24

35
from fastapi.testclient import TestClient
46
from flask import Flask, Response, jsonify, make_response, request
@@ -54,6 +56,18 @@ def test_native_health_route_is_fastapi_json():
5456
assert response.headers["content-type"].startswith("application/json")
5557

5658

59+
def test_asgi_entrypoint_imports_and_serves_health(monkeypatch):
60+
monkeypatch.setenv("FLASK_DEBUG", "1")
61+
sys.modules.pop("policyengine_api.asgi", None)
62+
63+
asgi_module = importlib.import_module("policyengine_api.asgi")
64+
response = TestClient(asgi_module.app).get("/health")
65+
66+
assert asgi_module.application is asgi_module.app
67+
assert response.status_code == 200
68+
assert response.json() == {"status": "healthy"}
69+
70+
5771
def test_fastapi_documentation_routes_fall_through_to_flask_404():
5872
client = TestClient(create_asgi_app(create_test_wsgi_app()))
5973

0 commit comments

Comments
 (0)