diff --git a/mpt_api_client/resources/commerce/orders.py b/mpt_api_client/resources/commerce/orders.py index 29935ac..6b97ba5 100644 --- a/mpt_api_client/resources/commerce/orders.py +++ b/mpt_api_client/resources/commerce/orders.py @@ -9,6 +9,10 @@ ManagedResourceMixin, ) from mpt_api_client.models import Model, ResourceData +from mpt_api_client.resources.commerce.orders_asset import ( + AsyncOrdersAssetService, + OrdersAssetService, +) from mpt_api_client.resources.commerce.orders_subscription import ( AsyncOrderSubscriptionsService, OrderSubscriptionsService, @@ -115,6 +119,20 @@ def subscriptions(self, order_id: str) -> OrderSubscriptionsService: endpoint_params={"order_id": order_id}, ) + def assets(self, order_id: str) -> OrdersAssetService: + """Get the asset service for the given Order id. + + Args: + order_id: Order ID. + + Returns: + Order Asset service. + """ + return OrdersAssetService( + http_client=self.http_client, + endpoint_params={"order_id": order_id}, + ) + class AsyncOrdersService( # noqa: WPS215 WPS214 AsyncManagedResourceMixin[Order], @@ -218,3 +236,17 @@ def subscriptions(self, order_id: str) -> AsyncOrderSubscriptionsService: http_client=self.http_client, endpoint_params={"order_id": order_id}, ) + + def assets(self, order_id: str) -> AsyncOrdersAssetService: + """Get the asset service for the given Order id. + + Args: + order_id: Order ID. + + Returns: + Order Asset service. + """ + return AsyncOrdersAssetService( + http_client=self.http_client, + endpoint_params={"order_id": order_id}, + ) diff --git a/mpt_api_client/resources/commerce/orders_asset.py b/mpt_api_client/resources/commerce/orders_asset.py new file mode 100644 index 0000000..cb58cba --- /dev/null +++ b/mpt_api_client/resources/commerce/orders_asset.py @@ -0,0 +1,70 @@ +from mpt_api_client.http import AsyncService, Service +from mpt_api_client.http.mixins import ( + AsyncCollectionMixin, + AsyncManagedResourceMixin, + CollectionMixin, + ManagedResourceMixin, +) +from mpt_api_client.models import Model + + +class OrdersAsset(Model): + """Orders Asset resource.""" + + +class OrdersAssetServiceConfig: + """Orders Asset service config.""" + + _endpoint = "/public/v1/commerce/orders/{order_id}/assets" + _model_class = OrdersAsset + _collection_key = "data" + + +class OrdersAssetService( # noqa: WPS215 + ManagedResourceMixin[OrdersAsset], + CollectionMixin[OrdersAsset], + Service[OrdersAsset], + OrdersAssetServiceConfig, +): + """Orders Asset service.""" + + def render(self, resource_id: str) -> str: + """Render order asset template. + + Args: + resource_id: Order asset resource ID + + Returns: + Order asset template text in markdown format. + """ + response = self._resource_do_request( + resource_id, + "GET", + "render", + ) + return response.text + + +class AsyncOrdersAssetService( # noqa: WPS215 + AsyncManagedResourceMixin[OrdersAsset], + AsyncCollectionMixin[OrdersAsset], + AsyncService[OrdersAsset], + OrdersAssetServiceConfig, +): + """Async Orders Asset service.""" + + async def render(self, resource_id: str) -> str: + """Render order asset template. + + Args: + resource_id: Order asset resource ID + + Returns: + Order asset template text in markdown format. + """ + response = await self._resource_do_request( + resource_id, + "GET", + "render", + ) + return response.text diff --git a/tests/unit/resources/commerce/test_orders.py b/tests/unit/resources/commerce/test_orders.py index 1a7c830..2d5126a 100644 --- a/tests/unit/resources/commerce/test_orders.py +++ b/tests/unit/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_asset import ( + AsyncOrdersAssetService, + OrdersAssetService, +) from mpt_api_client.resources.commerce.orders_subscription import ( AsyncOrderSubscriptionsService, OrderSubscriptionsService, @@ -244,6 +248,24 @@ def test_async_subscription_service(async_http_client): assert result.endpoint_params == {"order_id": "ORD-123"} +def test_asset_service(http_client): + orders_service = OrdersService(http_client=http_client) + + result = orders_service.assets("ORD-123") + + assert isinstance(result, OrdersAssetService) + assert result.endpoint_params == {"order_id": "ORD-123"} + + +def test_async_asset_service(async_http_client): + orders_service = AsyncOrdersService(http_client=async_http_client) + + result = orders_service.assets("ORD-123") + + assert isinstance(result, AsyncOrdersAssetService) + assert result.endpoint_params == {"order_id": "ORD-123"} + + @pytest.mark.parametrize("method", ["get", "create", "update", "delete"]) def test_mixins_present(orders_service, method): result = hasattr(orders_service, method) diff --git a/tests/unit/resources/commerce/test_orders_asset.py b/tests/unit/resources/commerce/test_orders_asset.py new file mode 100644 index 0000000..6b817ea --- /dev/null +++ b/tests/unit/resources/commerce/test_orders_asset.py @@ -0,0 +1,82 @@ +import httpx +import pytest +import respx + +from mpt_api_client.resources.commerce.orders_asset import ( + AsyncOrdersAssetService, + OrdersAssetService, +) + + +@pytest.fixture +def asset_service(http_client): + return OrdersAssetService(http_client=http_client, endpoint_params={"order_id": "ORD-123"}) + + +@pytest.fixture +def async_asset_service(async_http_client): + return AsyncOrdersAssetService( + http_client=async_http_client, endpoint_params={"order_id": "ORD-123"} + ) + + +@pytest.mark.parametrize("method", ["get", "create", "update", "delete", "render"]) +def test_mixins_present(asset_service, method): + result = hasattr(asset_service, method) + + assert result is True + + +@pytest.mark.parametrize("method", ["get", "create", "update", "delete", "render"]) +def test_async_mixins_present(async_asset_service, method): + result = hasattr(async_asset_service, method) + + assert result is True + + +def test_endpoint(asset_service): + result = asset_service.path == "/public/v1/commerce/orders/ORD-123/assets" + + assert result is True + + +def test_async_endpoint(async_asset_service): + result = async_asset_service.path == "/public/v1/commerce/orders/ORD-123/assets" + + assert result is True + + +def test_render(asset_service): + template_content = "# Order Asset Template\n\nThis is a sample order asset template." + with respx.mock: + respx.get( + "https://api.example.com/public/v1/commerce/orders/ORD-123/assets/ASSET-456/render" + ).mock( + return_value=httpx.Response( + status_code=httpx.codes.OK, + headers={"content-type": "text/markdown"}, + content=template_content, + ) + ) + + result = asset_service.render("ASSET-456") + + assert result == template_content + + +async def test_async_render(async_asset_service): + template_content = "# Order Asset Template\n\nThis is a sample order asset template." + with respx.mock: + respx.get( + "https://api.example.com/public/v1/commerce/orders/ORD-123/assets/ASSET-456/render" + ).mock( + return_value=httpx.Response( + status_code=httpx.codes.OK, + headers={"content-type": "text/markdown"}, + content=template_content, + ) + ) + + result = await async_asset_service.render("ASSET-456") + + assert result == template_content