From 4427b58a44c8878a7b1021f38647776eab115f3d Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sun, 24 May 2026 22:15:47 +0000 Subject: [PATCH] Slice 54: Elmhurst mapper sets extensions_count from len(survey.extensions) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `from_elmhurst_site_notes` hard-coded `extensions_count=0` regardless of how many extensions the survey lodged. The 6 cohort certs from Slices 47-53 all happened to have 0-2 extensions whose count nothing load-bearing read, so this latent bug was invisible. Cert 001479 (Summary_001479.pdf, GOV.UK EPB cert 0535-9020-6509-0821-6222) has Main + Extension 1 + Extension 2 and is the first cohort cert with a real API counterpart — accurate `extensions_count` becomes load-bearing the moment the cross-mapper parity assertion compares API vs Elmhurst EpcPropertyData side by side. No SAP-cascade impact (the cascade iterates `sap_building_parts`, not `extensions_count`) — but a real data-integrity bug surfaced by the cross-mapper diff. Adds Summary_001479.pdf as a new chain-test fixture and `_SUMMARY_001479_PDF` constant for follow-up slices that will land per-bp ages, exposed floors, secondary-heating SAP codes, etc. All 9 chain tests green; 321 mapper/site-notes/rdsap tests green; pyright net-zero (35-error baseline preserved on mapper.py). Co-Authored-By: Claude Opus 4.7 --- .../tests/fixtures/Summary_001479.pdf | Bin 0 -> 93875 bytes .../tests/test_summary_pdf_mapper_chain.py | 19 ++++++++++++++++++ datatypes/epc/domain/mapper.py | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 backend/documents_parser/tests/fixtures/Summary_001479.pdf diff --git a/backend/documents_parser/tests/fixtures/Summary_001479.pdf b/backend/documents_parser/tests/fixtures/Summary_001479.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a84bffbf559ece218504fb1262319abef4d50b0 GIT binary patch literal 93875 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 Nzba5;37NjN^d@Vdlcy_yzaO^!9s!V8quoFNh1R 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 W)U$W|wTmH~99$4oT3RvrSN{b}&QT5k literal 0 HcmV?d00001 diff --git a/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py b/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py index 61848a2b..539ced6f 100644 --- a/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py +++ b/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py @@ -44,6 +44,7 @@ _SUMMARY_000480_PDF = _FIXTURES / "Summary_000480.pdf" _SUMMARY_000487_PDF = _FIXTURES / "Summary_000487.pdf" _SUMMARY_000490_PDF = _FIXTURES / "Summary_000490.pdf" _SUMMARY_000516_PDF = _FIXTURES / "Summary_000516.pdf" +_SUMMARY_001479_PDF = _FIXTURES / "Summary_001479.pdf" def _summary_pdf_to_textract_style_pages(pdf_path: Path) -> list[str]: @@ -249,3 +250,21 @@ def test_summary_000490_full_chain_sap_matches_worksheet_pdf_exactly() -> None: # Assert worksheet_unrounded_sap = 57.3979 assert abs(result.sap_score_continuous - worksheet_unrounded_sap) < 1e-4 + + +def test_summary_001479_mapper_extensions_count_matches_extension_bps() -> None: + # Arrange — cert 0535-9020-6509-0821-6222 (Summary_001479) is the first + # cohort cert with an actual GOV.UK API counterpart. Worksheet PDF + # lodges Main + Extension 1 + Extension 2 (3 building parts, 2 + # extensions). Pre-slice the Elmhurst mapper hard-coded + # `extensions_count=0` regardless of survey.extensions; this asserts + # the count flows through. + pages = _summary_pdf_to_textract_style_pages(_SUMMARY_001479_PDF) + site_notes = ElmhurstSiteNotesExtractor(pages).extract() + + # Act + epc = EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) + + # Assert + assert epc.extensions_count == 2 + assert len(epc.sap_building_parts) == 3 diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index 6f82123c..1dda5e4f 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -309,7 +309,7 @@ class EpcPropertyDataMapper: has_hot_water_cylinder=survey.water_heating.hot_water_cylinder_present, has_fixed_air_conditioning=survey.ventilation.fixed_space_cooling, wet_rooms_count=0, - extensions_count=0, + extensions_count=len(survey.extensions), heated_rooms_count=survey.heated_habitable_rooms, open_chimneys_count=survey.ventilation.open_chimneys_count, habitable_rooms_count=survey.habitable_rooms,