From 592f9247611a0ba4fbecce4343e0e631209f9d57 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 6 Jul 2026 08:28:40 +0000 Subject: [PATCH] =?UTF-8?q?An=20expired-source=20EPC=20occupies=20the=20pr?= =?UTF-8?q?edicted=20slot=20without=20stranding=20rows=20=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .../epc/test_epc_predicted_slot.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/repositories/epc/test_epc_predicted_slot.py b/tests/repositories/epc/test_epc_predicted_slot.py index 7fc2abd24..e8f6ac6b7 100644 --- a/tests/repositories/epc/test_epc_predicted_slot.py +++ b/tests/repositories/epc/test_epc_predicted_slot.py @@ -80,3 +80,47 @@ def test_a_lodged_only_property_has_no_predicted_epc(db_engine: Engine) -> None: repo = EpcPostgresRepository(session) assert repo.get_predicted_for_property(9) is None assert repo.get_for_property(9) == epc + + +def test_an_expired_source_epc_lives_in_the_predicted_slot(db_engine: Engine) -> None: + # Arrange — an Expired-Enhanced Prediction is persisted with source="expired" + # (ADR-0054): enhanced by an expired historic observation, not totally + # predicted — but it occupies the same predicted slot. + epc = _epc() + with Session(db_engine) as session: + repo = EpcPostgresRepository(session) + repo.save(epc, property_id=11, source="expired") + session.commit() + + # Act / Assert — readable through the predicted slot; the lodged slot is empty. + with Session(db_engine) as session: + repo = EpcPostgresRepository(session) + assert repo.get_predicted_for_property(11) == epc + assert repo.get_predicted_for_properties([11]) == {11: epc} + assert repo.get_for_property(11) is None + + +def test_saving_predicted_over_expired_replaces_the_slot_without_stranding( + db_engine: Engine, +) -> None: + # Arrange — a re-ingestion can flip the slot's flavour (expired -> predicted + # or back); the slot holds ONE row, never a stranded stale sibling. + from sqlmodel import select + + from infrastructure.postgres.epc_property_table import EpcPropertyModel + + epc = _epc() + with Session(db_engine) as session: + repo = EpcPostgresRepository(session) + repo.save(epc, property_id=13, source="expired") + repo.save(epc, property_id=13, source="predicted") + session.commit() + + # Act + with Session(db_engine) as session: + rows = session.exec( + select(EpcPropertyModel).where(EpcPropertyModel.property_id == 13) + ).all() + + # Assert — exactly one slot row remains, the latest flavour. + assert [r.source for r in rows] == ["predicted"]