Skip to content

Commit 642ea3a

Browse files
author
Robert Segal
committed
Added e2e tests for commerce order subscription
1 parent 0699809 commit 642ea3a

File tree

5 files changed

+261
-0
lines changed

5 files changed

+261
-0
lines changed

e2e_config.test.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
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.agreement.subscription.line.id": "ALI-9850-2169-6098-0001",
2930
"commerce.assets.agreement.id": "AGR-2473-3299-1721",
3031
"commerce.assets.id": "AST-0625-6526-6154",
3132
"commerce.assets.order.id": "ORD-7707-7765-8445",

tests/e2e/commerce/conftest.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pytest
2+
from freezegun import freeze_time
23

34

45
@pytest.fixture
@@ -49,3 +50,47 @@ def asset_item_id(e2e_config):
4950
@pytest.fixture
5051
def asset_agreement_id(e2e_config):
5152
return e2e_config["commerce.assets.agreement.id"]
53+
54+
55+
@pytest.fixture
56+
def subscription_id(e2e_config):
57+
return e2e_config["commerce.subscription.id"]
58+
59+
60+
@pytest.fixture
61+
def agreement_subscription_line_id(e2e_config):
62+
return e2e_config["commerce.agreement.subscription.line.id"]
63+
64+
65+
@pytest.fixture
66+
def invalid_subscription_id():
67+
return "SUB-0000-0000-0000"
68+
69+
70+
@pytest.fixture
71+
def subscription_factory(subscription_agreement_id, subscription_item_id):
72+
@freeze_time("2025-11-14T09:00:00.000Z")
73+
def factory(
74+
name: str = "E2E Created Subscription",
75+
external_vendor_id: str = "ext-vendor-id",
76+
quantity: int = 1,
77+
):
78+
return {
79+
"name": name,
80+
"startDate": "2025-11-03T09:00:00.000Z",
81+
"commitmentDate": "2026-11-02T09:00:00.000Z",
82+
"autoRenew": True,
83+
"agreement": {"id": subscription_agreement_id},
84+
"externalIds": {"vendor": external_vendor_id},
85+
"template": None,
86+
"lines": [
87+
{
88+
"item": {"id": subscription_item_id},
89+
"quantity": quantity,
90+
"price": {"unitPP": 10},
91+
}
92+
],
93+
"parameters": {"fulfillment": []},
94+
}
95+
96+
return factory
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import pytest
2+
from freezegun import freeze_time
3+
4+
5+
@pytest.fixture
6+
def order_subscription_factory(agreement_subscription_line_id):
7+
@freeze_time("2025-11-14T09:00:00.000Z")
8+
def factory(
9+
name: str = "E2E Created Order Subscription",
10+
external_vendor_id: str = "ext-vendor-id",
11+
quantity: int = 1,
12+
):
13+
return {
14+
"name": name,
15+
"startDate": "2025-11-03T09:00:00.000Z",
16+
"commitmentDate": "2026-11-02T09:00:00.000Z",
17+
"autoRenew": True,
18+
"externalIds": {"vendor": external_vendor_id},
19+
"template": None,
20+
"lines": [{"id": agreement_subscription_line_id}],
21+
"parameters": {"fulfillment": []},
22+
}
23+
24+
return factory
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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_order_subscription(async_mpt_vendor, order_subscription_factory, order_id):
11+
# Must use this fixture for all tests to prevent api failures
12+
subscription_data = order_subscription_factory()
13+
orders = async_mpt_vendor.commerce.orders
14+
subscriptions = orders.subscriptions(order_id)
15+
subscription = await subscriptions.create(subscription_data)
16+
17+
yield subscription
18+
19+
try:
20+
await subscriptions.delete(subscription.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to delete subscription: {getattr(error, 'title', str(error))}") # noqa: WPS421
23+
24+
25+
async def test_get_order_subscription_by_id(async_mpt_vendor, created_order_subscription, order_id):
26+
subscription_id = created_order_subscription.id
27+
subscriptions = async_mpt_vendor.commerce.orders.subscriptions(order_id)
28+
29+
result = await subscriptions.get(subscription_id)
30+
31+
assert result is not None
32+
33+
34+
async def test_list_order_subscriptions(async_mpt_vendor, created_order_subscription, order_id):
35+
limit = 10
36+
orders = async_mpt_vendor.commerce.orders
37+
subscriptions = orders.subscriptions(order_id)
38+
39+
result = await subscriptions.fetch_page(limit=limit)
40+
41+
assert result is not None
42+
43+
44+
async def test_get_order_subscription_by_id_not_found(
45+
async_mpt_vendor, created_order_subscription, order_id, invalid_subscription_id
46+
):
47+
orders = async_mpt_vendor.commerce.orders
48+
subscriptions = orders.subscriptions(order_id)
49+
50+
with pytest.raises(MPTAPIError, match="404 Not Found"):
51+
await subscriptions.get(invalid_subscription_id)
52+
53+
54+
async def test_filter_order_subscriptions(
55+
async_mpt_vendor, created_order_subscription, order_id, subscription_id
56+
):
57+
select_fields = ["-externalIds"]
58+
subscription_id = created_order_subscription.id
59+
subscriptions = async_mpt_vendor.commerce.orders.subscriptions(order_id)
60+
filtered_subscriptions = (
61+
subscriptions.filter(RQLQuery(id=subscription_id))
62+
.filter(RQLQuery(name="E2E Created Order Subscription"))
63+
.select(*select_fields)
64+
)
65+
66+
result = [subscription async for subscription in filtered_subscriptions.iterate()]
67+
68+
assert len(result) == 1
69+
70+
71+
def test_create_order_subscription(created_order_subscription):
72+
result = created_order_subscription
73+
74+
assert result is not None
75+
76+
77+
async def test_update_order_subscription(async_mpt_vendor, created_order_subscription, order_id):
78+
subscription_id = created_order_subscription.id
79+
updated_subscription_data = {
80+
"name": "E2E Updated Order Subscription",
81+
}
82+
orders = async_mpt_vendor.commerce.orders
83+
subscriptions = orders.subscriptions(order_id)
84+
85+
result = await subscriptions.update(subscription_id, updated_subscription_data)
86+
87+
assert result is not None
88+
89+
90+
async def test_delete_order_subscription(async_mpt_vendor, created_order_subscription, order_id):
91+
subscription_id = created_order_subscription.id
92+
orders = async_mpt_vendor.commerce.orders
93+
94+
subscriptions = orders.subscriptions(order_id)
95+
await subscriptions.delete(subscription_id)
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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_order_subscription(mpt_vendor, order_subscription_factory, order_id):
11+
# Must use this fixture for all tests to prevent api failures
12+
subscription_data = order_subscription_factory()
13+
orders = mpt_vendor.commerce.orders
14+
subscriptions = orders.subscriptions(order_id)
15+
subscription = subscriptions.create(subscription_data)
16+
17+
yield subscription
18+
19+
try:
20+
subscriptions.delete(subscription.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to delete subscription: {getattr(error, 'title', str(error))}") # noqa: WPS421
23+
24+
25+
def test_get_order_subscription_by_id(mpt_vendor, created_order_subscription, order_id):
26+
subscription_id = created_order_subscription.id
27+
subscriptions = mpt_vendor.commerce.orders.subscriptions(order_id)
28+
29+
result = subscriptions.get(subscription_id)
30+
31+
assert result is not None
32+
33+
34+
def test_list_order_subscriptions(mpt_vendor, created_order_subscription, order_id):
35+
limit = 10
36+
orders = mpt_vendor.commerce.orders
37+
subscriptions = orders.subscriptions(order_id)
38+
39+
result = subscriptions.fetch_page(limit=limit)
40+
41+
assert result is not None
42+
43+
44+
def test_get_order_subscription_by_id_not_found(
45+
mpt_vendor, created_order_subscription, order_id, invalid_subscription_id
46+
):
47+
orders = mpt_vendor.commerce.orders
48+
subscriptions = orders.subscriptions(order_id)
49+
50+
with pytest.raises(MPTAPIError, match="404 Not Found"):
51+
subscriptions.get(invalid_subscription_id)
52+
53+
54+
def test_filter_order_subscriptions(
55+
mpt_vendor, created_order_subscription, order_id, subscription_id
56+
):
57+
select_fields = ["-externalIds"]
58+
subscription_id = created_order_subscription.id
59+
subscriptions = mpt_vendor.commerce.orders.subscriptions(order_id)
60+
filtered_subscriptions = (
61+
subscriptions.filter(RQLQuery(id=subscription_id))
62+
.filter(RQLQuery(name="E2E Created Order Subscription"))
63+
.select(*select_fields)
64+
)
65+
66+
result = list(filtered_subscriptions.iterate())
67+
68+
assert len(result) == 1
69+
70+
71+
def test_create_order_subscription(created_order_subscription):
72+
result = created_order_subscription
73+
74+
assert result is not None
75+
76+
77+
def test_update_order_subscription(mpt_vendor, created_order_subscription, order_id):
78+
subscription_id = created_order_subscription.id
79+
updated_subscription_data = {
80+
"name": "E2E Updated Order Subscription",
81+
}
82+
orders = mpt_vendor.commerce.orders
83+
subscriptions = orders.subscriptions(order_id)
84+
85+
result = subscriptions.update(subscription_id, updated_subscription_data)
86+
87+
assert result is not None
88+
89+
90+
def test_delete_order_subscription(mpt_vendor, created_order_subscription, order_id):
91+
subscription_id = created_order_subscription.id
92+
orders = mpt_vendor.commerce.orders
93+
94+
result = orders.subscriptions(order_id)
95+
96+
result.delete(subscription_id)

0 commit comments

Comments
 (0)