mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
214 lines
5 KiB
Python
214 lines
5 KiB
Python
import pytest
|
|
|
|
from backend.addresses.Addresses import Addresses
|
|
|
|
|
|
# -------------------------
|
|
# Helpers
|
|
# -------------------------
|
|
|
|
class AraBody:
|
|
file_format = "ara_property_list"
|
|
|
|
|
|
class LegacyBody:
|
|
file_format = "legacy"
|
|
|
|
|
|
# -------------------------
|
|
# ARA FORMAT TESTS
|
|
# -------------------------
|
|
|
|
def test_parse_ara_row_valid():
|
|
row = {
|
|
"uprn": "123",
|
|
"address_1": "10 Downing St",
|
|
"full_address": "10 Downing St, London",
|
|
"postcode": "SW1A 2AA",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], AraBody())
|
|
|
|
assert len(addresses) == 1
|
|
addr = addresses[0]
|
|
|
|
assert addr.uprn == 123
|
|
assert addr.address_1 == "10 Downing St"
|
|
assert addr.full_address == "10 Downing St, London"
|
|
assert addr.postcode == "SW1A 2AA"
|
|
|
|
|
|
def test_parse_ara_row_optional_fields():
|
|
row = {
|
|
"uprn": "456",
|
|
"address_1": "Flat 2",
|
|
"full_address": "Flat 2, Test House",
|
|
"postcode": "AB1 2CD",
|
|
"landlord_property_id": "ABC123",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], AraBody())
|
|
addr = addresses[0]
|
|
|
|
assert addr.uprn == 456
|
|
assert addr.landlord_property_id == "ABC123"
|
|
|
|
|
|
# -------------------------
|
|
# LEGACY FORMAT TESTS
|
|
# -------------------------
|
|
|
|
def test_parse_legacy_basic():
|
|
row = {
|
|
"landlord_property_id": 144002000000,
|
|
"address": "15 Rosebank Hall Angle Terrace",
|
|
"postcode": "NE28 7BQ",
|
|
"ordnance_survey_uprn": 47002793,
|
|
"property_type": "Bungalow",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], LegacyBody())
|
|
addr = addresses[0]
|
|
|
|
assert addr.uprn == 47002793
|
|
assert addr.address_1 == "15 Rosebank Hall Angle Terrace"
|
|
assert addr.postcode == "NE28 7BQ"
|
|
assert addr.landlord_property_type == "Bungalow"
|
|
|
|
|
|
def test_legacy_uses_domna_address_if_missing_address():
|
|
row = {
|
|
"domna_address_1": "Domna Address",
|
|
"postcode": "AA1 1AA",
|
|
"ordnance_survey_uprn": 123456,
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], LegacyBody())
|
|
addr = addresses[0]
|
|
|
|
assert addr.address_1 == "Domna Address"
|
|
|
|
|
|
def test_legacy_full_address_fallback():
|
|
row = {
|
|
"address": "Fallback Address",
|
|
"postcode": "ZZ1 1ZZ",
|
|
"ordnance_survey_uprn": 999,
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], LegacyBody())
|
|
addr = addresses[0]
|
|
|
|
assert addr.full_address == "Fallback Address"
|
|
|
|
|
|
# -------------------------
|
|
# UPRN HANDLING
|
|
# -------------------------
|
|
|
|
def test_uprn_from_float_string():
|
|
row = {
|
|
"uprn": "123.0",
|
|
"address": "Test Address",
|
|
"postcode": "AA1 1AA",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], LegacyBody())
|
|
assert addresses[0].uprn == 123
|
|
|
|
|
|
def test_uprn_fallback_to_os_uprn():
|
|
row = {
|
|
"uprn": None,
|
|
"ordnance_survey_uprn": 555,
|
|
"address": "Test Address",
|
|
"postcode": "AA1 1AA",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], LegacyBody())
|
|
assert addresses[0].uprn == 555
|
|
|
|
|
|
def test_missing_uprn_is_none():
|
|
row = {
|
|
"address": "No UPRN Address",
|
|
"postcode": "BB1 1BB",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], LegacyBody())
|
|
assert addresses[0].uprn is None
|
|
|
|
|
|
# -------------------------
|
|
# FALLBACK LOGIC
|
|
# -------------------------
|
|
|
|
def test_fallback_to_legacy_when_ara_fails():
|
|
"""
|
|
If ARA parser fails (missing required fields),
|
|
system should fallback to legacy parser.
|
|
"""
|
|
row = {
|
|
"address": "Fallback Address",
|
|
"postcode": "ZZ1 1ZZ",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], AraBody())
|
|
addr = addresses[0]
|
|
|
|
assert addr.address_1 == "Fallback Address"
|
|
|
|
|
|
# -------------------------
|
|
# VALIDATION
|
|
# -------------------------
|
|
|
|
def test_validate_uprn_rejects_invalid():
|
|
row = {
|
|
"uprn": "not_a_number",
|
|
"address_1": "Test",
|
|
"full_address": "Test",
|
|
"postcode": "AA1 1AA",
|
|
}
|
|
|
|
with pytest.raises(ValueError):
|
|
Addresses.from_plan_input([row], AraBody())
|
|
|
|
|
|
# -------------------------
|
|
# COLLECTION METHODS
|
|
# -------------------------
|
|
|
|
def test_get_uprns():
|
|
rows = [
|
|
{"uprn": "1", "address_1": "A", "full_address": "A", "postcode": "AA"},
|
|
{"uprn": "2", "address_1": "B", "full_address": "B", "postcode": "BB"},
|
|
]
|
|
|
|
addresses = Addresses.from_plan_input(rows, AraBody())
|
|
assert addresses.get_uprns() == [1, 2]
|
|
|
|
|
|
def test_get_unique_postcodes():
|
|
rows = [
|
|
{"uprn": "1", "address_1": "A", "full_address": "A", "postcode": "AA"},
|
|
{"uprn": "2", "address_1": "B", "full_address": "B", "postcode": "AA"},
|
|
]
|
|
|
|
addresses = Addresses.from_plan_input(rows, AraBody())
|
|
assert addresses.get_unique_postcodes() == ["AA"]
|
|
|
|
|
|
def test_get_property_requests():
|
|
row = {
|
|
"uprn": "123",
|
|
"address_1": "10 Downing St",
|
|
"full_address": "10 Downing St",
|
|
"postcode": "SW1A 2AA",
|
|
}
|
|
|
|
addresses = Addresses.from_plan_input([row], AraBody())
|
|
request = addresses.get_property_requests()[0]
|
|
|
|
assert request["uprn"] == 123
|
|
assert request["postcode"] == "SW1A 2AA"
|