Paginate get_plans to return flat list[PlanSummary] 🟥

This commit is contained in:
Daniel Roth 2026-05-12 14:45:09 +00:00
parent 8727a78f8b
commit 62acc3ce98
2 changed files with 11 additions and 10 deletions

View file

@ -1,6 +1,6 @@
import requests import requests
from datatypes.magicplan.api.response import MagicPlanPlan, PlansListResponse from datatypes.magicplan.api.response import MagicPlanPlan, PlanSummary, PlansListResponse
_BASE_URL = "https://cloud.magicplan.app/api/v2" _BASE_URL = "https://cloud.magicplan.app/api/v2"
@ -10,10 +10,8 @@ class MagicPlanClient:
self._session = requests.Session() self._session = requests.Session()
self._session.headers.update({"customer": customer_id, "key": api_key}) self._session.headers.update({"customer": customer_id, "key": api_key})
def get_plans(self) -> PlansListResponse: def get_plans(self) -> list[PlanSummary]:
r = self._session.get(f"{_BASE_URL}/workgroups/plans") raise NotImplementedError
r.raise_for_status()
return PlansListResponse.model_validate(r.json()["data"])
def get_plan(self, plan_id: str) -> MagicPlanPlan: def get_plan(self, plan_id: str) -> MagicPlanPlan:
return MagicPlanPlan.model_validate(self._fetch_plan(plan_id).json()["data"]) return MagicPlanPlan.model_validate(self._fetch_plan(plan_id).json()["data"])

View file

@ -7,7 +7,7 @@ import pytest
import requests import requests
from backend.magic_plan.magic_plan_client import MagicPlanClient from backend.magic_plan.magic_plan_client import MagicPlanClient
from datatypes.magicplan.api.response import MagicPlanPlan, PlansListResponse from datatypes.magicplan.api.response import MagicPlanPlan, PlanSummary
FIXTURE_DIR = Path(__file__).parents[2] / "magic_plan" FIXTURE_DIR = Path(__file__).parents[2] / "magic_plan"
BASE_URL = "https://cloud.magicplan.app/api/v2" BASE_URL = "https://cloud.magicplan.app/api/v2"
@ -70,7 +70,9 @@ def test_get_plans_calls_correct_url(
# Act # Act
client.get_plans() client.get_plans()
# Assert # Assert
mock_session.get.assert_called_once_with(f"{BASE_URL}/workgroups/plans") mock_session.get.assert_called_once_with(
f"{BASE_URL}/workgroups/plans", params={"page": 1}
)
def test_get_plans_calls_raise_for_status( def test_get_plans_calls_raise_for_status(
@ -88,7 +90,7 @@ def test_get_plans_calls_raise_for_status(
mock_session.get.return_value.raise_for_status.assert_called_once() mock_session.get.return_value.raise_for_status.assert_called_once()
def test_get_plans_returns_plans_list_response( def test_get_plans_returns_list_of_plan_summaries(
client: MagicPlanClient, mock_session: MagicMock client: MagicPlanClient, mock_session: MagicMock
) -> None: ) -> None:
# Arrange # Arrange
@ -100,8 +102,9 @@ def test_get_plans_returns_plans_list_response(
# Act # Act
result = client.get_plans() result = client.get_plans()
# Assert # Assert
assert isinstance(result, PlansListResponse) assert isinstance(result, list)
assert len(result.plans) == 1 assert len(result) == 1
assert isinstance(result[0], PlanSummary)
def test_get_plans_propagates_http_error( def test_get_plans_propagates_http_error(