diff --git a/backend/condition/parsing/lbwf_parser.py b/backend/condition/parsing/lbwf_parser.py index b0c233d3..7404189f 100644 --- a/backend/condition/parsing/lbwf_parser.py +++ b/backend/condition/parsing/lbwf_parser.py @@ -1,6 +1,7 @@ from typing import BinaryIO, Any from backend.condition.parsing.parser import Parser +from backend.condition.parsing.records.lbwf_property_condition import LbwfPropertyCondition class LbwfParser(Parser): diff --git a/backend/condition/parsing/records/lbwf_property_condition.py b/backend/condition/parsing/records/lbwf_property_condition.py new file mode 100644 index 00000000..1ecd00d6 --- /dev/null +++ b/backend/condition/parsing/records/lbwf_property_condition.py @@ -0,0 +1,27 @@ +from dataclasses import dataclass +from datetime import date + + +@dataclass +class LbwfPropertyCondition: + uprn: int + prop_ref: int + domna: int + address: str + ownership: str + prop_status: str + prop_type: str # TODO: make this enum? + prop_sub_type: str # TODO: make this enum? + element_group: str + element_code: str + element_code_description: str + attribute_code: str + attribute_code_description: str + element_date_value: str | None = None + element_numerical_value: int | None = None + element_text_value: str | None = None + quantity: int | None = None + install_date: date | None = None + remaining_life: int | None = None + element_comments: str | None = None + diff --git a/backend/condition/processor.py b/backend/condition/processor.py index c4dcabc2..f19c4257 100644 --- a/backend/condition/processor.py +++ b/backend/condition/processor.py @@ -1,12 +1,15 @@ from typing import BinaryIO, List +from backend.condition.parsing.parser import Parser from utils.logger import setup_logger -from backend.condition.file_type import FileType +from backend.condition.file_type import FileType, detect_file_type +from backend.condition.parsing.factory import select_parser def process_file(file_stream: BinaryIO, source_key: str) -> None: print(f"[processor] Received file: {source_key}") # Instantiation - + file_type: FileType = detect_file_type(source_key) + parser: Parser = select_parser(file_type) # Orchestration diff --git a/backend/condition/tests/parsing/test_lbwf_parser.py b/backend/condition/tests/parsing/test_lbwf_parser.py new file mode 100644 index 00000000..f7a7d162 --- /dev/null +++ b/backend/condition/tests/parsing/test_lbwf_parser.py @@ -0,0 +1,120 @@ +from typing import Any +import pytest +from io import BytesIO +from openpyxl import Workbook +from datetime import datetime +import debugpy + +from backend.condition.parsing.lbwf_parser import LbwfParser +from backend.condition.parsing.records.lbwf_property_condition import LbwfPropertyCondition + +@pytest.fixture +def lbwf_homes_xlsx_bytes() -> BytesIO: + wb = Workbook() + houses_asset_data = wb.active + houses_asset_data.title = "Houses Asset Data" + houses_asset_data.append([ + "PROP REF", + "Domna", + "ADDRESS", + "OWNERSHIP", + "PROP STATUS", + "PROP TYPE", + "PROP SUB TYPE", + "ELEMENT GROUP", + "ELEMENT CODE", + "ELEMENT CODE DESCRIPTION", + "ATTRIBUTE CODE", + "ATTRIBUTE CODE DESCRIPTION", + "ELEMENT DATE VALUE", + "ELEMENT NUMERIC VALUE", + "ELEMENT TEXT VALUE", + "QUANTITY", + "INSTALL DATE", + "REMAINING LIFE", + "ELEMENT COMMENTS" + ] + ) + houses_asset_data.append([ + 12345, + 12345, + "123 Fake Street, London, A10 1AB", + "LBWF_OWNED", + "OCCP", + "HOU", + "TERRACED", + "ASSETS", + "AHR_CAT", + "Accessible Housing Register Category", + "F", + "General Needs", + None, + None, + None, + 1, + None, + None, + None, + ]) + houses_asset_data.append([ + 54321, + 54321, + "100 Random Road, London, A10 1AB", + "LBWF_OWNED", + "OCCP", + "HOU", + "EOT", + "ASSETS", + "INTSMKDET", + "Smoke Detectors in Property", + "HARDWRDMNS", + "Hard Wired Mains Smoke Alarm in Property", + None, + None, + None, + 2, + datetime(2019,4,1), + 4, + "Source of Data = Joe Bloggs", + ]) + + all_energy_breakdown = wb.create_sheet("All Energy Breakdown") + all_energy_breakdown.append([ + "UPRN", + "Organisation Reference", + "Alternate Organisation Reference", + "Address", + "Postcode" + ]) + all_energy_breakdown.append([ + 1, + 100, + 101, + "100 RANDOM ROAD", + "A10 1AB" + ]) + all_energy_breakdown.append([ + 2, + 200, + None, + "123 FAKE STREET", + "A10 1AB" + ]) + + stream = BytesIO() + wb.save(stream) + stream.seek(0) + + return stream + +def test_lbwf_parser_passes_houses(lbwf_homes_xlsx_bytes): + debugpy.wait_for_client() + # arrange + parser = LbwfParser() + + # act + result: Any = parser.parse(lbwf_homes_xlsx_bytes) + + # assert + assert len(result) == 2 + assert isinstance(result[0], LbwfPropertyCondition) # TODO: Improve these asserts \ No newline at end of file