Skip to content

Commit f6a3967

Browse files
committed
MPT-14896 E2E for catalog/price_lists
1 parent 9976f92 commit f6a3967

4 files changed

Lines changed: 213 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
5+
6+
@pytest.fixture
7+
def price_list_data(product_id):
8+
return {
9+
"notes": "e2e - price list please delete",
10+
"defaultMarkup": "20.0",
11+
"product": {"id": product_id},
12+
"currency": "USD",
13+
"default": False,
14+
}
15+
16+
17+
@pytest.fixture
18+
def price_lists_service(mpt_ops):
19+
return mpt_ops.catalog.price_lists
20+
21+
22+
@pytest.fixture
23+
def created_price_list(price_lists_service, price_list_data):
24+
price_list = price_lists_service.create(price_list_data)
25+
26+
yield price_list
27+
28+
try:
29+
price_lists_service.delete(price_list.id)
30+
except MPTAPIError as error:
31+
print(f"TEARDOWN - Unable to delete price list {price_list.id}: {error.title}")
32+
33+
34+
@pytest.fixture
35+
def price_list_id(created_price_list):
36+
return created_price_list.id
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import pytest
2+
from e2e.helper import assert_async_service_filter_with_iterate, assert_async_update_resource
3+
4+
from mpt_api_client.exceptions import MPTAPIError
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
def async_price_lists_service(async_mpt_ops):
11+
return async_mpt_ops.catalog.price_lists
12+
13+
14+
@pytest.fixture
15+
async def async_created_price_list(async_price_lists_service, price_list_data):
16+
price_list = await async_price_lists_service.create(price_list_data)
17+
18+
yield price_list
19+
20+
try:
21+
await async_price_lists_service.delete(price_list.id)
22+
except MPTAPIError as error:
23+
print(f"TEARDOWN - Unable to delete price list {price_list.id}: {error.title}")
24+
25+
26+
def test_create_price_list(async_created_price_list, product_id):
27+
result = async_created_price_list
28+
29+
assert result.product.id == product_id
30+
31+
32+
async def test_get_price_list(async_price_lists_service, async_created_price_list):
33+
result = await async_price_lists_service.get(async_created_price_list.id)
34+
35+
assert result.id == async_created_price_list.id
36+
37+
38+
async def test_get_price_list_by_id(async_price_lists_service, price_list_id):
39+
result = await async_price_lists_service.get(price_list_id)
40+
41+
assert result.id == price_list_id
42+
43+
44+
async def test_filter_price_lists(async_price_lists_service, async_created_price_list):
45+
await assert_async_service_filter_with_iterate(
46+
async_price_lists_service, async_created_price_list.id, ["-product"]
47+
) # act
48+
49+
50+
async def test_update_price_list(async_price_lists_service, async_created_price_list, short_uuid):
51+
await assert_async_update_resource(
52+
async_price_lists_service,
53+
async_created_price_list.id,
54+
"notes",
55+
f"Updated notes {short_uuid}",
56+
) # act
57+
58+
59+
async def test_delete_price_list(async_price_lists_service, async_created_price_list):
60+
await async_price_lists_service.delete(async_created_price_list.id) # act
61+
62+
63+
async def test_get_price_list_not_found(async_price_lists_service):
64+
bogus_id = "PRL-0000-NOTFOUND"
65+
66+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
67+
await async_price_lists_service.get(bogus_id)
68+
69+
70+
async def test_create_price_list_invalid_data(async_price_lists_service):
71+
invalid_data = {"name": "e2e - delete me"}
72+
73+
with pytest.raises(MPTAPIError, match=r"400 One or more validation errors occurred"):
74+
await async_price_lists_service.create(invalid_data)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import pytest
2+
from e2e.helper import assert_service_filter_with_iterate, assert_update_resource
3+
4+
from mpt_api_client.exceptions import MPTAPIError
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
def test_create_price_list(created_price_list, product_id):
10+
result = created_price_list
11+
12+
assert result.product.id == product_id
13+
14+
15+
def test_get_price_list(price_lists_service, created_price_list):
16+
result = price_lists_service.get(created_price_list.id)
17+
18+
assert result.id == created_price_list.id
19+
20+
21+
def test_get_price_list_by_id(price_lists_service, price_list_id):
22+
result = price_lists_service.get(price_list_id)
23+
24+
assert result.id == price_list_id
25+
26+
27+
def test_iterate_price_lists(price_lists_service, created_price_list):
28+
price_lists = list(price_lists_service.iterate())
29+
30+
result = any(price_list.id == created_price_list.id for price_list in price_lists)
31+
32+
assert result is True
33+
34+
35+
def test_filter_price_lists(price_lists_service, created_price_list):
36+
assert_service_filter_with_iterate(
37+
price_lists_service, created_price_list.id, ["-product"]
38+
) # act
39+
40+
41+
def test_update_price_list(price_lists_service, created_price_list, short_uuid):
42+
assert_update_resource(
43+
price_lists_service, created_price_list.id, "notes", f"Updated notes {short_uuid}"
44+
) # act
45+
46+
47+
def test_delete_price_list(price_lists_service, created_price_list):
48+
price_lists_service.delete(created_price_list.id) # act
49+
50+
51+
def test_get_price_list_not_found(price_lists_service):
52+
bogus_id = "PRL-0000-NOTFOUND"
53+
54+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
55+
price_lists_service.get(bogus_id)
56+
57+
58+
def test_create_price_list_invalid_data(price_lists_service):
59+
invalid_data = {"name": "e2e - delete me"}
60+
61+
with pytest.raises(MPTAPIError, match=r"400 One or more validation errors occurred"):
62+
price_lists_service.create(invalid_data)

tests/e2e/helper.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from mpt_api_client import RQLQuery
2+
3+
4+
async def assert_async_service_filter_with_iterate(service, filter_by_id, select: list[str] | None):
5+
filtered = service.filter(RQLQuery(id=filter_by_id))
6+
if select:
7+
filtered = filtered.select(*select)
8+
9+
result = [filtered_item async for filtered_item in filtered.iterate()]
10+
11+
assert len(result) == 1
12+
assert result[0].id == filter_by_id
13+
14+
15+
def assert_service_filter_with_iterate(service, filter_by_id, select: list[str] | None):
16+
filtered = service.filter(RQLQuery(id=filter_by_id))
17+
if select:
18+
filtered = filtered.select(*select)
19+
20+
result = list(filtered.iterate())
21+
22+
assert len(result) == 1
23+
assert result[0].id == filter_by_id
24+
25+
26+
def assert_update_resource(service, resource_id, update_field, update_value):
27+
payload = {update_field: update_value}
28+
29+
result = service.update(resource_id, payload)
30+
31+
assert result.id == resource_id
32+
assert result.to_dict().get(update_field) == update_value
33+
34+
35+
async def assert_async_update_resource(service, resource_id, update_field, update_value):
36+
payload = {update_field: update_value}
37+
38+
result = await service.update(resource_id, payload)
39+
40+
assert result.id == resource_id
41+
assert result.to_dict().get(update_field) == update_value

0 commit comments

Comments
 (0)