Model/tests/repositories/property/test_property_overrides_postgres_reader.py
Jun-te Kim c5cffd9047 Read a Property's resolved landlord overrides as a faithful value-space snapshot 🟩
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 15:14:53 +00:00

117 lines
3.6 KiB
Python

"""Integration tests for the ``property_overrides`` read adapter.
The reader is *faithful*: it returns the resolved enum-value snapshots exactly
as the finaliser wrote them, every ``(override_component, building_part)`` for
the Property, with no translation or gating. Verified against a real Postgres
(the ``db_engine`` fixture) because the value is in reading what was actually
persisted.
"""
from __future__ import annotations
from sqlalchemy import Engine
from sqlmodel import Session
from infrastructure.postgres.property_override_table import PropertyOverrideRow
from repositories.property.property_overrides_postgres_reader import (
PropertyOverridesPostgresReader,
)
def _seed(
session: Session,
*,
override_component: str,
override_value: str,
property_id: int = 1,
portfolio_id: int = 1,
building_part: int = 0,
) -> None:
row = PropertyOverrideRow(
property_id=property_id,
portfolio_id=portfolio_id,
building_part=building_part,
override_component=override_component,
override_value=override_value,
original_spreadsheet_description="detached house",
)
session.add(row)
def test_reads_a_resolved_override_in_value_space(db_engine: Engine) -> None:
# Arrange — the finaliser wrote one property_type override for the Property.
with Session(db_engine) as session:
_seed(
session,
property_id=42,
override_component="property_type",
override_value="House",
)
session.commit()
reader = PropertyOverridesPostgresReader(lambda: Session(db_engine))
# Act
resolved = reader.overrides_for(42)
# Assert — the stored enum value, untranslated.
assert resolved.value("property_type", 0) == "House"
def test_returns_every_component_and_building_part_for_the_property(
db_engine: Engine,
) -> None:
# Arrange — three overrides across two building parts for the target Property,
# plus an override for a *different* Property that must not leak in.
with Session(db_engine) as session:
_seed(
session,
property_id=7,
building_part=0,
override_component="property_type",
override_value="House",
)
_seed(
session,
property_id=7,
building_part=0,
override_component="built_form_type",
override_value="Detached",
)
_seed(
session,
property_id=7,
building_part=1,
override_component="wall_type",
override_value="Solid brick, with internal insulation",
)
_seed(
session,
property_id=8,
override_component="property_type",
override_value="Flat",
)
session.commit()
reader = PropertyOverridesPostgresReader(lambda: Session(db_engine))
# Act
resolved = reader.overrides_for(7)
# Assert — all three of the Property's rows, faithfully; none from Property 8.
assert len(resolved.rows) == 3
assert resolved.value("property_type", 0) == "House"
assert resolved.value("built_form_type", 0) == "Detached"
assert resolved.value("wall_type", 1) == "Solid brick, with internal insulation"
def test_property_without_overrides_reads_empty(db_engine: Engine) -> None:
# Arrange — nothing seeded for this Property.
reader = PropertyOverridesPostgresReader(lambda: Session(db_engine))
# Act
resolved = reader.overrides_for(999)
# Assert
assert resolved.rows == ()
assert resolved.value("property_type", 0) is None