Skip to content

Commit 38c780a

Browse files
authored
[MPT-16318] Added e2e tests for commerce order assets (#166)
Added e2e tests for commerce order assets https://softwareone.atlassian.net/browse/MPT-16318 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** - Added comprehensive end-to-end tests (sync and async) for order-asset workflows: create, retrieve, list/paginate, filter, update, delete, render, and not-found handling. - Renamed and aligned asset test fixtures/parameters for consistency. * **Chores** - Added new test configuration keys for draft orders and agreement lines. - Reorganized fixtures across test modules, including removal and relocation of some asset fixtures. <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 9521013 + b42f485 commit 38c780a

File tree

9 files changed

+337
-22
lines changed

9 files changed

+337
-22
lines changed

e2e_config.test.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
"commerce.agreement.id": "AGR-9850-2169-6098",
2929
"commerce.agreement.subscription.line.id": "ALI-9850-2169-6098-0001",
3030
"commerce.assets.agreement.id": "AGR-2473-3299-1721",
31+
"commerce.assets.agreement.line.id": "ALI-9320-4904-7940-0001",
3132
"commerce.assets.id": "AST-0625-6526-6154",
3233
"commerce.assets.order.id": "ORD-7707-7765-8445",
34+
"commerce.assets.draft.order.agreement.id": "AGR-9320-4904-7940",
35+
"commerce.assets.draft.order.id": "ORD-9272-6817-2305",
3336
"commerce.assets.product.item.id": "ITM-1767-7355-0002",
3437
"commerce.assets.product.template.id": "",
3538
"commerce.authorization.id": "AUT-0031-2873",

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ per-file-ignores = [
132132
"tests/e2e/commerce/agreement/*.py: WPS202",
133133
"tests/e2e/commerce/agreement/attachment/*.py: WPS202",
134134
"tests/e2e/commerce/order/*.py: WPS202 WPS204",
135+
"tests/e2e/commerce/order/asset/*.py: WPS211 WPS202",
135136
"tests/e2e/commerce/subscription/*.py: WPS202",
136137
"tests/unit/http/test_async_service.py: WPS204 WPS202",
137138
"tests/unit/http/test_service.py: WPS204 WPS202",

tests/e2e/commerce/asset/conftest.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
import pytest
22

33

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-
144
@pytest.fixture
155
def asset_factory(asset_item_id, asset_agreement_id):
166
def factory(

tests/e2e/commerce/asset/test_async_asset.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ async def created_asset(async_mpt_vendor, asset_factory):
2222
print(f"TEARDOWN - Unable to terminate asset: {getattr(error, 'title', str(error))}") # noqa: WPS421
2323

2424

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)
25+
async def test_get_asset_by_id(async_mpt_vendor, asset_id):
26+
result = await async_mpt_vendor.commerce.assets.get(asset_id)
2727

2828
assert result is not None
2929

@@ -36,15 +36,15 @@ async def test_list_assets(async_mpt_vendor):
3636
assert len(result) > 0
3737

3838

39-
async def test_get_asset_by_id_not_found(async_mpt_vendor, invalid_agreement_asset_id):
39+
async def test_get_asset_by_id_not_found(async_mpt_vendor, invalid_asset_id):
4040
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41-
await async_mpt_vendor.commerce.assets.get(invalid_agreement_asset_id)
41+
await async_mpt_vendor.commerce.assets.get(invalid_asset_id)
4242

4343

44-
async def test_filter_assets(async_mpt_vendor, agreement_asset_id):
44+
async def test_filter_assets(async_mpt_vendor, asset_id):
4545
select_fields = ["-externalIds"]
4646
filtered_assets = (
47-
async_mpt_vendor.commerce.assets.filter(RQLQuery(id=agreement_asset_id))
47+
async_mpt_vendor.commerce.assets.filter(RQLQuery(id=asset_id))
4848
.filter(RQLQuery(name="E2E Seeded Order Asset"))
4949
.select(*select_fields)
5050
)

tests/e2e/commerce/asset/test_sync_asset.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def created_asset(mpt_vendor, asset_factory):
2222
print(f"TEARDOWN - Unable to terminate asset: {getattr(error, 'title', str(error))}") # noqa: WPS421
2323

2424

25-
def test_get_asset_by_id(mpt_vendor, agreement_asset_id):
26-
result = mpt_vendor.commerce.assets.get(agreement_asset_id)
25+
def test_get_asset_by_id(mpt_vendor, asset_id):
26+
result = mpt_vendor.commerce.assets.get(asset_id)
2727

2828
assert result is not None
2929

@@ -36,15 +36,15 @@ def test_list_assets(mpt_vendor):
3636
assert len(result) > 0
3737

3838

39-
def test_get_asset_by_id_not_found(mpt_vendor, invalid_agreement_asset_id):
39+
def test_get_asset_by_id_not_found(mpt_vendor, invalid_asset_id):
4040
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41-
mpt_vendor.commerce.assets.get(invalid_agreement_asset_id)
41+
mpt_vendor.commerce.assets.get(invalid_asset_id)
4242

4343

44-
def test_filter_assets(mpt_vendor, agreement_asset_id):
44+
def test_filter_assets(mpt_vendor, asset_id):
4545
select_fields = ["-externalIds"]
4646
filtered_assets = (
47-
mpt_vendor.commerce.assets.filter(RQLQuery(id=agreement_asset_id))
47+
mpt_vendor.commerce.assets.filter(RQLQuery(id=asset_id))
4848
.filter(RQLQuery(name="E2E Seeded Order Asset"))
4949
.select(*select_fields)
5050
)

tests/e2e/commerce/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,13 @@ def agreement_subscription_line_id(e2e_config):
6464
@pytest.fixture
6565
def invalid_subscription_id():
6666
return "SUB-0000-0000-0000"
67+
68+
69+
@pytest.fixture
70+
def asset_id(e2e_config):
71+
return e2e_config["commerce.assets.id"]
72+
73+
74+
@pytest.fixture
75+
def invalid_asset_id():
76+
return "AST-0000-0000-0000"
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def draft_order_asset_agreement_id(e2e_config):
6+
return e2e_config["commerce.assets.draft.order.agreement.id"]
7+
8+
9+
@pytest.fixture
10+
def asset_agreement_line_id(e2e_config):
11+
return e2e_config["commerce.assets.agreement.line.id"]
12+
13+
14+
@pytest.fixture
15+
def commerce_asset_draft_order_id(e2e_config):
16+
return e2e_config["commerce.assets.draft.order.id"]
17+
18+
19+
@pytest.fixture
20+
def order_asset_factory(
21+
draft_order_asset_agreement_id,
22+
buyer_id,
23+
asset_agreement_line_id,
24+
buyer_account_id,
25+
seller_id,
26+
commerce_product_id,
27+
commerce_asset_draft_order_id,
28+
):
29+
def factory(
30+
name: str = "E2E Created Order Asset",
31+
quantity: int = 1,
32+
external_vendor_id: str = "ext-vendor-id",
33+
):
34+
return {
35+
"name": name,
36+
"externalIds": {"vendor": external_vendor_id},
37+
"lines": [
38+
{
39+
"id": asset_agreement_line_id,
40+
"agreement": {"id": draft_order_asset_agreement_id},
41+
"buyer": {"id": buyer_id},
42+
"client": {"id": buyer_account_id},
43+
"oldQuantity": 0,
44+
"quantity": quantity,
45+
"price": {
46+
"unitPP": 10,
47+
"PPx1": 100,
48+
"currency": "USD",
49+
},
50+
}
51+
],
52+
"order": {"id": commerce_asset_draft_order_id},
53+
"product": {"id": commerce_product_id},
54+
"seller": {"id": seller_id},
55+
}
56+
57+
return factory
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
from contextlib import asynccontextmanager
2+
3+
import pytest
4+
5+
from mpt_api_client.exceptions import MPTAPIError
6+
from mpt_api_client.rql.query_builder import RQLQuery
7+
8+
pytestmark = [pytest.mark.flaky]
9+
10+
11+
@asynccontextmanager
12+
async def async_create_fixture_resource_and_delete(resource_manager, resource_data):
13+
resource = await resource_manager.create(resource_data)
14+
15+
yield resource
16+
17+
try:
18+
await resource_manager.delete(resource.id)
19+
except MPTAPIError as error:
20+
print(f"TEARDOWN - Unable to delete order asset: {getattr(error, 'title', str(error))}") # noqa: WPS421
21+
22+
23+
@pytest.fixture
24+
async def created_order_asset(async_mpt_vendor, order_asset_factory, commerce_asset_draft_order_id):
25+
# Must use this fixture for all tests to prevent api errors
26+
asset_data = order_asset_factory()
27+
orders = async_mpt_vendor.commerce.orders
28+
assets = orders.assets(commerce_asset_draft_order_id)
29+
async with async_create_fixture_resource_and_delete(assets, asset_data) as asset:
30+
yield asset
31+
32+
33+
async def test_get_order_asset_by_id(
34+
async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id
35+
):
36+
asset_id = created_order_asset.id
37+
orders = async_mpt_vendor.commerce.orders.assets(commerce_asset_draft_order_id)
38+
39+
result = await orders.get(asset_id)
40+
41+
assert result is not None
42+
43+
44+
async def test_list_order_assets(
45+
async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id
46+
):
47+
limit = 10
48+
orders = async_mpt_vendor.commerce.orders
49+
assets = orders.assets(commerce_asset_draft_order_id)
50+
51+
result = await assets.fetch_page(limit=limit)
52+
53+
assert result is not None
54+
55+
56+
async def test_get_order_asset_by_id_not_found(
57+
async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id, invalid_asset_id
58+
):
59+
orders = async_mpt_vendor.commerce.orders
60+
assets = orders.assets(commerce_asset_draft_order_id)
61+
62+
with pytest.raises(MPTAPIError, match="404 Not Found"):
63+
await assets.get(invalid_asset_id)
64+
65+
66+
async def test_filter_order_assets(
67+
async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id
68+
):
69+
select_fields = ["-externalIds"]
70+
asset_id = created_order_asset.id
71+
assets = async_mpt_vendor.commerce.orders.assets(commerce_asset_draft_order_id)
72+
filtered_assets = (
73+
assets.filter(RQLQuery(id=asset_id))
74+
.filter(RQLQuery(name="E2E Created Order Asset"))
75+
.select(*select_fields)
76+
)
77+
78+
result = [asset async for asset in filtered_assets.iterate()]
79+
80+
assert len(result) == 1
81+
82+
83+
def test_create_order_asset(created_order_asset):
84+
result = created_order_asset
85+
86+
assert result is not None
87+
88+
89+
async def test_update_order_asset(
90+
async_mpt_vendor,
91+
created_order_asset,
92+
commerce_asset_draft_order_id,
93+
):
94+
asset_id = created_order_asset.id
95+
updated_asset_data = {
96+
"name": "E2E Updated Order Asset",
97+
}
98+
orders = async_mpt_vendor.commerce.orders
99+
assets = orders.assets(commerce_asset_draft_order_id)
100+
101+
result = await assets.update(asset_id, updated_asset_data)
102+
103+
assert result is not None
104+
105+
106+
async def test_delete_order_asset(
107+
async_mpt_vendor,
108+
created_order_asset,
109+
commerce_asset_draft_order_id,
110+
):
111+
asset_id = created_order_asset.id
112+
orders = async_mpt_vendor.commerce.orders
113+
114+
result = orders.assets(commerce_asset_draft_order_id)
115+
116+
await result.delete(asset_id)
117+
118+
119+
async def test_render_order_asset(
120+
async_mpt_vendor,
121+
created_order_asset,
122+
commerce_asset_draft_order_id,
123+
):
124+
asset_id = created_order_asset.id
125+
orders = async_mpt_vendor.commerce.orders
126+
assets = orders.assets(commerce_asset_draft_order_id)
127+
128+
result = await assets.render(asset_id)
129+
130+
assert result is not None

0 commit comments

Comments
 (0)