diff --git a/repositories/property/landlord_address_resolver.py b/repositories/property/landlord_address_resolver.py new file mode 100644 index 000000000..332f6b149 --- /dev/null +++ b/repositories/property/landlord_address_resolver.py @@ -0,0 +1,30 @@ +"""Resolves a property's display address from its `landlord_property_id` +(ADR-0060), for naming the folders in a Download Package. + +The address lives on the FE-owned `property` table (`uploaded_files` carries no +`property_id` — a known future gap). Addresses for the whole requested set are +loaded once at construction; `address_for` is then a lookup with a safe +fallback for a `landlord_property_id` that has no property row or address. +""" + +from __future__ import annotations + +from typing import Sequence + +from sqlalchemy import select +from sqlmodel import Session, col + +from infrastructure.postgres.property_table import PropertyRow + + +class LandlordAddressResolver: + _FALLBACK = "address unavailable" + + def __init__( + self, session: Session, landlord_property_ids: Sequence[str] + ) -> None: + self._session = session + self._ids = list(landlord_property_ids) + + def address_for(self, landlord_property_id: str) -> str: + raise NotImplementedError diff --git a/tests/repositories/property/test_landlord_address_resolver.py b/tests/repositories/property/test_landlord_address_resolver.py new file mode 100644 index 000000000..7dcbb98da --- /dev/null +++ b/tests/repositories/property/test_landlord_address_resolver.py @@ -0,0 +1,35 @@ +from collections.abc import Iterator + +import pytest +from sqlalchemy import Engine +from sqlmodel import Session + +from infrastructure.postgres.property_table import PropertyRow +from repositories.property.landlord_address_resolver import LandlordAddressResolver + + +@pytest.fixture +def session(db_engine: Engine) -> Iterator[Session]: + with Session(db_engine) as s: + yield s + + +def test_resolves_known_addresses_and_falls_back_for_unknowns( + session: Session, +) -> None: + # arrange — two properties with addresses; a third id has no property row. + session.add( + PropertyRow(portfolio_id=1, landlord_property_id="LP1", address="12 Oak Street") + ) + session.add( + PropertyRow(portfolio_id=1, landlord_property_id="LP2", address="9 Elm Road") + ) + session.flush() + + # act + resolver = LandlordAddressResolver(session, ["LP1", "LP2", "LP3"]) + + # assert + assert resolver.address_for("LP1") == "12 Oak Street" + assert resolver.address_for("LP2") == "9 Elm Road" + assert resolver.address_for("LP3") == "address unavailable"