diff --git a/backend/app/db/functions/tests/test_magic_plan_functions.py b/backend/app/db/functions/tests/test_magic_plan_functions.py index 024ed5d7..749fc2b7 100644 --- a/backend/app/db/functions/tests/test_magic_plan_functions.py +++ b/backend/app/db/functions/tests/test_magic_plan_functions.py @@ -1,5 +1,6 @@ import json from pathlib import Path +from typing import Optional import pytest from sqlalchemy import func, select @@ -8,7 +9,7 @@ from sqlmodel import SQLModel from datatypes.magicplan.api.response import MagicPlanPlan from datatypes.magicplan.domain.mapper import map_plan -from datatypes.magicplan.domain.models import Plan +from datatypes.magicplan.domain.models import Door, Floor, Plan, Room, Window from backend.app.db.functions.magic_plan_functions import ( get_plan_by_uploaded_file_id, @@ -100,11 +101,95 @@ def test_save_plan_idempotent(db_session: Session, domain_plan: Plan) -> None: def test_get_plan_returns_none_when_not_found(db_session: Session) -> None: # Act - result = get_plan_by_uploaded_file_id(db_session, 999) + result: Optional[Plan] = get_plan_by_uploaded_file_id(db_session, 999) # Assert assert result is None +def test_get_plan_returns_full_structure(db_session: Session) -> None: + # Arrange + plan = Plan( + uid="test-uid-1", + name="Test Plan", + address="1 Test St", + postcode="TE1 1ST", + floors=[ + Floor( + level=0, + name=None, + rooms=[ + Room( + name="Living Room", + width_m=4.0, + length_m=5.0, + area_m2=20.0, + windows=[Window(width_m=1.2, height_m=1.0, area_m2=1.2, opening_type="side_hung")], + doors=[Door(width_mm=800.0)], + ), + Room( + name="Kitchen", + width_m=3.0, + length_m=4.0, + area_m2=12.0, + windows=[Window(width_m=0.9, height_m=1.0, area_m2=0.9, opening_type="top_hung")], + doors=[], + ), + ], + ) + ], + ) + save_plan(db_session, plan, 42) + + # Act + result: Optional[Plan] = get_plan_by_uploaded_file_id(db_session, 42) + + # Assert + assert result is not None + assert result.uid == "test-uid-1" + assert result.name == "Test Plan" + assert result.address == "1 Test St" + assert result.postcode == "TE1 1ST" + assert len(result.floors) == 1 + floor = result.floors[0] + assert floor.level == 0 + assert len(floor.rooms) == 2 + living = floor.rooms[0] + assert living.name == "Living Room" + assert living.width_m == 4.0 + assert living.length_m == 5.0 + assert living.area_m2 == 20.0 + assert len(living.windows) == 1 + assert living.windows[0].width_m == 1.2 + assert living.windows[0].opening_type == "side_hung" + assert len(living.doors) == 1 + assert living.doors[0].width_mm == 800.0 + kitchen = floor.rooms[1] + assert kitchen.name == "Kitchen" + assert len(kitchen.windows) == 1 + assert len(kitchen.doors) == 0 + + +def test_get_plan_floors_ordered_by_level(db_session: Session) -> None: + # Arrange — floors inserted in reverse level order to confirm DB ordering applies + plan = Plan( + uid="test-uid-ordering", + name=None, + floors=[ + Floor(level=2, name=None, rooms=[Room(name="Top Room", width_m=1.0, length_m=1.0, area_m2=1.0)]), + Floor(level=0, name=None, rooms=[Room(name="Ground Room", width_m=1.0, length_m=1.0, area_m2=1.0)]), + Floor(level=1, name=None, rooms=[Room(name="First Room", width_m=1.0, length_m=1.0, area_m2=1.0)]), + ], + ) + save_plan(db_session, plan, 43) + + # Act + result: Optional[Plan] = get_plan_by_uploaded_file_id(db_session, 43) + + # Assert + assert result is not None + assert [f.level for f in result.floors] == [0, 1, 2] + + def test_uploaded_file_id_stored_after_save(db_session: Session, domain_plan: Plan) -> None: # Act save_plan(db_session, domain_plan, 1)