From c17a8708fa692b8fcbf2a423c1f616d2b35e19c9 Mon Sep 17 00:00:00 2001 From: Albert Sola Date: Tue, 2 Dec 2025 15:44:53 +0000 Subject: [PATCH] MPT-14896 E2E for catalog price list items --- .../resources/catalog/price_list_items.py | 12 ++++-- .../e2e/catalog/price_lists/items/conftest.py | 26 ++++++++++++ .../items/test_async_price_list_items.py | 42 +++++++++++++++++++ .../items/test_sync_price_list_items.py | 40 ++++++++++++++++++ .../catalog/test_price_list_items.py | 4 +- 5 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 tests/e2e/catalog/price_lists/items/conftest.py create mode 100644 tests/e2e/catalog/price_lists/items/test_async_price_list_items.py create mode 100644 tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py diff --git a/mpt_api_client/resources/catalog/price_list_items.py b/mpt_api_client/resources/catalog/price_list_items.py index 496f0794..ece16562 100644 --- a/mpt_api_client/resources/catalog/price_list_items.py +++ b/mpt_api_client/resources/catalog/price_list_items.py @@ -1,9 +1,11 @@ from mpt_api_client.http import AsyncService, Service from mpt_api_client.http.mixins import ( AsyncCollectionMixin, - AsyncManagedResourceMixin, + AsyncGetMixin, + AsyncUpdateMixin, CollectionMixin, - ManagedResourceMixin, + GetMixin, + UpdateMixin, ) from mpt_api_client.models import Model @@ -21,7 +23,8 @@ class PriceListItemsServiceConfig: class PriceListItemsService( - ManagedResourceMixin[PriceListItem], + GetMixin[PriceListItem], + UpdateMixin[PriceListItem], CollectionMixin[PriceListItem], Service[PriceListItem], PriceListItemsServiceConfig, @@ -30,7 +33,8 @@ class PriceListItemsService( class AsyncPriceListItemsService( - AsyncManagedResourceMixin[PriceListItem], + AsyncGetMixin[PriceListItem], + AsyncUpdateMixin[PriceListItem], AsyncCollectionMixin[PriceListItem], AsyncService[PriceListItem], PriceListItemsServiceConfig, diff --git a/tests/e2e/catalog/price_lists/items/conftest.py b/tests/e2e/catalog/price_lists/items/conftest.py new file mode 100644 index 00000000..effaa340 --- /dev/null +++ b/tests/e2e/catalog/price_lists/items/conftest.py @@ -0,0 +1,26 @@ +import pytest + + +@pytest.fixture +def price_list_items_service(mpt_ops, price_list_id): + return mpt_ops.catalog.price_lists.items(price_list_id) + + +@pytest.fixture +def async_price_list_items_service(async_mpt_ops, price_list_id): + return async_mpt_ops.catalog.price_lists.items(price_list_id) + + +@pytest.fixture +def price_list_item_data(short_uuid): + return { + "reasonForChange": f"Updated {short_uuid}", + "unitPP": 10, + "unitLP": 10, + } + + +@pytest.fixture +def price_list_item(price_list_items_service): + price_list_items = price_list_items_service.fetch_page(1) + return price_list_items[0] diff --git a/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py b/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py new file mode 100644 index 00000000..051f8f85 --- /dev/null +++ b/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py @@ -0,0 +1,42 @@ +import pytest + +from mpt_api_client.exceptions import MPTAPIError +from tests.e2e.helper import ( + assert_async_service_filter_with_iterate, +) + +pytestmark = [pytest.mark.flaky] + + +async def test_get_price_list_item(async_price_list_items_service, price_list_item): + result = await async_price_list_items_service.get(price_list_item.id) + + assert result.id == price_list_item.id + + +async def test_filter_price_list_items(async_price_list_items_service, price_list_item): + await assert_async_service_filter_with_iterate( + async_price_list_items_service, price_list_item.id, ["-notes"] + ) # act + + +async def test_update_price_list_item( + async_price_list_items_service, price_list_item, price_list_item_data +): + result = await async_price_list_items_service.update(price_list_item.id, price_list_item_data) + + assert result.reason_for_change == price_list_item_data["reasonForChange"] + + +async def test_get_price_list_item_not_found(async_price_list_items_service): + bogus_id = "PRI-0000-NOTFOUND" + + with pytest.raises(MPTAPIError, match=r"404 Not Found"): + await async_price_list_items_service.get(bogus_id) + + +async def test_create_price_list_item_invalid_data(async_price_list_items_service, price_list_item): + invalid_data = {"unitPP": "0"} + + with pytest.raises(MPTAPIError, match=r"400 Bad Request"): + await async_price_list_items_service.update(price_list_item.id, invalid_data) diff --git a/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py b/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py new file mode 100644 index 00000000..e1a7601d --- /dev/null +++ b/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py @@ -0,0 +1,40 @@ +import pytest + +from mpt_api_client.exceptions import MPTAPIError +from tests.e2e.helper import ( + assert_service_filter_with_iterate, +) + +pytestmark = [pytest.mark.flaky] + + +def test_get_price_list_item(price_list_items_service, price_list_item): + result = price_list_items_service.get(price_list_item.id) + + assert result.id == price_list_item.id + + +def test_filter_price_list_items(price_list_items_service, price_list_item): + assert_service_filter_with_iterate( + price_list_items_service, price_list_item.id, ["-notes"] + ) # act + + +def test_update_price_list_item(price_list_items_service, price_list_item, price_list_item_data): + result = price_list_items_service.update(price_list_item.id, price_list_item_data) + + assert result.reason_for_change == price_list_item_data["reasonForChange"] + + +def test_get_price_list_item_not_found(price_list_items_service): + bogus_id = "PRI-0000-NOTFOUND" + + with pytest.raises(MPTAPIError, match=r"404 Not Found"): + price_list_items_service.get(bogus_id) + + +def test_create_price_list_item_invalid_data(price_list_items_service, price_list_item): + invalid_data = {"unitPP": "0"} + + with pytest.raises(MPTAPIError, match=r"400 Bad Request"): + price_list_items_service.update(price_list_item.id, invalid_data) diff --git a/tests/unit/resources/catalog/test_price_list_items.py b/tests/unit/resources/catalog/test_price_list_items.py index 3e7480f8..82c49bc8 100644 --- a/tests/unit/resources/catalog/test_price_list_items.py +++ b/tests/unit/resources/catalog/test_price_list_items.py @@ -36,14 +36,14 @@ def async_test_endpoint(async_price_list_items_service): assert result is True -@pytest.mark.parametrize("method", ["get", "create", "delete", "update"]) +@pytest.mark.parametrize("method", ["get", "update"]) def test_methods_present(price_list_items_service, method): result = hasattr(price_list_items_service, method) assert result is True -@pytest.mark.parametrize("method", ["get", "create", "delete", "update"]) +@pytest.mark.parametrize("method", ["get", "update"]) def test_async_methods_present(async_price_list_items_service, method): result = hasattr(async_price_list_items_service, method)