Skip to content

Commit 5177ecf

Browse files
author
Robert Segal
committed
Added commerce assets endpoints
1 parent 8bd6023 commit 5177ecf

4 files changed

Lines changed: 216 additions & 0 deletions

File tree

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
from mpt_api_client.http import AsyncService, Service
2+
from mpt_api_client.http.mixins import (
3+
AsyncCollectionMixin,
4+
AsyncCreateMixin,
5+
AsyncGetMixin,
6+
AsyncUpdateMixin,
7+
CollectionMixin,
8+
CreateMixin,
9+
GetMixin,
10+
UpdateMixin,
11+
)
12+
from mpt_api_client.models import Model
13+
from mpt_api_client.models.model import ResourceData
14+
15+
16+
class Asset(Model):
17+
"""Asset resource."""
18+
19+
20+
class AssetTemplate(Model):
21+
"""Asset template resource."""
22+
23+
24+
class AssetsServiceConfig:
25+
"""Assets service config."""
26+
27+
_endpoint = "/public/v1/commerce/assets"
28+
_model_class = Asset
29+
_collection_key = "data"
30+
31+
32+
class AssetsService(
33+
CreateMixin[Asset],
34+
UpdateMixin[Asset],
35+
GetMixin[Asset],
36+
CollectionMixin[Asset],
37+
Service[Asset],
38+
AssetsServiceConfig,
39+
):
40+
"""Assets service."""
41+
42+
def terminate(self, asset_id: str, resource_data: ResourceData | None = None) -> Asset:
43+
"""Terminate the given Asset id.
44+
45+
Args:
46+
asset_id: Asset ID.
47+
resource_data: Resource data will be updated
48+
"""
49+
response = self._resource_do_request(asset_id, "POST", "terminate", json=resource_data)
50+
return self._model_class.from_response(response)
51+
52+
def render(self, asset_id: str) -> AssetTemplate:
53+
"""Renders the template for the given Asset id.
54+
55+
Args:
56+
asset_id: Asset ID.
57+
58+
Returns:
59+
Render asset template json.
60+
"""
61+
response = self._resource_do_request(asset_id, action="render")
62+
63+
return AssetTemplate.from_response(response)
64+
65+
66+
class AsyncAssetsService(
67+
AsyncCreateMixin[Asset],
68+
AsyncUpdateMixin[Asset],
69+
AsyncGetMixin[Asset],
70+
AsyncCollectionMixin[Asset],
71+
AsyncService[Asset],
72+
AssetsServiceConfig,
73+
):
74+
"""Asynchronous Assets service."""
75+
76+
async def terminate(self, asset_id: str, resource_data: ResourceData | None = None) -> Asset:
77+
"""Terminate the given Asset id.
78+
79+
Args:
80+
asset_id: Asset ID.
81+
resource_data: Resource data will be updated
82+
"""
83+
response = await self._resource_do_request(
84+
asset_id, "POST", "terminate", json=resource_data
85+
)
86+
87+
return self._model_class.from_response(response)
88+
89+
async def render(self, asset_id: str) -> AssetTemplate:
90+
"""Renders the template for the given Asset id.
91+
92+
Args:
93+
asset_id: Asset ID.
94+
95+
Returns:
96+
Render asset template json.
97+
"""
98+
response = await self._resource_do_request(asset_id, action="render")
99+
100+
return AssetTemplate.from_response(response)

mpt_api_client/resources/commerce/commerce.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from mpt_api_client.http import AsyncHTTPClient, HTTPClient
22
from mpt_api_client.resources.commerce.agreements import AgreementsService, AsyncAgreementsService
3+
from mpt_api_client.resources.commerce.assets import AssetsService, AsyncAssetsService
34
from mpt_api_client.resources.commerce.orders import AsyncOrdersService, OrdersService
45
from mpt_api_client.resources.commerce.subscriptions import (
56
AsyncSubscriptionsService,
@@ -28,6 +29,11 @@ def subscriptions(self) -> SubscriptionsService:
2829
"""Subscription service."""
2930
return SubscriptionsService(http_client=self.http_client)
3031

32+
@property
33+
def assets(self) -> AssetsService:
34+
"""Asset service."""
35+
return AssetsService(http_client=self.http_client)
36+
3137

3238
class AsyncCommerce:
3339
"""Commerce MPT API Module."""
@@ -49,3 +55,8 @@ def orders(self) -> AsyncOrdersService:
4955
def subscriptions(self) -> AsyncSubscriptionsService:
5056
"""Subscription service."""
5157
return AsyncSubscriptionsService(http_client=self.http_client)
58+
59+
@property
60+
def assets(self) -> AsyncAssetsService:
61+
"""Asset service."""
62+
return AsyncAssetsService(http_client=self.http_client)
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import httpx
2+
import pytest
3+
import respx
4+
5+
from mpt_api_client.constants import APPLICATION_JSON
6+
from mpt_api_client.resources.commerce.assets import AssetsService, AsyncAssetsService
7+
8+
9+
@pytest.fixture
10+
def assets_service(http_client):
11+
return AssetsService(http_client=http_client)
12+
13+
14+
@pytest.fixture
15+
def async_assets_service(async_http_client):
16+
return AsyncAssetsService(http_client=async_http_client)
17+
18+
19+
async def test_async_render(async_assets_service):
20+
render_response = {"id": "ASSET-123", "title": "Sample Asset"}
21+
with respx.mock:
22+
respx.get("https://api.example.com/public/v1/commerce/assets/ASSET-123/render").mock(
23+
return_value=httpx.Response(
24+
status_code=200,
25+
headers={"content-type": APPLICATION_JSON},
26+
json=render_response,
27+
)
28+
)
29+
30+
result = await async_assets_service.render("ASSET-123")
31+
32+
assert result is not None
33+
34+
35+
def test_render(assets_service):
36+
render_response = {"id": "ASSET-123", "title": "Sample Asset"}
37+
with respx.mock:
38+
mock_route = respx.get(
39+
"https://api.example.com/public/v1/commerce/assets/ASSET-123/render"
40+
).mock(
41+
return_value=httpx.Response(
42+
status_code=200,
43+
headers={"content-type": APPLICATION_JSON},
44+
json=render_response,
45+
)
46+
)
47+
48+
result = assets_service.render("ASSET-123")
49+
50+
assert mock_route.called
51+
assert mock_route.call_count == 1
52+
assert result is not None
53+
54+
55+
def test_terminate(assets_service):
56+
response_data = {"id": "ASSET-123", "status": "terminated"}
57+
with respx.mock:
58+
mock_route = respx.post(
59+
"https://api.example.com/public/v1/commerce/assets/ASSET-123/terminate"
60+
).mock(
61+
return_value=httpx.Response(
62+
status_code=200,
63+
headers={"content-type": APPLICATION_JSON},
64+
json=response_data,
65+
)
66+
)
67+
68+
result = assets_service.terminate("ASSET-123")
69+
70+
assert mock_route.called
71+
assert mock_route.call_count == 1
72+
assert result is not None
73+
74+
75+
async def test_async_terminate(async_assets_service):
76+
response_data = {"id": "ASSET-123", "status": "terminated"}
77+
with respx.mock:
78+
mock_route = respx.post(
79+
"https://api.example.com/public/v1/commerce/assets/ASSET-123/terminate"
80+
).mock(
81+
return_value=httpx.Response(
82+
status_code=200,
83+
headers={"content-type": APPLICATION_JSON},
84+
json=response_data,
85+
)
86+
)
87+
88+
result = await async_assets_service.terminate("ASSET-123")
89+
90+
assert mock_route.called
91+
assert mock_route.call_count == 1
92+
assert result is not None
93+
94+
95+
@pytest.mark.parametrize("method", ["create", "update", "get"])
96+
def test_assets_service_methods(assets_service, method):
97+
assert hasattr(assets_service, method) # act
98+
99+
100+
@pytest.mark.parametrize("method", ["create", "update", "get"])
101+
def test_async_assets_service_methods(async_assets_service, method):
102+
assert hasattr(async_assets_service, method) # act

tests/unit/resources/commerce/test_commerce.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from mpt_api_client.http import AsyncHTTPClient
44
from mpt_api_client.resources.commerce import AsyncCommerce, Commerce
55
from mpt_api_client.resources.commerce.agreements import AgreementsService, AsyncAgreementsService
6+
from mpt_api_client.resources.commerce.assets import AssetsService, AsyncAssetsService
67
from mpt_api_client.resources.commerce.orders import AsyncOrdersService, OrdersService
78
from mpt_api_client.resources.commerce.subscriptions import (
89
AsyncSubscriptionsService,
@@ -40,6 +41,7 @@ def test_async_commerce_init(async_http_client: AsyncHTTPClient):
4041
("agreements", AgreementsService),
4142
("orders", OrdersService),
4243
("subscriptions", SubscriptionsService),
44+
("assets", AssetsService),
4345
],
4446
)
4547
def test_commerce_properties(http_client, attr_name, expected):
@@ -56,6 +58,7 @@ def test_commerce_properties(http_client, attr_name, expected):
5658
("agreements", AsyncAgreementsService),
5759
("orders", AsyncOrdersService),
5860
("subscriptions", AsyncSubscriptionsService),
61+
("assets", AsyncAssetsService),
5962
],
6063
)
6164
def test_async_commerce_properties(http_client, attr_name, expected):

0 commit comments

Comments
 (0)