Merge branch 'main' into feature/generate-ventilation-audit-from-magicplan

This commit is contained in:
Daniel Roth 2026-06-09 14:22:57 +00:00
commit 94f8ef5458
4 changed files with 6 additions and 75 deletions

View file

@ -1,21 +1,21 @@
import os
import boto3
from typing import Any, Optional
import boto3
from applications.magic_plan.magic_plan_trigger_request import MagicPlanTriggerRequest
from infrastructure.magic_plan.config import MagicPlanConfig
from infrastructure.magic_plan.magic_plan_client import MagicPlanClient
from infrastructure.s3.s3_client import S3Client
from orchestration.magic_plan_orchestrator import MagicPlanOrchestrator
from applications.magic_plan.magic_plan_trigger_request import MagicPlanTriggerRequest
from domain.magicplan.models import Plan
from utilities.aws_lambda.subtask_handler import subtask_handler
from domain.tasks.tasks import Source
from utilities.aws_lambda.task_handler import task_handler
from utilities.logger import setup_logger
logger = setup_logger()
@subtask_handler()
@task_handler(task_source="magic_plan", source=Source.HUBSPOT_DEAL)
def handler(body: dict[str, Any], context: Any) -> Optional[str]:
config = MagicPlanConfig.from_env(os.environ)
payload = MagicPlanTriggerRequest.model_validate(body)

View file

@ -6,15 +6,7 @@ from sqlalchemy import delete, select
from sqlalchemy.dialects.postgresql import insert as pg_insert
from sqlmodel import Session, col
from domain.magicplan.models import (
Door,
DoorVentilation,
Floor,
Plan,
Room,
Window,
WindowVentilation,
)
from domain.magicplan.models import Floor, Plan
from infrastructure.postgres.magic_plan_tables import (
MagicPlanDoorModel,
MagicPlanDoorVentilationModel,

View file

@ -1,7 +1,6 @@
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Optional
from domain.magicplan.models import Plan
@ -17,6 +16,3 @@ class MagicPlanRepository(ABC):
@abstractmethod
def save(self, plan: Plan, uploaded_file_id: int) -> None: ...
@abstractmethod
def get_plan_by_uploaded_file_id(self, uploaded_file_id: int) -> Optional[Plan]: ...

View file

@ -91,63 +91,6 @@ def test_save_writes_ventilation_rows(db_engine: Engine) -> None:
assert len(session.exec(select(MagicPlanDoorVentilationModel)).all()) == 1
def test_get_plan_by_uploaded_file_id_returns_plan(db_engine: Engine) -> None:
# Arrange
plan = _plan()
with Session(db_engine) as session:
MagicPlanPostgresRepository(session).save(plan, uploaded_file_id=42)
session.commit()
# Act
with Session(db_engine) as session:
result = MagicPlanPostgresRepository(session).get_plan_by_uploaded_file_id(42)
# Assert — full aggregate reconstructed; floor.name is not persisted (accepted data gap)
assert result is not None
assert result.uid == plan.uid
assert result.name == plan.name
assert result.address == plan.address
assert result.postcode == plan.postcode
assert len(result.floors) == 1
result_floor = result.floors[0]
assert result_floor.level == plan.floors[0].level
assert result_floor.name is None # floor.name is not persisted per PRD
assert len(result_floor.rooms) == 1
result_room = result_floor.rooms[0]
source_room = plan.floors[0].rooms[0]
assert result_room.name == source_room.name
assert result_room.width_m == source_room.width_m
assert result_room.length_m == source_room.length_m
assert result_room.area_m2 == source_room.area_m2
assert len(result_room.windows) == 1
result_window = result_room.windows[0]
source_window = source_room.windows[0]
assert result_window.width_m == source_window.width_m
assert result_window.height_m == source_window.height_m
assert result_window.area_m2 == source_window.area_m2
assert result_window.ventilation is not None
assert result_window.ventilation == source_window.ventilation
assert len(result_room.doors) == 1
result_door = result_room.doors[0]
source_door = source_room.doors[0]
assert result_door.width_mm == source_door.width_mm
assert result_door.height_mm == source_door.height_mm
assert result_door.ventilation is not None
assert result_door.ventilation == source_door.ventilation
def test_get_plan_by_uploaded_file_id_returns_none_when_not_found(db_engine: Engine) -> None:
# Arrange — nothing saved for uploaded_file_id=999
# Act
with Session(db_engine) as session:
result = MagicPlanPostgresRepository(session).get_plan_by_uploaded_file_id(999)
# Assert
assert result is None
def test_save_is_idempotent(db_engine: Engine) -> None:
# Arrange
plan = _plan()