from pathlib import Path import sys import pytest SCRIPTS = Path(__file__).resolve().parents[1] / "scripts" sys.path.insert(0, str(SCRIPTS)) from solution_scoring import score_catchment # noqa: E402 def test_missing_inputs_penalize_not_impute(): result = score_catchment( pressure_components={"tp_load": None, "ag_pressure": 0.4}, opportunity_components={"heat_hosts": 0.5, "grid_headroom": None}, ) assert result.pressure_score is not None assert result.missing_penalty > 0 assert result.eligible_compute_mw == 0.0 def test_proximity_alone_does_not_raise_opportunity(): result = score_catchment( pressure_components={"tp_load": 0.8}, opportunity_components={"near_wwtp_km": 0.2}, gates_verified=False, ) assert result.opportunity_score < 0.5 assert result.solution_rank_reason != "guaranteed_host" def test_verified_capacity_requires_all_three_gates_and_capacity(): missing_gate = score_catchment( pressure_components={"tp_load": 0.8, "ag_pressure": 0.4}, opportunity_components={"heat_hosts": 0.8, "grid_headroom": 0.7}, heat_host_verified=True, grid_capacity_verified=False, compute_demand_verified=True, verified_capacity_mw=1.5, ) assert missing_gate.eligible_compute_mw == 0.0 assert missing_gate.solution_rank_reason == "missing_compute_gate" missing_capacity = score_catchment( pressure_components={"tp_load": 0.8, "ag_pressure": 0.4}, opportunity_components={"heat_hosts": 0.8, "grid_headroom": 0.7}, heat_host_verified=True, grid_capacity_verified=True, compute_demand_verified=True, ) assert missing_capacity.eligible_compute_mw == 0.0 assert missing_capacity.solution_rank_reason == "verified_gates_no_capacity" verified = score_catchment( pressure_components={"tp_load": 0.8, "ag_pressure": 0.4}, opportunity_components={"heat_hosts": 0.8, "grid_headroom": 0.7}, heat_host_verified=True, grid_capacity_verified=True, compute_demand_verified=True, verified_capacity_mw=1.5, ) assert verified.eligible_compute_mw == pytest.approx(1.5) assert verified.solution_rank_reason == "verified_capacity" def test_gates_verified_still_requires_explicit_capacity(): no_capacity = score_catchment( pressure_components={"tp_load": 0.8, "ag_pressure": 0.4}, opportunity_components={ "heat_hosts": 0.8, "grid_headroom": 0.7, "eligible_heat_sink": 0.6, "near_wwtp_km": 0.2, }, gates_verified=True, ) assert no_capacity.eligible_compute_mw == 0.0 assert no_capacity.solution_rank_reason == "verified_gates_no_capacity" with_capacity = score_catchment( pressure_components={"tp_load": 0.8, "ag_pressure": 0.4}, opportunity_components={ "heat_hosts": 0.8, "grid_headroom": 0.7, "eligible_heat_sink": 0.6, "near_wwtp_km": 0.2, }, gates_verified=True, verified_capacity_mw=0.75, ) assert with_capacity.eligible_compute_mw == pytest.approx(0.75) assert with_capacity.solution_rank_reason == "verified_capacity"