diff --git a/backend/magic_plan/tests/test_audit_script.py b/backend/magic_plan/tests/test_audit_script.py index 9c39edb6..e41ac0d3 100644 --- a/backend/magic_plan/tests/test_audit_script.py +++ b/backend/magic_plan/tests/test_audit_script.py @@ -11,3 +11,191 @@ def test_build_rows_empty_plan_returns_empty_list() -> None: # Assert assert rows == [] + + +def test_build_rows_single_room_no_windows_or_doors() -> None: + # Arrange + plan = Plan( + uid="x", + name=None, + floors=[ + Floor(level=0, name=None, rooms=[ + Room(name="Hall", width_m=2.0, length_m=3.0, area_m2=6.0), + ]), + ], + ) + + # Act + rows: list[AuditRow] = _build_rows(plan) + + # Assert — separator + one data row + assert len(rows) == 2 + separator, data = rows + assert separator.floor_level == 0 + assert data.room_name == "Hall" + assert data.room_width_m == 2.0 + assert data.room_length_m == 3.0 + assert data.room_area_m2 == 6.0 + assert data.window_label is None + assert data.door_location is None + + +def test_build_rows_room_with_more_windows_than_doors() -> None: + # Arrange — 2 windows, 1 door → 2 data rows; room columns blank on row 2 + plan = Plan( + uid="x", + name=None, + floors=[ + Floor(level=0, name=None, rooms=[ + Room( + name="Lounge", + width_m=4.0, + length_m=5.0, + area_m2=20.0, + windows=[ + Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="side_hung"), + Window(width_m=0.8, height_m=1.0, area_m2=0.8, opening_type="top_hung"), + ], + doors=[Door(width_mm=762.0)], + ), + ]), + ], + ) + + # Act + rows: list[AuditRow] = _build_rows(plan) + + # Assert + data_rows = [r for r in rows if r.floor_level is None] + assert len(data_rows) == 2 + # row 0 carries room columns + assert data_rows[0].room_name == "Lounge" + assert data_rows[0].window_label == "W1" + assert data_rows[0].door_location == "Lounge" + # row 1 room columns are blank + assert data_rows[1].room_name is None + assert data_rows[1].window_label == "W2" + assert data_rows[1].door_location is None + + +def test_build_rows_room_with_more_doors_than_windows() -> None: + # Arrange — 1 window, 2 doors → 2 data rows + plan = Plan( + uid="x", + name=None, + floors=[ + Floor(level=0, name=None, rooms=[ + Room( + name="Bedroom", + width_m=3.5, + length_m=4.0, + area_m2=14.0, + windows=[Window(width_m=1.2, height_m=1.0, area_m2=1.2, opening_type="side_hung")], + doors=[Door(width_mm=762.0), Door(width_mm=686.0)], + ), + ]), + ], + ) + + # Act + rows: list[AuditRow] = _build_rows(plan) + + # Assert + data_rows = [r for r in rows if r.floor_level is None] + assert len(data_rows) == 2 + assert data_rows[0].window_label == "W1" + assert data_rows[0].door_width_mm == 762.0 + assert data_rows[1].window_label is None + assert data_rows[1].door_width_mm == 686.0 + + +def test_build_rows_floor_separator_precedes_rooms() -> None: + # Arrange + plan = Plan( + uid="x", + name=None, + floors=[ + Floor(level=0, name=None, rooms=[ + Room(name="Room A", width_m=1.0, length_m=1.0, area_m2=1.0), + ]), + Floor(level=1, name=None, rooms=[ + Room(name="Room B", width_m=1.0, length_m=1.0, area_m2=1.0), + ]), + ], + ) + + # Act + rows: list[AuditRow] = _build_rows(plan) + + # Assert — rows in order: sep(0), data, sep(1), data + assert rows[0].floor_level == 0 + assert rows[1].room_name == "Room A" + assert rows[2].floor_level == 1 + assert rows[3].room_name == "Room B" + + +def test_build_rows_window_labels_sequential_across_floors() -> None: + # Arrange — two floors, one window each; labels must be W1, W2 (no reset) + plan = Plan( + uid="x", + name=None, + floors=[ + Floor(level=0, name=None, rooms=[ + Room( + name="Ground Room", + width_m=1.0, + length_m=1.0, + area_m2=1.0, + windows=[Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="side_hung")], + ), + ]), + Floor(level=1, name=None, rooms=[ + Room( + name="First Room", + width_m=1.0, + length_m=1.0, + area_m2=1.0, + windows=[Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="top_hung")], + ), + ]), + ], + ) + + # Act + rows: list[AuditRow] = _build_rows(plan) + + # Assert + labels = [r.window_label for r in rows if r.window_label is not None] + assert labels == ["W1", "W2"] + + +def test_build_rows_room_name_in_location_on_every_row() -> None: + # Arrange — room with 2 windows and 2 doors + plan = Plan( + uid="x", + name=None, + floors=[ + Floor(level=0, name=None, rooms=[ + Room( + name="Kitchen", + width_m=3.0, + length_m=3.0, + area_m2=9.0, + windows=[ + Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="side_hung"), + Window(width_m=0.8, height_m=1.0, area_m2=0.8, opening_type="top_hung"), + ], + doors=[Door(width_mm=762.0), Door(width_mm=686.0)], + ), + ]), + ], + ) + + # Act + rows: list[AuditRow] = _build_rows(plan) + + # Assert — every data row carries "Kitchen" in location fields + data_rows = [r for r in rows if r.floor_level is None] + for row in data_rows: + assert row.window_location == "Kitchen" + assert row.door_location == "Kitchen"