diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29b..28ab85b9 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,5 @@ +- bump: minor + changes: + added: + - Unit test for GeneralEconomyTask.calculate_cliffs() and fixture for the test + - Test for calculate_single_economy with cliff impacts \ No newline at end of file diff --git a/tests/country/test_us.py b/tests/country/test_us.py index c4b8f6f5..343aa008 100644 --- a/tests/country/test_us.py +++ b/tests/country/test_us.py @@ -21,3 +21,26 @@ def test_us_macro_comparison(): ) sim.calculate_economy_comparison() + + +def test_us_macro_cliff_impacts(): + from policyengine import Simulation + + sim = Simulation( + scope="macro", + country="us", + reform={ + "gov.usda.snap.income.deductions.earned_income": {"2025": 0.05} + }, + include_cliffs=True, + ) + + result = sim.calculate_economy_comparison() + cliff_impact = result.model_dump().get("cliff_impact") + + assert ( + cliff_impact is not None + ), "Expected 'cliff_impact' to be present in the output." + + assert cliff_impact["baseline"]["cliff_gap"] > 0 + assert cliff_impact["reform"]["cliff_share"] > 0 diff --git a/tests/fixtures/simulation.py b/tests/fixtures/simulation.py index 7cc51720..310c98aa 100644 --- a/tests/fixtures/simulation.py +++ b/tests/fixtures/simulation.py @@ -61,3 +61,15 @@ def mock_dataset(): mock_instance.file_path = SAMPLE_DATASET_FILENAME mock_dataset_class.from_file.return_value = mock_instance yield mock_instance + + +@pytest.fixture +def mock_simulation_with_cliff_vars(): + + mock_sim = Mock() + mock_sim.calculate.side_effect = lambda var: { + "cliff_gap": Mock(sum=Mock(return_value=100.0)), + "is_on_cliff": Mock(sum=Mock(return_value=40.0)), + "is_adult": Mock(sum=Mock(return_value=80.0)), + }[var] + return mock_sim diff --git a/tests/test_simulation.py b/tests/test_simulation.py index a3697bc2..af9ea310 100644 --- a/tests/test_simulation.py +++ b/tests/test_simulation.py @@ -5,11 +5,15 @@ mock_get_default_dataset, mock_dataset, SAMPLE_DATASET_FILENAME, + mock_simulation_with_cliff_vars, ) import sys from copy import deepcopy from policyengine import Simulation +from policyengine.outputs.macro.single.calculate_single_economy import ( + GeneralEconomyTask, +) class TestSimulation: @@ -70,3 +74,16 @@ def test__given_dataset_without_time_period__does_not_set_time_period( sim._set_data_time_period(uk_sim_options_pe_dataset.data) == None ) + + class TestCalculateCliffs: + def test__calculates_correct_cliff_metrics( + self, mock_simulation_with_cliff_vars + ): + + task = object.__new__(GeneralEconomyTask) + task.simulation = mock_simulation_with_cliff_vars + + cliff_result = task.calculate_cliffs() + + assert cliff_result.cliff_gap == 100.0 + assert cliff_result.cliff_share == 0.5