Prove prediction resolves landlord overrides to a real cohort match end-to-end 🟩

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jun-te Kim 2026-06-16 15:20:49 +00:00
parent 864ba8dc1b
commit 80b86d4790

View file

@ -28,11 +28,11 @@ from datatypes.epc.domain.epc_property_data import EpcPropertyData
from datatypes.epc.domain.mapper import EpcPropertyDataMapper
from datatypes.epc.search.epc_search_result import EpcSearchResult
from domain.epc_prediction.epc_prediction import EpcPrediction
from domain.epc_prediction.prediction_target import PredictionTargetAttributes
from domain.geospatial.coordinates import Coordinates
from domain.geospatial.planning_restrictions import PlanningRestrictions
from domain.geospatial.spatial_reference import SpatialReference
from domain.property.property import Property
from infrastructure.postgres.property_override_table import PropertyOverrideRow
from infrastructure.postgres.property_table import PropertyRow
from orchestration.ingestion_orchestrator import IngestionOrchestrator
from repositories.comparable_properties.epc_comparable_properties_repository import (
@ -41,6 +41,12 @@ from repositories.comparable_properties.epc_comparable_properties_repository imp
from repositories.epc.epc_postgres_repository import EpcPostgresRepository
from repositories.geospatial.geospatial_repository import GeospatialRepository
from repositories.postgres_unit_of_work import PostgresUnitOfWork
from repositories.property.override_backed_prediction_attributes_reader import (
OverrideBackedPredictionAttributesReader,
)
from repositories.property.property_overrides_postgres_reader import (
PropertyOverridesPostgresReader,
)
from repositories.property.property_postgres_repository import (
PropertyPostgresRepository,
)
@ -105,14 +111,6 @@ class _NoSolarFetcher:
return {}
class _FakeAttributesReader:
"""Stands in for Jun-te's property_overrides read adapter: the landlord-known
property type (here a House, code "0", matching the cohort)."""
def attributes_for(self, property_id: int) -> PredictionTargetAttributes:
return PredictionTargetAttributes(property_type="0", built_form="2")
def _cohort_results() -> list[EpcSearchResult]:
return [
EpcSearchResult(
@ -135,7 +133,9 @@ def test_epc_less_property_is_predicted_persisted_and_resolved_end_to_end(
db_engine: Engine,
) -> None:
# Arrange — an EPC-less Property exists in the database (postcode + UPRN known,
# no EPC lodged), plus its postcode cohort behind the faked EPC API.
# no EPC lodged), plus its postcode cohort behind the faked EPC API, plus the
# landlord overrides the finaliser resolved for it (House / Semi-Detached) that
# the real read adapter will translate into the gov-code space ("0" / "2").
with Session(db_engine) as session:
row = PropertyRow(
portfolio_id=1, postcode=_POSTCODE, address="1 Target Street", uprn=10000
@ -145,6 +145,28 @@ def test_epc_less_property_is_predicted_persisted_and_resolved_end_to_end(
property_id = row.id
assert property_id is not None
session.add(
PropertyOverrideRow(
property_id=property_id,
portfolio_id=1,
building_part=0,
override_component="property_type",
override_value="House",
original_spreadsheet_description="3-bed semi",
)
)
session.add(
PropertyOverrideRow(
property_id=property_id,
portfolio_id=1,
building_part=0,
override_component="built_form_type",
override_value="Semi-Detached",
original_spreadsheet_description="3-bed semi",
)
)
session.commit()
cohort_coords = {20000 + i: Coordinates(longitude=-1.55, latitude=53.81) for i in range(3)}
comparables_repo = EpcComparablePropertiesRepository(
_FakeCohortEpcClient(_cohort_results()), _FakeGeospatialRepo(cohort_coords)
@ -155,7 +177,9 @@ def test_epc_less_property_is_predicted_persisted_and_resolved_end_to_end(
geospatial_repo=_FakeGeospatialRepo({10000: Coordinates(longitude=-1.55, latitude=53.81)}),
solar_fetcher=_NoSolarFetcher(),
comparables_repo=comparables_repo,
prediction_attributes_reader=_FakeAttributesReader(),
prediction_attributes_reader=OverrideBackedPredictionAttributesReader(
PropertyOverridesPostgresReader(lambda: Session(db_engine))
),
epc_prediction=EpcPrediction(),
)