mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
129 lines
3.4 KiB
Python
129 lines
3.4 KiB
Python
from datatypes.magicplan.api.response import PlanSummary
|
|
from backend.magic_plan.address_matcher import find_matching_plan, _extract_postcode
|
|
|
|
|
|
def _make_plan(
|
|
plan_id: str,
|
|
street: str | None = None,
|
|
street_number: str | None = None,
|
|
postal_code: str | None = None,
|
|
) -> PlanSummary:
|
|
return PlanSummary.model_validate(
|
|
{
|
|
"id": plan_id,
|
|
"name": f"Plan {plan_id}",
|
|
"address": {
|
|
"street": street,
|
|
"street_number": street_number,
|
|
"postal_code": postal_code,
|
|
},
|
|
}
|
|
)
|
|
|
|
|
|
# --- _extract_postcode ---
|
|
|
|
|
|
def test_extract_postcode_standard_format() -> None:
|
|
assert _extract_postcode("2 Laburnum Way Bromley BR2 8BZ") == "BR28BZ"
|
|
|
|
|
|
def test_extract_postcode_no_space_in_postcode() -> None:
|
|
assert _extract_postcode("123 High St London SW1A1AA") == "SW1A1AA"
|
|
|
|
|
|
def test_extract_postcode_lowercase_input() -> None:
|
|
assert _extract_postcode("2 laburnum way br2 8bz") == "BR28BZ"
|
|
|
|
|
|
def test_extract_postcode_none_when_absent() -> None:
|
|
assert _extract_postcode("123 High Street London") is None
|
|
|
|
|
|
def test_extract_postcode_none_for_empty_string() -> None:
|
|
assert _extract_postcode("") is None
|
|
|
|
|
|
# --- find_matching_plan ---
|
|
|
|
|
|
PLAN_A = _make_plan(
|
|
"plan-a", street="Laburnum Way", street_number="2", postal_code="BR2 8BZ"
|
|
)
|
|
PLAN_B = _make_plan(
|
|
"plan-b", street="Station Road", street_number="11", postal_code="BR1 3LP"
|
|
)
|
|
|
|
|
|
def test_find_matching_plan_returns_match() -> None:
|
|
# Arrange
|
|
plans = [PLAN_A, PLAN_B]
|
|
# Act
|
|
result = find_matching_plan(plans, "2 Laburnum Way Bromley BR2 8BZ")
|
|
# Assert
|
|
assert result is not None
|
|
assert result.id == "plan-a"
|
|
|
|
|
|
def test_find_matching_plan_postcode_mismatch_returns_none() -> None:
|
|
# Arrange
|
|
plans = [PLAN_A]
|
|
# Act
|
|
result = find_matching_plan(plans, "2 Laburnum Way Bromley SW1A 1AA")
|
|
# Assert
|
|
assert result is None
|
|
|
|
|
|
def test_find_matching_plan_street_mismatch_returns_none() -> None:
|
|
# Arrange
|
|
plans = [PLAN_A]
|
|
# Act
|
|
result = find_matching_plan(plans, "99 Other Road Bromley BR2 8BZ")
|
|
# Assert
|
|
assert result is None
|
|
|
|
|
|
def test_find_matching_plan_empty_list_returns_none() -> None:
|
|
# Act
|
|
result = find_matching_plan([], "2 Laburnum Way Bromley BR2 8BZ")
|
|
# Assert
|
|
assert result is None
|
|
|
|
|
|
def test_find_matching_plan_postcode_with_no_space_in_address() -> None:
|
|
# Arrange - address has postcode without internal space
|
|
plans = [PLAN_A]
|
|
# Act
|
|
result = find_matching_plan(plans, "2 Laburnum Way Bromley BR28BZ")
|
|
# Assert
|
|
assert result is not None
|
|
assert result.id == "plan-a"
|
|
|
|
|
|
def test_find_matching_plan_plan_postcode_with_no_space() -> None:
|
|
# Arrange - plan has postcode without space
|
|
plan = _make_plan(
|
|
"plan-c", street="Laburnum Way", street_number="2", postal_code="BR28BZ"
|
|
)
|
|
# Act
|
|
result = find_matching_plan([plan], "2 Laburnum Way Bromley BR2 8BZ")
|
|
# Assert
|
|
assert result is not None
|
|
assert result.id == "plan-c"
|
|
|
|
|
|
def test_find_matching_plan_no_postcode_in_address_returns_none() -> None:
|
|
# Act
|
|
result = find_matching_plan([PLAN_A], "2 Laburnum Way Bromley")
|
|
# Assert
|
|
assert result is None
|
|
|
|
|
|
def test_find_matching_plan_second_plan_matches() -> None:
|
|
# Arrange
|
|
plans = [PLAN_A, PLAN_B]
|
|
# Act
|
|
result = find_matching_plan(plans, "11 Station Road Bromley BR1 3LP")
|
|
# Assert
|
|
assert result is not None
|
|
assert result.id == "plan-b"
|