Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions mpt_api_client/resources/commerce/orders.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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],
Expand Down Expand Up @@ -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},
)
70 changes: 70 additions & 0 deletions mpt_api_client/resources/commerce/orders_asset.py
Original file line number Diff line number Diff line change
@@ -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
22 changes: 22 additions & 0 deletions tests/unit/resources/commerce/test_orders.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down
82 changes: 82 additions & 0 deletions tests/unit/resources/commerce/test_orders_asset.py
Original file line number Diff line number Diff line change
@@ -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