From 79db1e2c7ed4bdc628a803d4d3d45f1105c52878 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 7 May 2026 12:22:04 +0000 Subject: [PATCH] =?UTF-8?q?validate=20plans=20api=20response=20as=20pydant?= =?UTF-8?q?ic=20basemodel=20object=20=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../magicplan_api_plans_response_example.json | 39 +++++++++++++++++++ .../magicplan/api/tests/test_response.py | 23 ++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 backend/magic_plan/magicplan_api_plans_response_example.json diff --git a/backend/magic_plan/magicplan_api_plans_response_example.json b/backend/magic_plan/magicplan_api_plans_response_example.json new file mode 100644 index 00000000..b8fcf1f9 --- /dev/null +++ b/backend/magic_plan/magicplan_api_plans_response_example.json @@ -0,0 +1,39 @@ +{ + "data": { + "paging": { + "page": 1, + "next_page": false, + "count": 1 + }, + "plans": [ + { + "id": "9f9889ff-793e-4e9a-a6f0-e22f5b0f5365", + "project_id": "269422e7-45b6-4582-b124-405053dcd967", + "name": "11, Br1 3lp", + "address": { + "street": "11 Station Road", + "street_number": null, + "postal_code": "BR1 3LP", + "city": "Bromley", + "country": "GB", + "longitude": 0.01593668, + "latitude": 51.40901033 + }, + "creation_date": "2026-04-28T09:35:44+00:00", + "update_date": "2026-05-05T12:53:36+00:00", + "thumbnail_url": "https://s3.amazonaws.com/prod.plans.sensopia.com/9f9889ff-793e-4e9a-a6f0-e22f5b0f5365/plan.thumb", + "public_url": "https://cloud.magicplan.app/plan/9f9889ff-793e-4e9a-a6f0-e22f5b0f5365", + "cloud_url": "https://cloud.magicplan.app/projects/9f9889ff-793e-4e9a-a6f0-e22f5b0f5365", + "3d_url": "https://3d.magicplan.app/#embed/?key=MmFkZDJjNGRmYWRjM2Y5ZDAwMjEyZGRlY2I3NmJjOWFjOWRmMDdkNzIxZTViZDdhNTgxZDBiYWE1YTYzZTJmY%2FJNEogVfW%2FZwVfY25qc24oCKnfVxiF%2FupeeA7vwS8FECF0L9E7DUFE%2ByzEYzYaoVc%2FbtsZ%2FqZOSPopiR4OqD3zbCziU0QTydELS32cnSFOT", + "workgroup_id": "677d01685458a", + "team_id": null, + "created_by": { + "id": "b19771e9-1aad-45a5-9a41-f01a835172ea", + "firstname": null, + "lastname": null, + "email": "archie.ratcliff@domna.homes" + } + } + ] + } +} \ No newline at end of file diff --git a/datatypes/magicplan/api/tests/test_response.py b/datatypes/magicplan/api/tests/test_response.py index 663da9ca..84f8f6d0 100644 --- a/datatypes/magicplan/api/tests/test_response.py +++ b/datatypes/magicplan/api/tests/test_response.py @@ -4,7 +4,7 @@ from typing import Any import pytest -from datatypes.magicplan.api.response import MagicPlan +from datatypes.magicplan.api.response import MagicPlan, PlansListResponse FIXTURE_DIR = Path(__file__).parents[4] / "backend" / "magic_plan" PLAN_ID = "a7285ed1-878d-47eb-8aa6-85ef9e187516" @@ -84,3 +84,24 @@ def test_extra_fields_ignored(raw_data: dict[str, Any]): data_with_extra = {**raw_data, "unknown_future_field": "whatever"} # act MagicPlan.model_validate(data_with_extra) + + +# --- PlansListResponse --- + + +@pytest.fixture(scope="module") +def plans_raw_data() -> dict[str, Any]: + payload = json.loads( + (FIXTURE_DIR / "magicplan_api_plans_response_example.json").read_text() + ) + return payload["data"] + + +@pytest.fixture(scope="module") +def plans_response(plans_raw_data: dict[str, Any]) -> PlansListResponse: + return PlansListResponse.model_validate(plans_raw_data) + + +def test_plans_list_model_validate_does_not_raise(plans_raw_data: dict[str, Any]) -> None: + # act + PlansListResponse.model_validate(plans_raw_data)