Skip to content

Commit a6a3cff

Browse files
authored
[MPT-16279] Added e2e tests for commerce assets (#162)
Added e2e tests for commerce assets https://softwareone.atlassian.net/browse/MPT-16279 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Asset render operation now returns rendered template text instead of a JSON object. * **Tests** * Added comprehensive end-to-end test suites (sync & async) covering create, read, update, delete, list, filter, not-found handling, terminate, and render flows with teardown fixtures. * **Chores** * Added new configuration keys for commerce assets and new test fixtures exposing asset and agreement IDs. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
2 parents df04062 + 5211e77 commit a6a3cff

File tree

6 files changed

+223
-5
lines changed

6 files changed

+223
-5
lines changed

e2e_config.test.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
"catalog.unit.id": "UNT-1229",
2727
"commerce.agreement.attachment.id": "ATT-9850-2169-6098-0001",
2828
"commerce.agreement.id": "AGR-9850-2169-6098",
29+
"commerce.assets.agreement.id": "AGR-2473-3299-1721",
30+
"commerce.assets.id": "AST-0625-6526-6154",
31+
"commerce.assets.order.id": "ORD-7707-7765-8445",
32+
"commerce.assets.product.item.id": "ITM-1767-7355-0002",
33+
"commerce.assets.product.template.id": "",
2934
"commerce.authorization.id": "AUT-0031-2873",
3035
"commerce.client.id": "ACC-1086-6867",
3136
"commerce.order.id": "ORD-6969-3541-5426",

mpt_api_client/resources/commerce/assets.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def terminate(self, asset_id: str, resource_data: ResourceData | None = None) ->
4949
response = self._resource_do_request(asset_id, "POST", "terminate", json=resource_data)
5050
return self._model_class.from_response(response)
5151

52-
def render(self, asset_id: str) -> AssetTemplate:
52+
def render(self, asset_id: str) -> str:
5353
"""Renders the template for the given Asset id.
5454
5555
Args:
@@ -60,7 +60,7 @@ def render(self, asset_id: str) -> AssetTemplate:
6060
"""
6161
response = self._resource_do_request(asset_id, action="render")
6262

63-
return AssetTemplate.from_response(response)
63+
return response.text
6464

6565

6666
class AsyncAssetService(
@@ -86,15 +86,15 @@ async def terminate(self, asset_id: str, resource_data: ResourceData | None = No
8686

8787
return self._model_class.from_response(response)
8888

89-
async def render(self, asset_id: str) -> AssetTemplate:
89+
async def render(self, asset_id: str) -> str:
9090
"""Renders the template for the given Asset id.
9191
9292
Args:
9393
asset_id: Asset ID.
9494
9595
Returns:
96-
Render asset template json.
96+
Render asset template string.
9797
"""
9898
response = await self._resource_do_request(asset_id, action="render")
9999

100-
return AssetTemplate.from_response(response)
100+
return response.text
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def agreement_asset_id(e2e_config):
6+
return e2e_config["commerce.assets.id"]
7+
8+
9+
@pytest.fixture
10+
def invalid_agreement_asset_id():
11+
return "AST-0000-0000-0000"
12+
13+
14+
@pytest.fixture
15+
def asset_factory(asset_item_id, asset_agreement_id):
16+
def factory(
17+
name: str = "E2E Created Asset",
18+
quantity: int = 1,
19+
external_vendor_id: str = "ext-vendor-id",
20+
):
21+
return {
22+
"name": name,
23+
"agreement": {"id": asset_agreement_id},
24+
"externalIds": {"vendor": external_vendor_id},
25+
"lines": [
26+
{
27+
"item": {"id": asset_item_id},
28+
"quantity": quantity,
29+
"price": {
30+
"unitPP": 10,
31+
"PPx12": 10,
32+
},
33+
}
34+
],
35+
}
36+
37+
return factory
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
async def created_asset(async_mpt_vendor, asset_factory):
11+
new_asset_request_data = asset_factory(
12+
name="E2E Created Asset",
13+
)
14+
15+
result = await async_mpt_vendor.commerce.assets.create(new_asset_request_data)
16+
17+
yield result
18+
19+
try:
20+
await async_mpt_vendor.commerce.assets.terminate(result.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to terminate asset: {getattr(error, 'title', str(error))}") # noqa: WPS421
23+
24+
25+
async def test_get_asset_by_id(async_mpt_vendor, agreement_asset_id):
26+
result = await async_mpt_vendor.commerce.assets.get(agreement_asset_id)
27+
28+
assert result is not None
29+
30+
31+
async def test_list_assets(async_mpt_vendor):
32+
limit = 10
33+
34+
result = await async_mpt_vendor.commerce.assets.fetch_page(limit=limit)
35+
36+
assert len(result) > 0
37+
38+
39+
async def test_get_asset_by_id_not_found(async_mpt_vendor, invalid_agreement_asset_id):
40+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41+
await async_mpt_vendor.commerce.assets.get(invalid_agreement_asset_id)
42+
43+
44+
async def test_filter_assets(async_mpt_vendor, agreement_asset_id):
45+
select_fields = ["-externalIds"]
46+
filtered_assets = (
47+
async_mpt_vendor.commerce.assets.filter(RQLQuery(id=agreement_asset_id))
48+
.filter(RQLQuery(name="E2E Seeded Order Asset"))
49+
.select(*select_fields)
50+
)
51+
52+
result = [asset async for asset in filtered_assets.iterate()]
53+
54+
assert len(result) == 1
55+
56+
57+
def test_create_asset(created_asset):
58+
result = created_asset
59+
60+
assert result is not None
61+
62+
63+
async def test_update_asset(async_mpt_vendor, created_asset):
64+
updated_asset_data = {
65+
"name": "E2E Updated Asset",
66+
"parameters": {"fulfillment": []},
67+
}
68+
69+
result = await async_mpt_vendor.commerce.assets.update(created_asset.id, updated_asset_data)
70+
71+
assert result is not None
72+
73+
74+
async def test_terminate_asset(async_mpt_vendor, created_asset):
75+
result = await async_mpt_vendor.commerce.assets.terminate(created_asset.id)
76+
77+
assert result is not None
78+
79+
80+
async def test_render_asset(async_mpt_vendor, created_asset):
81+
result = await async_mpt_vendor.commerce.assets.render(created_asset.id)
82+
83+
assert result is not None
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
def created_asset(mpt_vendor, asset_factory):
11+
new_asset_request_data = asset_factory(
12+
name="E2E Created Asset",
13+
)
14+
15+
result = mpt_vendor.commerce.assets.create(new_asset_request_data)
16+
17+
yield result
18+
19+
try:
20+
mpt_vendor.commerce.assets.terminate(result.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to terminate asset: {getattr(error, 'title', str(error))}") # noqa: WPS421
23+
24+
25+
def test_get_asset_by_id(mpt_vendor, agreement_asset_id):
26+
result = mpt_vendor.commerce.assets.get(agreement_asset_id)
27+
28+
assert result is not None
29+
30+
31+
def test_list_assets(mpt_vendor):
32+
limit = 10
33+
34+
result = mpt_vendor.commerce.assets.fetch_page(limit=limit)
35+
36+
assert len(result) > 0
37+
38+
39+
def test_get_asset_by_id_not_found(mpt_vendor, invalid_agreement_asset_id):
40+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41+
mpt_vendor.commerce.assets.get(invalid_agreement_asset_id)
42+
43+
44+
def test_filter_assets(mpt_vendor, agreement_asset_id):
45+
select_fields = ["-externalIds"]
46+
filtered_assets = (
47+
mpt_vendor.commerce.assets.filter(RQLQuery(id=agreement_asset_id))
48+
.filter(RQLQuery(name="E2E Seeded Order Asset"))
49+
.select(*select_fields)
50+
)
51+
52+
result = list(filtered_assets.iterate())
53+
54+
assert len(result) == 1
55+
56+
57+
def test_create_asset(created_asset):
58+
result = created_asset
59+
60+
assert result is not None
61+
62+
63+
def test_update_asset(mpt_vendor, created_asset):
64+
updated_asset_data = {
65+
"name": "E2E Updated Asset",
66+
"parameters": {"fulfillment": []},
67+
}
68+
69+
result = mpt_vendor.commerce.assets.update(created_asset.id, updated_asset_data)
70+
71+
assert result is not None
72+
73+
74+
def test_terminate_asset(mpt_vendor, created_asset):
75+
result = mpt_vendor.commerce.assets.terminate(created_asset.id)
76+
77+
assert result is not None
78+
79+
80+
def test_render_asset(mpt_vendor, created_asset):
81+
result = mpt_vendor.commerce.assets.render(created_asset.id)
82+
83+
assert result is not None

tests/e2e/commerce/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,13 @@ def subscription_item_id(e2e_config):
3939
@pytest.fixture
4040
def subscription_agreement_id(e2e_config):
4141
return e2e_config["commerce.subscription.agreement.id"]
42+
43+
44+
@pytest.fixture
45+
def asset_item_id(e2e_config):
46+
return e2e_config["commerce.assets.product.item.id"]
47+
48+
49+
@pytest.fixture
50+
def asset_agreement_id(e2e_config):
51+
return e2e_config["commerce.assets.agreement.id"]

0 commit comments

Comments
 (0)