Skip to content

Commit 74cd8ee

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

4 files changed

Lines changed: 236 additions & 0 deletions

File tree

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