From 3960998feef8d97c683cc604fdfe09b25a3dea55 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 16 Apr 2026 14:11:44 +0000 Subject: [PATCH] =?UTF-8?q?Load=20RoofSpace=20from=20SiteNotes=20JSON=20?= =?UTF-8?q?=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/documents_parser/extractor.py | 6 ++ .../documents_parser/tests/test_extractor.py | 55 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/backend/documents_parser/extractor.py b/backend/documents_parser/extractor.py index fc2ca2ac..376aa0da 100644 --- a/backend/documents_parser/extractor.py +++ b/backend/documents_parser/extractor.py @@ -6,12 +6,15 @@ from datatypes.epc.surveys.pashub_rdsap_site_notes import ( BuildingMeasurements, ExtensionConstruction, ExtensionMeasurements, + ExtensionRoofSpace, FloorConstruction, FloorMeasurement, General, MainBuildingConstruction, MainBuildingMeasurements, PasHubRdSapSiteNotes, + RoofSpace, + RoofSpaceDetail, ) @@ -224,6 +227,9 @@ class PasHubRdSapSiteNotesExtractor: extensions=extensions if extensions else None, ) + def extract_roof_space(self) -> RoofSpace: + raise NotImplementedError + def _parse_floor_measurements(self, data: List[str]) -> List[FloorMeasurement]: floors = [] i = 0 diff --git a/backend/documents_parser/tests/test_extractor.py b/backend/documents_parser/tests/test_extractor.py index becb6ae3..0061e436 100644 --- a/backend/documents_parser/tests/test_extractor.py +++ b/backend/documents_parser/tests/test_extractor.py @@ -9,12 +9,15 @@ from datatypes.epc.surveys.pashub_rdsap_site_notes import ( BuildingMeasurements, ExtensionConstruction, ExtensionMeasurements, + ExtensionRoofSpace, FloorConstruction, FloorMeasurement, General, MainBuildingConstruction, MainBuildingMeasurements, PasHubRdSapSiteNotes, + RoofSpace, + RoofSpaceDetail, ) FIXTURES = os.path.join(os.path.dirname(__file__), "fixtures") @@ -237,3 +240,55 @@ class TestBuildingMeasurements: ) ], ) + + +class TestRoofSpace: + @pytest.fixture + def roof_space(self) -> RoofSpace: + return PasHubRdSapSiteNotesExtractor(load_text_fixture()).extract_roof_space() + + def test_main_building_insulation_thickness_mm( + self, roof_space: RoofSpace + ) -> None: + assert roof_space.main_building.insulation_thickness_mm == 100 + + def test_main_building_insulation_thickness_string_absent( + self, roof_space: RoofSpace + ) -> None: + assert roof_space.main_building.insulation_thickness is None + + def test_main_building_rooms_in_roof(self, roof_space: RoofSpace) -> None: + assert roof_space.main_building.rooms_in_roof is False + + def test_main_building_roof_u_value_known(self, roof_space: RoofSpace) -> None: + assert roof_space.main_building.roof_u_value_known is False + + def test_extension_uses_string_thickness(self, roof_space: RoofSpace) -> None: + assert roof_space.extensions is not None + assert roof_space.extensions[0].insulation_thickness == "As built" + assert roof_space.extensions[0].insulation_thickness_mm is None + + def test_full_roof_space(self, roof_space: RoofSpace) -> None: + assert roof_space == RoofSpace( + main_building=RoofSpaceDetail( + construction_type="Pitched roof (Slates or tiles), Access to loft", + insulation_at="Joists", + roof_u_value_known=False, + cavity_wall_construction_indicators="cavity visible in roof space", + rooms_in_roof=False, + insulation_thickness_mm=100, + insulation_thickness=None, + ), + extensions=[ + ExtensionRoofSpace( + id=1, + construction_type="Pitched roof, Sloping ceiling", + insulation_at="Sloping ceiling insulation", + roof_u_value_known=False, + cavity_wall_construction_indicators="No indicator of construction visible", + rooms_in_roof=False, + insulation_thickness_mm=None, + insulation_thickness="As built", + ) + ], + )