From cf097afc00fa565962e7047827277a6c15948f46 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 30 Jun 2026 15:24:22 +0000 Subject: [PATCH] =?UTF-8?q?effective-lodged-divergence=20is=20silent=20for?= =?UTF-8?q?=20implausible=20lodged=20scores=20(<=2013)=20=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- tests/scripts/test_audit_anomalies.py | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/scripts/test_audit_anomalies.py diff --git a/tests/scripts/test_audit_anomalies.py b/tests/scripts/test_audit_anomalies.py new file mode 100644 index 000000000..b6acf3fde --- /dev/null +++ b/tests/scripts/test_audit_anomalies.py @@ -0,0 +1,48 @@ +from typing import Optional + +import pytest + +from scripts.audit.anomalies import ( + PropertyAudit, + _effective_lodged_divergence, +) + + +def _make_audit( + *, + lodged_sap: Optional[float], + effective_sap: Optional[float], + rebaseline_reason: str = "both", +) -> PropertyAudit: + return PropertyAudit( + property_id=1, + uprn=None, + portfolio_id=796, + scenario_id=None, + scenario_goal_band=None, + lodged_sap=lodged_sap, + lodged_band=None, + effective_sap=effective_sap, + effective_band=None, + rebaseline_reason=rebaseline_reason, + post_sap=None, + post_band=None, + cost_of_works=None, + energy_bill_savings=None, + energy_consumption_savings=None, + solar_sap_points=None, + solar_bill_savings=None, + n_measures=0, + ) + + +class TestEffectiveLodgedDivergence: + def test_silent_when_lodged_sap_below_floor(self) -> None: + # Arrange — Class C exemplar: lodged=1, effective=76 (gap +75, but lodged is implausible upstream data) + audit = _make_audit(lodged_sap=1.0, effective_sap=76.0) + + # Act + result = _effective_lodged_divergence(audit) + + # Assert + assert result is None