Skip to content

Commit be5af17

Browse files
committed
Strengthen budget-window integration coverage
1 parent ca228e1 commit be5af17

2 files changed

Lines changed: 39 additions & 6 deletions

File tree

projects/policyengine-api-simulation/src/modal/app.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def get_app_name(us_version: str, uk_version: str) -> str:
3939
# Secrets
4040
# GCP credentials are shared across environments (always from main)
4141
gcp_secret = modal.Secret.from_name("gcp-credentials", environment_name="main")
42+
data_secret = modal.Secret.from_name("policyengine-data-credentials")
4243
# Logfire secret is environment-specific
4344
logfire_secret = modal.Secret.from_name("policyengine-logfire")
4445

@@ -80,7 +81,7 @@ def configure_logfire(service_name: str = "policyengine-simulation"):
8081
timeout=3600,
8182
retries=0,
8283
max_containers=100,
83-
secrets=[gcp_secret, logfire_secret],
84+
secrets=[gcp_secret, data_secret, logfire_secret],
8485
)
8586
def run_simulation(params: dict) -> dict:
8687
"""
@@ -118,7 +119,7 @@ def run_simulation(params: dict) -> dict:
118119
timeout=3600,
119120
retries=0,
120121
max_containers=100,
121-
secrets=[gcp_secret, logfire_secret],
122+
secrets=[gcp_secret, data_secret, logfire_secret],
122123
)
123124
def run_budget_window_batch(params: dict) -> dict:
124125
"""Execute a multi-year budget-window batch orchestration."""

projects/policyengine-apis-integ/tests/simulation/test_budget_window.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,28 @@
1414
from policyengine_api_simulation_client.models import (
1515
BudgetWindowBatchSubmitResponse,
1616
BudgetWindowResult,
17+
SingleYearMacroOutput,
1718
)
1819
from policyengine_api_simulation_client.types import Unset
1920

21+
SINGLE_YEAR_MACRO_OUTPUT_KEYS = {
22+
"budget",
23+
"detailed_budget",
24+
"decile",
25+
"inequality",
26+
"poverty",
27+
"poverty_by_gender",
28+
"poverty_by_race",
29+
"intra_decile",
30+
"wealth_decile",
31+
"intra_wealth_decile",
32+
"labor_supply_response",
33+
"constituency_impact",
34+
"local_authority_impact",
35+
"congressional_district_impact",
36+
"cliff_impact",
37+
}
38+
2039

2140
@pytest.mark.beta_only
2241
def test_budget_window_multi_year_batch_completes(
@@ -61,11 +80,24 @@ def test_budget_window_multi_year_batch_completes(
6180
assert result.end_year == budget_window_years[-1]
6281
assert result.window_size == len(budget_window_years)
6382
assert result.years == budget_window_years
83+
result_payload = result.to_dict()
84+
assert "annualImpacts" not in result_payload
85+
assert "outputsByYear" in result_payload
86+
6487
outputs_by_year = result.outputs_by_year
6588
assert not isinstance(outputs_by_year, Unset)
6689
assert outputs_by_year.additional_keys == budget_window_years
67-
assert all(
68-
outputs_by_year[year].budget.budgetary_impact is not None
69-
for year in budget_window_years
70-
)
90+
for year in budget_window_years:
91+
output = outputs_by_year[year]
92+
assert isinstance(output, SingleYearMacroOutput)
93+
output_payload = output.to_dict()
94+
assert SINGLE_YEAR_MACRO_OUTPUT_KEYS <= set(output_payload)
95+
assert output.budget.budgetary_impact is not None
96+
assert isinstance(output_payload["decile"], dict)
97+
assert isinstance(output_payload["inequality"], dict)
98+
assert isinstance(output_payload["poverty"], dict)
99+
assert isinstance(output_payload["poverty_by_gender"], dict)
100+
assert isinstance(output_payload["intra_decile"], dict)
101+
assert isinstance(output_payload["labor_supply_response"], dict)
102+
71103
assert isinstance(result.totals.budgetary_impact, int | float)

0 commit comments

Comments
 (0)