Skip to content

Commit 00e1538

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

4 files changed

Lines changed: 237 additions & 0 deletions

File tree

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

tests/e2e/helper.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from contextlib import asynccontextmanager, contextmanager
2+
3+
from mpt_api_client import RQLQuery
4+
from mpt_api_client.exceptions import MPTAPIError
5+
6+
7+
@asynccontextmanager
8+
async def async_create_fixture_resource_and_delete(service, resource_data):
9+
resource = await service.create(resource_data)
10+
11+
yield resource
12+
13+
try:
14+
await service.delete(resource.id)
15+
except MPTAPIError as error:
16+
print(f"TEARDOWN - Unable to delete resource {resource}: {error.title}") # noqa: WPS421
17+
18+
19+
@contextmanager
20+
def create_fixture_resource_and_delete(service, resource_data):
21+
resource = service.create(resource_data)
22+
23+
yield resource
24+
25+
try:
26+
service.delete(resource.id)
27+
except MPTAPIError as error:
28+
print(f"TEARDOWN - Unable to delete resource {resource}: {error.title}") # noqa: WPS421
29+
30+
31+
async def assert_async_service_filter_with_iterate(service, filter_by_id, select: list[str] | None):
32+
filtered = service.filter(RQLQuery(id=filter_by_id))
33+
if select:
34+
filtered = filtered.select(*select)
35+
36+
result = [filtered_item async for filtered_item in filtered.iterate()]
37+
38+
assert len(result) == 1
39+
assert result[0].id == filter_by_id
40+
41+
42+
def assert_service_filter_with_iterate(service, filter_by_id, select: list[str] | None):
43+
filtered = service.filter(RQLQuery(id=filter_by_id))
44+
if select:
45+
filtered = filtered.select(*select)
46+
47+
result = list(filtered.iterate())
48+
49+
assert len(result) == 1
50+
assert result[0].id == filter_by_id
51+
52+
53+
def assert_update_resource(service, resource_id, update_field, update_value):
54+
payload = {update_field: update_value}
55+
56+
result = service.update(resource_id, payload)
57+
58+
assert result.id == resource_id
59+
assert result.to_dict().get(update_field) == update_value
60+
61+
62+
async def assert_async_update_resource(service, resource_id, update_field, update_value):
63+
payload = {update_field: update_value}
64+
65+
result = await service.update(resource_id, payload)
66+
67+
assert result.id == resource_id
68+
assert result.to_dict().get(update_field) == update_value

0 commit comments

Comments
 (0)