diff --git a/applications/modelling_e2e/handler.py b/applications/modelling_e2e/handler.py index 208b5ae7c..ea3708a06 100644 --- a/applications/modelling_e2e/handler.py +++ b/applications/modelling_e2e/handler.py @@ -607,11 +607,11 @@ def handler( ) epc_repo = EpcPostgresRepository(read_session) # Lodged EPCs are read by UPRN (keyed by UPRN below); predicted EPCs stay - # keyed on property_id. - stored_lodged_epcs: dict[int, EpcPropertyData] = ( - epc_repo.get_for_properties(list(set(uprns.values()))) - if not refetch_epc - else {} + # keyed on property_id. Read whatever refetch_epc says — the flag decides + # whether the gov register is consulted for a *candidate*, never whether a + # stored assessment can win the ADR-0001 Recency Tie-Break (#1589). + stored_lodged_epcs: dict[int, EpcPropertyData] = epc_repo.get_for_properties( + list(set(uprns.values())) ) stored_predicted_epcs: dict[int, EpcPropertyData] = ( epc_repo.get_predicted_for_properties(property_ids) @@ -645,8 +645,15 @@ def handler( stored_lodged = stored_lodged_epcs.get(uprn) lodged_epc_is_new = False if refetch_epc: - epc: Optional[EpcPropertyData] = epc_client.get_by_uprn(uprn) - lodged_epc_is_new = epc is not None + epc: Optional[EpcPropertyData] = None + epc, lodged_epc_is_new = _newer_lodged( + stored_lodged, epc_client.get_by_uprn(uprn) + ) + if epc is not None and not lodged_epc_is_new: + logger.info( + f"property={pid} stored lodged EPC is newer than the " + f"fetched cert — keeping the stored assessment" + ) elif stored_lodged is not None: logger.info( f"property={pid} using stored lodged EPC (refetch_epc=False)" diff --git a/tests/applications/modelling_e2e/test_handler.py b/tests/applications/modelling_e2e/test_handler.py index 305e22f46..1a41a0bda 100644 --- a/tests/applications/modelling_e2e/test_handler.py +++ b/tests/applications/modelling_e2e/test_handler.py @@ -1933,10 +1933,13 @@ def test_repredict_epc_false_without_stored_predicted_epc_falls_back_to_live_pre stack.enter_context( patch("applications.modelling_e2e.handler.run_modelling", return_value=mock_plan) ) - # No stored predicted EPC - stack.enter_context( + # Nothing stored: no predicted EPC, and no lodged EPC to win the + # tie-break against the register's None + mock_epc_repo = stack.enter_context( patch("applications.modelling_e2e.handler.EpcPostgresRepository") - ).return_value.get_predicted_for_properties.return_value = {} + ).return_value + mock_epc_repo.get_predicted_for_properties.return_value = {} + mock_epc_repo.get_for_properties.return_value = {} MockUoW = stack.enter_context( patch("applications.modelling_e2e.handler.PostgresUnitOfWork") )