Skip to content

Commit c24cde9

Browse files
authored
MPT-14896 E2E for catalog price list items (#142)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Streamlined price list items service to support GET and UPDATE operations. * **Tests** * Added comprehensive end-to-end and unit test coverage for price list items retrieval, filtering, updates, and error handling scenarios. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
2 parents 8f72e0c + c17a870 commit c24cde9

5 files changed

Lines changed: 118 additions & 6 deletions

File tree

mpt_api_client/resources/catalog/price_list_items.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from mpt_api_client.http import AsyncService, Service
22
from mpt_api_client.http.mixins import (
33
AsyncCollectionMixin,
4-
AsyncManagedResourceMixin,
4+
AsyncGetMixin,
5+
AsyncUpdateMixin,
56
CollectionMixin,
6-
ManagedResourceMixin,
7+
GetMixin,
8+
UpdateMixin,
79
)
810
from mpt_api_client.models import Model
911

@@ -21,7 +23,8 @@ class PriceListItemsServiceConfig:
2123

2224

2325
class PriceListItemsService(
24-
ManagedResourceMixin[PriceListItem],
26+
GetMixin[PriceListItem],
27+
UpdateMixin[PriceListItem],
2528
CollectionMixin[PriceListItem],
2629
Service[PriceListItem],
2730
PriceListItemsServiceConfig,
@@ -30,7 +33,8 @@ class PriceListItemsService(
3033

3134

3235
class AsyncPriceListItemsService(
33-
AsyncManagedResourceMixin[PriceListItem],
36+
AsyncGetMixin[PriceListItem],
37+
AsyncUpdateMixin[PriceListItem],
3438
AsyncCollectionMixin[PriceListItem],
3539
AsyncService[PriceListItem],
3640
PriceListItemsServiceConfig,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def price_list_items_service(mpt_ops, price_list_id):
6+
return mpt_ops.catalog.price_lists.items(price_list_id)
7+
8+
9+
@pytest.fixture
10+
def async_price_list_items_service(async_mpt_ops, price_list_id):
11+
return async_mpt_ops.catalog.price_lists.items(price_list_id)
12+
13+
14+
@pytest.fixture
15+
def price_list_item_data(short_uuid):
16+
return {
17+
"reasonForChange": f"Updated {short_uuid}",
18+
"unitPP": 10,
19+
"unitLP": 10,
20+
}
21+
22+
23+
@pytest.fixture
24+
def price_list_item(price_list_items_service):
25+
price_list_items = price_list_items_service.fetch_page(1)
26+
return price_list_items[0]
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
)
7+
8+
pytestmark = [pytest.mark.flaky]
9+
10+
11+
async def test_get_price_list_item(async_price_list_items_service, price_list_item):
12+
result = await async_price_list_items_service.get(price_list_item.id)
13+
14+
assert result.id == price_list_item.id
15+
16+
17+
async def test_filter_price_list_items(async_price_list_items_service, price_list_item):
18+
await assert_async_service_filter_with_iterate(
19+
async_price_list_items_service, price_list_item.id, ["-notes"]
20+
) # act
21+
22+
23+
async def test_update_price_list_item(
24+
async_price_list_items_service, price_list_item, price_list_item_data
25+
):
26+
result = await async_price_list_items_service.update(price_list_item.id, price_list_item_data)
27+
28+
assert result.reason_for_change == price_list_item_data["reasonForChange"]
29+
30+
31+
async def test_get_price_list_item_not_found(async_price_list_items_service):
32+
bogus_id = "PRI-0000-NOTFOUND"
33+
34+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
35+
await async_price_list_items_service.get(bogus_id)
36+
37+
38+
async def test_create_price_list_item_invalid_data(async_price_list_items_service, price_list_item):
39+
invalid_data = {"unitPP": "0"}
40+
41+
with pytest.raises(MPTAPIError, match=r"400 Bad Request"):
42+
await async_price_list_items_service.update(price_list_item.id, invalid_data)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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+
)
7+
8+
pytestmark = [pytest.mark.flaky]
9+
10+
11+
def test_get_price_list_item(price_list_items_service, price_list_item):
12+
result = price_list_items_service.get(price_list_item.id)
13+
14+
assert result.id == price_list_item.id
15+
16+
17+
def test_filter_price_list_items(price_list_items_service, price_list_item):
18+
assert_service_filter_with_iterate(
19+
price_list_items_service, price_list_item.id, ["-notes"]
20+
) # act
21+
22+
23+
def test_update_price_list_item(price_list_items_service, price_list_item, price_list_item_data):
24+
result = price_list_items_service.update(price_list_item.id, price_list_item_data)
25+
26+
assert result.reason_for_change == price_list_item_data["reasonForChange"]
27+
28+
29+
def test_get_price_list_item_not_found(price_list_items_service):
30+
bogus_id = "PRI-0000-NOTFOUND"
31+
32+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
33+
price_list_items_service.get(bogus_id)
34+
35+
36+
def test_create_price_list_item_invalid_data(price_list_items_service, price_list_item):
37+
invalid_data = {"unitPP": "0"}
38+
39+
with pytest.raises(MPTAPIError, match=r"400 Bad Request"):
40+
price_list_items_service.update(price_list_item.id, invalid_data)

tests/unit/resources/catalog/test_price_list_items.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ def async_test_endpoint(async_price_list_items_service):
3636
assert result is True
3737

3838

39-
@pytest.mark.parametrize("method", ["get", "create", "delete", "update"])
39+
@pytest.mark.parametrize("method", ["get", "update"])
4040
def test_methods_present(price_list_items_service, method):
4141
result = hasattr(price_list_items_service, method)
4242

4343
assert result is True
4444

4545

46-
@pytest.mark.parametrize("method", ["get", "create", "delete", "update"])
46+
@pytest.mark.parametrize("method", ["get", "update"])
4747
def test_async_methods_present(async_price_list_items_service, method):
4848
result = hasattr(async_price_list_items_service, method)
4949

0 commit comments

Comments
 (0)