Skip to content

Commit 3e6f9ff

Browse files
author
Robert Segal
committed
Added commerce orders assets endpoints
1 parent d927ac4 commit 3e6f9ff

4 files changed

Lines changed: 206 additions & 0 deletions

File tree

mpt_api_client/resources/commerce/orders.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
ManagedResourceMixin,
1010
)
1111
from mpt_api_client.models import Model, ResourceData
12+
from mpt_api_client.resources.commerce.orders_asset import (
13+
AsyncOrdersAssetService,
14+
OrdersAssetService,
15+
)
1216
from mpt_api_client.resources.commerce.orders_subscription import (
1317
AsyncOrderSubscriptionsService,
1418
OrderSubscriptionsService,
@@ -115,6 +119,20 @@ def subscriptions(self, order_id: str) -> OrderSubscriptionsService:
115119
endpoint_params={"order_id": order_id},
116120
)
117121

122+
def assets(self, order_id: str) -> OrdersAssetService:
123+
"""Get the asset service for the given Order id.
124+
125+
Args:
126+
order_id: Order ID.
127+
128+
Returns:
129+
Order Asset service.
130+
"""
131+
return OrdersAssetService(
132+
http_client=self.http_client,
133+
endpoint_params={"order_id": order_id},
134+
)
135+
118136

119137
class AsyncOrdersService( # noqa: WPS215 WPS214
120138
AsyncManagedResourceMixin[Order],
@@ -218,3 +236,17 @@ def subscriptions(self, order_id: str) -> AsyncOrderSubscriptionsService:
218236
http_client=self.http_client,
219237
endpoint_params={"order_id": order_id},
220238
)
239+
240+
def assets(self, order_id: str) -> AsyncOrdersAssetService:
241+
"""Get the asset service for the given Order id.
242+
243+
Args:
244+
order_id: Order ID.
245+
246+
Returns:
247+
Order Asset service.
248+
"""
249+
return AsyncOrdersAssetService(
250+
http_client=self.http_client,
251+
endpoint_params={"order_id": order_id},
252+
)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from mpt_api_client.http import AsyncService, Service
2+
from mpt_api_client.http.mixins import (
3+
AsyncCollectionMixin,
4+
AsyncManagedResourceMixin,
5+
CollectionMixin,
6+
ManagedResourceMixin,
7+
)
8+
from mpt_api_client.models import Model
9+
10+
11+
class OrdersAsset(Model):
12+
"""Orders Asset resource."""
13+
14+
15+
class OrdersAssetServiceConfig:
16+
"""Orders Asset service config."""
17+
18+
_endpoint = "/public/v1/commerce/orders/{order_id}/assets"
19+
_model_class = OrdersAsset
20+
_collection_key = "data"
21+
22+
23+
class OrdersAssetService( # noqa: WPS215
24+
ManagedResourceMixin[OrdersAsset],
25+
CollectionMixin[OrdersAsset],
26+
Service[OrdersAsset],
27+
OrdersAssetServiceConfig,
28+
):
29+
"""Orders Asset service."""
30+
31+
def render(self, resource_id: str) -> str:
32+
"""Render order asset template.
33+
34+
Args:
35+
resource_id: Order asset resource ID
36+
37+
Returns:
38+
Order asset template text in markdown format.
39+
"""
40+
response = self._resource_do_request(
41+
resource_id,
42+
"GET",
43+
"render",
44+
)
45+
return response.text
46+
47+
48+
class AsyncOrdersAssetService( # noqa: WPS215
49+
AsyncManagedResourceMixin[OrdersAsset],
50+
AsyncCollectionMixin[OrdersAsset],
51+
AsyncService[OrdersAsset],
52+
OrdersAssetServiceConfig,
53+
):
54+
"""Async Orders Asset service."""
55+
56+
async def render(self, resource_id: str) -> str:
57+
"""Render order asset template.
58+
59+
Args:
60+
resource_id: Order asset resource ID
61+
62+
Returns:
63+
Order asset template text in markdown format.
64+
"""
65+
response = await self._resource_do_request(
66+
resource_id,
67+
"GET",
68+
"render",
69+
)
70+
return response.text

tests/unit/resources/commerce/test_orders.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import respx
44

55
from mpt_api_client.resources.commerce.orders import AsyncOrdersService, Order, OrdersService
6+
from mpt_api_client.resources.commerce.orders_asset import (
7+
AsyncOrdersAssetService,
8+
OrdersAssetService,
9+
)
610
from mpt_api_client.resources.commerce.orders_subscription import (
711
AsyncOrderSubscriptionsService,
812
OrderSubscriptionsService,
@@ -244,6 +248,24 @@ def test_async_subscription_service(async_http_client):
244248
assert result.endpoint_params == {"order_id": "ORD-123"}
245249

246250

251+
def test_asset_service(http_client):
252+
orders_service = OrdersService(http_client=http_client)
253+
254+
result = orders_service.assets("ORD-123")
255+
256+
assert isinstance(result, OrdersAssetService)
257+
assert result.endpoint_params == {"order_id": "ORD-123"}
258+
259+
260+
def test_async_asset_service(async_http_client):
261+
orders_service = AsyncOrdersService(http_client=async_http_client)
262+
263+
result = orders_service.assets("ORD-123")
264+
265+
assert isinstance(result, AsyncOrdersAssetService)
266+
assert result.endpoint_params == {"order_id": "ORD-123"}
267+
268+
247269
@pytest.mark.parametrize("method", ["get", "create", "update", "delete"])
248270
def test_mixins_present(orders_service, method):
249271
result = hasattr(orders_service, method)
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import httpx
2+
import pytest
3+
import respx
4+
5+
from mpt_api_client.resources.commerce.orders_asset import (
6+
AsyncOrdersAssetService,
7+
OrdersAssetService,
8+
)
9+
10+
11+
@pytest.fixture
12+
def asset_service(http_client):
13+
return OrdersAssetService(http_client=http_client, endpoint_params={"order_id": "ORD-123"})
14+
15+
16+
@pytest.fixture
17+
def async_asset_service(async_http_client):
18+
return AsyncOrdersAssetService(
19+
http_client=async_http_client, endpoint_params={"order_id": "ORD-123"}
20+
)
21+
22+
23+
@pytest.mark.parametrize("method", ["get", "create", "update", "delete", "render"])
24+
def test_mixins_present(asset_service, method):
25+
result = hasattr(asset_service, method)
26+
27+
assert result is True
28+
29+
30+
@pytest.mark.parametrize("method", ["get", "create", "update", "delete", "render"])
31+
def test_async_mixins_present(async_asset_service, method):
32+
result = hasattr(async_asset_service, method)
33+
34+
assert result is True
35+
36+
37+
def test_endpoint(asset_service):
38+
result = asset_service.path == "/public/v1/commerce/orders/ORD-123/assets"
39+
40+
assert result is True
41+
42+
43+
def test_async_endpoint(async_asset_service):
44+
result = async_asset_service.path == "/public/v1/commerce/orders/ORD-123/assets"
45+
46+
assert result is True
47+
48+
49+
def test_render(asset_service):
50+
template_content = "# Order Asset Template\n\nThis is a sample order asset template."
51+
with respx.mock:
52+
respx.get(
53+
"https://api.example.com/public/v1/commerce/orders/ORD-123/assets/ASSET-456/render"
54+
).mock(
55+
return_value=httpx.Response(
56+
status_code=httpx.codes.OK,
57+
headers={"content-type": "text/markdown"},
58+
content=template_content,
59+
)
60+
)
61+
62+
result = asset_service.render("ASSET-456")
63+
64+
assert result == template_content
65+
66+
67+
async def test_async_render(async_asset_service):
68+
template_content = "# Order Asset Template\n\nThis is a sample order asset template."
69+
with respx.mock:
70+
respx.get(
71+
"https://api.example.com/public/v1/commerce/orders/ORD-123/assets/ASSET-456/render"
72+
).mock(
73+
return_value=httpx.Response(
74+
status_code=httpx.codes.OK,
75+
headers={"content-type": "text/markdown"},
76+
content=template_content,
77+
)
78+
)
79+
80+
result = await async_asset_service.render("ASSET-456")
81+
82+
assert result == template_content

0 commit comments

Comments
 (0)