Skip to content

Commit 51d9c49

Browse files
committed
Expand FastAPI shell coverage
1 parent 4c123fc commit 51d9c49

2 files changed

Lines changed: 72 additions & 3 deletions

File tree

tests/unit/services/test_economy_service.py

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
):

tests/unit/test_asgi_factory.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
import json
33
import sys
44

5+
import pytest
56
from fastapi.testclient import TestClient
67
from flask import Flask, Response, jsonify, make_response, request
78
from flask_cors import CORS
9+
from starlette.responses import Response as ASGIResponse
810

9-
from policyengine_api.asgi_factory import create_asgi_app
11+
from policyengine_api.asgi_factory import _add_vary_origin, create_asgi_app
1012

1113

1214
def create_test_wsgi_app() -> Flask:
@@ -56,6 +58,25 @@ def test_native_health_route_is_fastapi_json():
5658
assert response.headers["content-type"].startswith("application/json")
5759

5860

61+
@pytest.mark.parametrize(
62+
("existing_vary", "expected_vary"),
63+
[
64+
(None, "Origin"),
65+
("Accept-Encoding", "Accept-Encoding, Origin"),
66+
("Origin", "Origin"),
67+
("Accept-Encoding, origin", "Accept-Encoding, origin"),
68+
],
69+
)
70+
def test_add_vary_origin_preserves_existing_values(existing_vary, expected_vary):
71+
response = ASGIResponse()
72+
if existing_vary is not None:
73+
response.headers["Vary"] = existing_vary
74+
75+
_add_vary_origin(response)
76+
77+
assert response.headers["Vary"] == expected_vary
78+
79+
5980
def test_asgi_entrypoint_imports_and_serves_health(monkeypatch):
6081
monkeypatch.setenv("FLASK_DEBUG", "1")
6182
sys.modules.pop("policyengine_api.asgi", None)

0 commit comments

Comments
 (0)