From 3077990613827af9cc28ed6ec3709567bb91526e Mon Sep 17 00:00:00 2001 From: Albert Sola Date: Mon, 8 Sep 2025 10:54:37 +0100 Subject: [PATCH] MPT-12846 Add Order subscriptions --- mpt_api_client/resources/commerce/orders.py | 36 ++++++++++++++++- .../resources/commerce/orders_subscription.py | 40 +++++++++++++++++++ .../commerce/test_order_subcription.py | 30 ++++++++++++++ tests/resources/commerce/test_orders.py | 22 ++++++++++ 4 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 mpt_api_client/resources/commerce/orders_subscription.py create mode 100644 tests/resources/commerce/test_order_subcription.py diff --git a/mpt_api_client/resources/commerce/orders.py b/mpt_api_client/resources/commerce/orders.py index 106884aa..58fb06b1 100644 --- a/mpt_api_client/resources/commerce/orders.py +++ b/mpt_api_client/resources/commerce/orders.py @@ -8,6 +8,10 @@ ) from mpt_api_client.http.mixins import AsyncUpdateMixin, UpdateMixin from mpt_api_client.models import Model, ResourceData +from mpt_api_client.resources.commerce.orders_subscription import ( + AsyncOrderSubscriptionsService, + OrderSubscriptionsService, +) class Order(Model): @@ -22,7 +26,7 @@ class OrdersServiceConfig: _collection_key = "data" -class OrdersService( # noqa: WPS215 +class OrdersService( # noqa: WPS215 WPS214 CreateMixin[Order], DeleteMixin, UpdateMixin[Order], @@ -97,8 +101,22 @@ def template(self, resource_id: str) -> str: response = self._resource_do_request(resource_id, "GET", "template") return response.text + def subscriptions(self, order_id: str) -> OrderSubscriptionsService: + """Get the subscription service for the given Order id. + + Args: + order_id: Order ID. + + Returns: + Order Subscription service. + """ + return OrderSubscriptionsService( + http_client=self.http_client, + endpoint_params={"order_id": order_id}, + ) + -class AsyncOrdersService( # noqa: WPS215 +class AsyncOrdersService( # noqa: WPS215 WPS214 AsyncCreateMixin[Order], AsyncDeleteMixin, AsyncUpdateMixin[Order], @@ -187,3 +205,17 @@ async def template(self, resource_id: str) -> str: """ response = await self._resource_do_request(resource_id, "GET", "template") return response.text + + def subscriptions(self, order_id: str) -> AsyncOrderSubscriptionsService: + """Get the subscription service for the given Order id. + + Args: + order_id: Order ID. + + Returns: + Order Subscription service. + """ + return AsyncOrderSubscriptionsService( + http_client=self.http_client, + endpoint_params={"order_id": order_id}, + ) diff --git a/mpt_api_client/resources/commerce/orders_subscription.py b/mpt_api_client/resources/commerce/orders_subscription.py new file mode 100644 index 00000000..d2ef0073 --- /dev/null +++ b/mpt_api_client/resources/commerce/orders_subscription.py @@ -0,0 +1,40 @@ +from mpt_api_client.http import AsyncService, CreateMixin, DeleteMixin, Service +from mpt_api_client.http.mixins import ( + AsyncCreateMixin, + AsyncDeleteMixin, + AsyncUpdateMixin, + UpdateMixin, +) +from mpt_api_client.models import Model + + +class OrderSubscription(Model): + """Order Subscription resource.""" + + +class OrderSubscriptionsServiceConfig: + """Orders service config.""" + + _endpoint = "/public/v1/commerce/orders/{order_id}/subscriptions" + _model_class = OrderSubscription + _collection_key = "data" + + +class OrderSubscriptionsService( # noqa: WPS215 + CreateMixin[OrderSubscription], + DeleteMixin, + UpdateMixin[OrderSubscription], + Service[OrderSubscription], + OrderSubscriptionsServiceConfig, +): + """Orders Subscription service.""" + + +class AsyncOrderSubscriptionsService( # noqa: WPS215 + AsyncCreateMixin[OrderSubscription], + AsyncDeleteMixin, + AsyncUpdateMixin[OrderSubscription], + AsyncService[OrderSubscription], + OrderSubscriptionsServiceConfig, +): + """Async Orders Subscription service.""" diff --git a/tests/resources/commerce/test_order_subcription.py b/tests/resources/commerce/test_order_subcription.py new file mode 100644 index 00000000..6721d325 --- /dev/null +++ b/tests/resources/commerce/test_order_subcription.py @@ -0,0 +1,30 @@ +import pytest + +from mpt_api_client.resources.commerce.orders_subscription import ( + AsyncOrderSubscriptionsService, + OrderSubscriptionsService, +) + + +@pytest.fixture +def subscription_service(http_client): + return OrderSubscriptionsService( + http_client=http_client, endpoint_params={"order_id": "ORD-123"} + ) + + +@pytest.fixture +def async_subscription_service(async_http_client): + return AsyncOrderSubscriptionsService( + http_client=async_http_client, endpoint_params={"order_id": "ORD-123"} + ) + + +@pytest.mark.parametrize("method", ["get", "create", "delete", "update"]) +def test_mixins_present(subscription_service, method): + assert hasattr(subscription_service, method) + + +@pytest.mark.parametrize("method", ["get", "create", "delete", "update"]) +def test_async_mixins_present(async_subscription_service, method): + assert hasattr(async_subscription_service, method) diff --git a/tests/resources/commerce/test_orders.py b/tests/resources/commerce/test_orders.py index c09b9e82..4132210d 100644 --- a/tests/resources/commerce/test_orders.py +++ b/tests/resources/commerce/test_orders.py @@ -3,6 +3,10 @@ import respx from mpt_api_client.resources.commerce.orders import AsyncOrdersService, Order, OrdersService +from mpt_api_client.resources.commerce.orders_subscription import ( + AsyncOrderSubscriptionsService, + OrderSubscriptionsService, +) @pytest.fixture @@ -221,6 +225,24 @@ async def test_async_template(async_orders_service): assert template == template_content +def test_subscription_service(http_client): + orders_service = OrdersService(http_client=http_client) + + subscriptions = orders_service.subscriptions("ORD-123") + + assert isinstance(subscriptions, OrderSubscriptionsService) + assert subscriptions.endpoint_params == {"order_id": "ORD-123"} + + +def test_async_subscription_service(async_http_client): + orders_service = AsyncOrdersService(http_client=async_http_client) + + subscriptions = orders_service.subscriptions("ORD-123") + + assert isinstance(subscriptions, AsyncOrderSubscriptionsService) + assert subscriptions.endpoint_params == {"order_id": "ORD-123"} + + @pytest.mark.parametrize("method", ["get", "create", "update", "delete"]) def test_mixins_present(orders_service, method): assert hasattr(orders_service, method)