Skip to content

Commit c369447

Browse files
author
Robert Segal
committed
Seeded and created e2e tests for commerce agreements
1 parent 8bd6023 commit c369447

File tree

13 files changed

+332
-21
lines changed

13 files changed

+332
-21
lines changed

e2e_config.test.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
"accounts.seller.id": "SEL-7310-3075",
1212
"accounts.user.id": "USR-9673-3314",
1313
"accounts.user_group.id": "UGR-6822-0561",
14+
"commerce.agreement.id": "AGR-9850-2169-6098",
15+
"commerce.product.id": "PRD-1767-7355",
16+
"commerce.product.item.id": "ITM-1767-7355-0001",
17+
"commerce.product.listing.id": "LST-5489-0806",
18+
"commerce.product.template.id": "TPL-1767-7355-0003",
19+
"commerce.authorization.id": "AUT-0031-2873",
20+
"commerce.client.id": "ACC-1086-6867",
1421
"catalog.product.item.id": "ITM-7255-3950-0751",
1522
"catalog.product.document.id": "PDC-7255-3950-0001",
1623
"catalog.product.id": "PRD-7255-3950",

mpt_api_client/resources/commerce/agreements.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ def template(self, agreement_id: str) -> str:
4444
response = self._resource_do_request(agreement_id, action="template")
4545
return response.text
4646

47+
def render(self, agreement_id: str) -> str:
48+
"""Renders the template for the given Agreement id.
49+
50+
Args:
51+
agreement_id: Agreement ID.
52+
53+
Returns:
54+
Rendered Agreement.
55+
"""
56+
response = self._resource_do_request(agreement_id, action="render")
57+
return response.text
58+
4759
def attachments(self, agreement_id: str) -> AgreementsAttachmentService:
4860
"""Get the attachments service for the given Agreement id.
4961
@@ -79,6 +91,18 @@ async def template(self, agreement_id: str) -> str:
7991
response = await self._resource_do_request(agreement_id, action="template")
8092
return response.text
8193

94+
async def render(self, agreement_id: str) -> str:
95+
"""Renders the template for the given Agreement id.
96+
97+
Args:
98+
agreement_id: Agreement ID.
99+
100+
Returns:
101+
Rendered Agreement.
102+
"""
103+
response = await self._resource_do_request(agreement_id, action="render")
104+
return response.text
105+
82106
def attachments(self, agreement_id: str) -> AsyncAgreementsAttachmentService:
83107
"""Get the attachments service for the given Agreement id.
84108

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ dev = [
4848
"ruff==0.12.11", # force ruff version to have same formatting everywhere
4949
"typing-extensions==4.13.*",
5050
"wemake-python-styleguide==1.3.*",
51+
"types-python-dateutil",
5152
]
5253

5354
[tool.hatch.build.targets.sdist]

tests/e2e/accounts/conftest.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,6 @@ def currencies():
2626
return ["USD", "EUR"]
2727

2828

29-
@pytest.fixture
30-
def account_id(e2e_config):
31-
return e2e_config["accounts.account.id"]
32-
33-
34-
@pytest.fixture
35-
def seller_id(e2e_config):
36-
return e2e_config["accounts.seller.id"]
37-
38-
39-
@pytest.fixture
40-
def buyer_id(e2e_config):
41-
return e2e_config["accounts.buyer.id"]
42-
43-
4429
@pytest.fixture
4530
def user_group_id(e2e_config):
4631
return e2e_config["accounts.user_group.id"]

tests/e2e/accounts/licensees/conftest.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ def licensee_group_id(e2e_config):
1111
return e2e_config["accounts.licensee.group.id"]
1212

1313

14-
@pytest.fixture
15-
def licensee_id(e2e_config):
16-
return e2e_config["accounts.licensee.id"]
17-
18-
1914
@pytest.fixture
2015
def invalid_licensee_id():
2116
return "LCE-0000-0000-0000"
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import pytest
2+
from freezegun import freeze_time
3+
4+
5+
@pytest.fixture
6+
def invalid_agreement_id():
7+
return "AGR-0000-0000"
8+
9+
10+
@pytest.fixture
11+
def agreement_factory( # noqa: WPS211
12+
account_id,
13+
seller_id,
14+
buyer_id,
15+
licensee_id,
16+
commerce_product_id,
17+
authorization_id,
18+
):
19+
@freeze_time("2025-11-14T09:00:00.000Z")
20+
def factory(
21+
name: str = "E2E Created Agreement",
22+
client_external_id: str = "test-client-external-id",
23+
vendor_external_id: str = "test-vendor-external-id",
24+
):
25+
return {
26+
"name": name,
27+
"status": "Active",
28+
"vendor": {"id": account_id},
29+
"authorization": {"id": authorization_id},
30+
"seller": {"id": seller_id},
31+
"buyer": {"id": buyer_id},
32+
"licensee": {"id": licensee_id},
33+
"product": {"id": commerce_product_id},
34+
"value": {
35+
"PPxY": 150,
36+
"PPxM": 12.5,
37+
"SPxY": 165,
38+
"SPxM": 13.75,
39+
"markup": 0.1,
40+
"margin": 0.11,
41+
"currency": "USD",
42+
},
43+
"startDate": "2025-11-14T09:00:00.000Z",
44+
"endDate": "2026-11-13T09:00:00.000Z",
45+
"externalIds": {
46+
"client": client_external_id,
47+
"vendor": vendor_external_id,
48+
},
49+
}
50+
51+
return factory
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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_agreement(async_mpt_ops, agreement_factory):
11+
new_agreement_request_data = agreement_factory(
12+
name="E2E Created Agreement",
13+
)
14+
15+
return await async_mpt_ops.commerce.agreements.create(new_agreement_request_data)
16+
17+
18+
async def test_get_agreement_by_id(async_mpt_ops, agreement_id):
19+
result = await async_mpt_ops.commerce.agreements.get(agreement_id)
20+
21+
assert result is not None
22+
23+
24+
async def test_list_agreements(async_mpt_ops):
25+
limit = 10
26+
27+
result = await async_mpt_ops.commerce.agreements.fetch_page(limit=limit)
28+
29+
assert len(result) > 0
30+
31+
32+
async def test_get_agreement_by_id_not_found(async_mpt_ops, invalid_agreement_id):
33+
result = None
34+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
35+
result = await async_mpt_ops.commerce.agreements.get(invalid_agreement_id)
36+
37+
assert result is None
38+
39+
40+
async def test_filter_agreements(async_mpt_ops, agreement_id):
41+
select_fields = ["-value"]
42+
filtered_agreements = (
43+
async_mpt_ops.commerce.agreements.filter(RQLQuery(id=agreement_id))
44+
.filter(RQLQuery(name="E2E Seeded For Commerce for Test Api Client Client"))
45+
.select(*select_fields)
46+
)
47+
48+
result = [filtered_agreement async for filtered_agreement in filtered_agreements.iterate()]
49+
50+
assert len(result) == 1
51+
52+
53+
def test_create_agreement(created_agreement):
54+
result = created_agreement
55+
56+
assert result is not None
57+
58+
59+
async def test_update_agreement(async_mpt_ops, created_agreement, agreement_factory):
60+
updated_name = "E2E Updated Agreement Name"
61+
updated_agreement_data = agreement_factory(name=updated_name)
62+
63+
result = await async_mpt_ops.commerce.agreements.update(
64+
created_agreement.id, updated_agreement_data
65+
)
66+
67+
assert result is not None
68+
69+
70+
async def test_get_agreement_render(async_mpt_ops, agreement_id):
71+
result = await async_mpt_ops.commerce.agreements.render(agreement_id)
72+
73+
assert result is not None
74+
75+
76+
async def test_get_agreement_template(async_mpt_ops, agreement_id):
77+
result = await async_mpt_ops.commerce.agreements.template(agreement_id)
78+
79+
assert result is not None
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# flake8: noqa: AAA04,AAA05
2+
import pytest
3+
4+
from mpt_api_client.exceptions import MPTAPIError
5+
from mpt_api_client.rql.query_builder import RQLQuery
6+
7+
pytestmark = [pytest.mark.flaky]
8+
9+
10+
@pytest.fixture
11+
def created_agreement(mpt_ops, agreement_factory):
12+
new_agreement_request_data = agreement_factory(
13+
name="E2E Created Agreement",
14+
)
15+
16+
return mpt_ops.commerce.agreements.create(new_agreement_request_data)
17+
18+
19+
def test_get_agreement_by_id(mpt_ops, agreement_id):
20+
result = mpt_ops.commerce.agreements.get(agreement_id)
21+
22+
assert result is not None
23+
24+
25+
def test_list_agreements(mpt_ops):
26+
limit = 10
27+
28+
result = mpt_ops.commerce.agreements.fetch_page(limit=limit)
29+
30+
assert len(result) > 0
31+
32+
33+
def test_get_agreement_by_id_not_found(mpt_ops, invalid_agreement_id):
34+
result = None
35+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
36+
result = mpt_ops.commerce.agreements.get(invalid_agreement_id)
37+
38+
assert result is None # flake8 won't properly validate this even though it's correct
39+
40+
41+
def test_filter_agreements(mpt_ops, agreement_id):
42+
select_fields = ["-value"]
43+
filtered_agreements = (
44+
mpt_ops.commerce.agreements.filter(RQLQuery(id=agreement_id))
45+
.filter(RQLQuery(name="E2E Seeded For Commerce for Test Api Client Client"))
46+
.select(*select_fields)
47+
)
48+
49+
result = list(filtered_agreements.iterate())
50+
51+
assert len(result) == 1
52+
53+
54+
def test_create_agreement(created_agreement):
55+
result = created_agreement
56+
57+
assert result is not None
58+
59+
60+
def test_update_agreement(mpt_ops, created_agreement, agreement_factory):
61+
updated_name = "E2E Updated Agreement Name"
62+
updated_agreement_data = agreement_factory(name=updated_name)
63+
64+
result = mpt_ops.commerce.agreements.update(created_agreement.id, updated_agreement_data)
65+
66+
assert result is not None
67+
68+
69+
def test_get_agreement_render(mpt_ops, agreement_id):
70+
result = mpt_ops.commerce.agreements.render(agreement_id)
71+
72+
assert result is not None
73+
74+
75+
def test_get_agreement_template(mpt_ops, agreement_id):
76+
result = mpt_ops.commerce.agreements.template(agreement_id)
77+
78+
assert result is not None

tests/e2e/commerce/conftest.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def agreement_id(e2e_config):
6+
return e2e_config["commerce.agreement.id"]
7+
8+
9+
@pytest.fixture
10+
def commerce_product_id(e2e_config):
11+
return e2e_config["commerce.product.id"]

tests/e2e/conftest.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,28 @@ def logo_fd():
116116
@pytest.fixture
117117
def user_id(e2e_config):
118118
return e2e_config["accounts.user.id"]
119+
120+
121+
@pytest.fixture
122+
def account_id(e2e_config):
123+
return e2e_config["accounts.account.id"]
124+
125+
126+
@pytest.fixture
127+
def seller_id(e2e_config):
128+
return e2e_config["accounts.seller.id"]
129+
130+
131+
@pytest.fixture
132+
def buyer_id(e2e_config):
133+
return e2e_config["accounts.buyer.id"]
134+
135+
136+
@pytest.fixture
137+
def licensee_id(e2e_config):
138+
return e2e_config["accounts.licensee.id"]
139+
140+
141+
@pytest.fixture
142+
def authorization_id(e2e_config):
143+
return e2e_config["commerce.authorization.id"]

0 commit comments

Comments
 (0)