From c69f2233434940ca12e04a19307f8d66108a41ab Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 5 May 2026 10:28:43 +0000 Subject: [PATCH] =?UTF-8?q?Define=20dataclasses=20to=20represent=20API=20j?= =?UTF-8?q?son=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../magicplan/api/tests/test_response.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 datatypes/magicplan/api/tests/test_response.py diff --git a/datatypes/magicplan/api/tests/test_response.py b/datatypes/magicplan/api/tests/test_response.py new file mode 100644 index 00000000..613a0957 --- /dev/null +++ b/datatypes/magicplan/api/tests/test_response.py @@ -0,0 +1,87 @@ +import json +from pathlib import Path +from typing import Any + +import pytest + +from datatypes.magicplan.api.response import MagicPlan + +FIXTURE_DIR = Path(__file__).parents[4] / "backend" / "magic_plan" +PLAN_ID = "a7285ed1-878d-47eb-8aa6-85ef9e187516" + + +@pytest.fixture(scope="module") +def raw_data() -> dict[str, Any]: + payload = json.loads( + (FIXTURE_DIR / "magicplan_api_plan_response_example.json").read_text() + ) + return payload["data"] + + +@pytest.fixture(scope="module") +def mp(raw_data: dict[str, Any]) -> MagicPlan: + return MagicPlan.model_validate(raw_data) + + +def test_model_validate_does_not_raise(raw_data: dict[str, Any]): + # act + MagicPlan.model_validate(raw_data) + + +def test_plan_id(mp: MagicPlan): + # assert + assert mp.plan.id == PLAN_ID + + +def test_url_3d_alias(mp: MagicPlan): + # assert + assert mp.plan.url_3d is not None + assert mp.plan.url_3d.startswith("http") + + +def test_floor_count(mp: MagicPlan): + # assert + assert len(mp.plan_detail.plan.floors) == 2 + + +def test_first_room_name(mp: MagicPlan): + # assert + assert mp.plan_detail.plan.floors[0].rooms[0].name == "Kitchen" + + +def test_room_area_is_float(mp: MagicPlan): + # arrange + room = mp.plan_detail.plan.floors[0].rooms[0] + # assert + assert isinstance(room.area, float) + + +def test_wall_item_symbol_id(mp: MagicPlan): + # arrange + room = mp.plan_detail.plan.floors[0].rooms[0] + # assert + assert room.wall_items[0].symbol.id != "" + + +def test_field_value_array(mp: MagicPlan): + # arrange + room = mp.plan_detail.plan.floors[0].rooms[0] + array_field = next(f for f in room.displayable_fields if f.value.is_array) + # assert + assert isinstance(array_field.value.value, list) + + +def test_field_value_scalar(mp: MagicPlan): + # arrange + room = mp.plan_detail.plan.floors[0].rooms[0] + scalar_field = next(f for f in room.displayable_fields if not f.value.is_array) + # assert + assert isinstance(scalar_field.value.value, str) + + +def test_extra_fields_ignored(raw_data: dict[str, Any]): + # arrange + data_with_extra = {**raw_data, "unknown_future_field": "whatever"} + # act + MagicPlan.model_validate(data_with_extra) + print("")