diff --git a/backend/magic_plan/audit_script.py b/backend/magic_plan/audit_script.py index 202aa8ac..39ad2d44 100644 --- a/backend/magic_plan/audit_script.py +++ b/backend/magic_plan/audit_script.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from typing import Optional import openpyxl -from openpyxl.styles import Alignment, Font, PatternFill +from openpyxl.styles import Alignment, Border, Font, PatternFill, Side from openpyxl.worksheet.worksheet import Worksheet from datatypes.magicplan.domain.models import Plan @@ -85,6 +85,15 @@ def _build_rows(plan: Plan) -> list[AuditRow]: _BLANK_SEPARATOR_COLS = {5, 21} +_MEDIUM_RIGHT = Border(right=Side(style="medium")) +_SECTION_BOUNDARY_COLS = {4, 11, 15, 20} + + +def _apply_section_borders(ws: Worksheet, row: int) -> None: + for col in _SECTION_BOUNDARY_COLS: + ws.cell(row=row, column=col).border = _MEDIUM_RIGHT + + def _write_headers(ws: Worksheet) -> None: # Row 1: group labels (merged) _merge_bold_fill(ws, 1, 1, 1, 4, "Room") diff --git a/backend/magic_plan/tests/test_audit_script.py b/backend/magic_plan/tests/test_audit_script.py index 8e966561..e7160eb7 100644 --- a/backend/magic_plan/tests/test_audit_script.py +++ b/backend/magic_plan/tests/test_audit_script.py @@ -1,6 +1,6 @@ import openpyxl from datatypes.magicplan.domain.models import Door, Floor, Plan, Room, Window -from backend.magic_plan.audit_script import AuditRow, _build_rows, _write_headers +from backend.magic_plan.audit_script import AuditRow, _apply_section_borders, _build_rows, _write_headers def test_build_rows_opening_and_trickle_vent_fields_are_none() -> None: @@ -260,3 +260,19 @@ def test_write_headers_two_rows_correct_labels_and_column_positions() -> None: assert ws.cell(row=2, column=13).value == "Opening Width m" assert ws.cell(row=2, column=14).value == "Opening Height m" assert ws.cell(row=2, column=15).value == "Total Area m²" + + +def test_apply_section_borders_sets_medium_right_border_on_boundary_columns() -> None: + # Arrange + wb = openpyxl.Workbook() + ws = wb.active # type: ignore[assignment] + + # Act + _apply_section_borders(ws, 1) + + # Assert — medium right-border on last col of each subtable + for col in (4, 11, 15, 20): + assert ws.cell(row=1, column=col).border.right.style == "medium", f"col {col}" + # Assert — non-boundary columns are untouched + for col in (1, 6, 12, 22): + assert ws.cell(row=1, column=col).border.right.style is None, f"col {col}"