From 1a62be15a7d52438b44fb8ff279ca1b3e0ebac98 Mon Sep 17 00:00:00 2001 From: Lukasz Lancucki Date: Wed, 10 Jun 2026 15:53:24 +0100 Subject: [PATCH] test(e2e): derive order asset fixture from created order Refactor the commerce order asset e2e fixtures to build the asset request from a real created order instead of many hard-coded fixture values. `order_asset_factory` now takes an `order` argument and reads its lines, id, product, and seller, and `created_order` is moved to the order-level conftest so it can be shared by both order and asset tests. Both the sync and async asset suites build their `created_order_asset` fixture from the created order, and the asset tests scope their requests by the created order's id instead of a hard-coded draft order id, so they operate on the order the asset actually belongs to. This keeps the asset fixture data consistent with the order it belongs to and avoids drift between separately maintained fixtures. Refs MPT-21552. --- pyproject.toml | 4 +- tests/e2e/commerce/order/asset/conftest.py | 37 ++++------------ .../commerce/order/asset/test_async_asset.py | 43 ++++++++----------- .../commerce/order/asset/test_sync_asset.py | 34 +++++++-------- tests/e2e/commerce/order/conftest.py | 30 ++++++++++++- tests/e2e/commerce/order/test_sync_order.py | 7 --- 6 files changed, 74 insertions(+), 81 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 206fd985..822c3298 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -135,8 +135,8 @@ per-file-ignores = [ "tests/e2e/commerce/*.py: WPS202 WPS204 WPS453", "tests/e2e/commerce/agreement/*.py: WPS202", "tests/e2e/commerce/agreement/attachment/*.py: WPS202", - "tests/e2e/commerce/order/*.py: WPS202 WPS204", - "tests/e2e/commerce/order/asset/*.py: WPS211 WPS202", + "tests/e2e/commerce/order/*.py: WPS202 WPS204 WPS211", + "tests/e2e/commerce/order/asset/*.py: WPS211 WPS202 WPS221", "tests/e2e/commerce/subscription/*.py: WPS202", "tests/e2e/helpdesk/chats/links/*.py: WPS221 WPS202", "tests/e2e/program/enrollment/*.py: WPS202 WPS204", diff --git a/tests/e2e/commerce/order/asset/conftest.py b/tests/e2e/commerce/order/asset/conftest.py index db5cc46c..bd6cab32 100644 --- a/tests/e2e/commerce/order/asset/conftest.py +++ b/tests/e2e/commerce/order/asset/conftest.py @@ -17,41 +17,22 @@ def commerce_asset_draft_order_id(e2e_config): @pytest.fixture -def order_asset_factory( - draft_order_asset_agreement_id, - buyer_id, - asset_agreement_line_id, - buyer_account_id, - seller_id, - commerce_product_id, - commerce_asset_draft_order_id, -): +def order_asset_factory(): + def factory( + order: dict, name: str = "E2E Created Order Asset", - quantity: int = 1, external_vendor_id: str = "ext-vendor-id", ): + asset_lines = [line for line in order["lines"] if "Asset" in line["item"]["name"]] + return { "name": name, "externalIds": {"vendor": external_vendor_id}, - "lines": [ - { - "id": asset_agreement_line_id, - "agreement": {"id": draft_order_asset_agreement_id}, - "buyer": {"id": buyer_id}, - "client": {"id": buyer_account_id}, - "oldQuantity": 0, - "quantity": quantity, - "price": { - "unitPP": 10, - "PPx1": 100, - "currency": "USD", - }, - } - ], - "order": {"id": commerce_asset_draft_order_id}, - "product": {"id": commerce_product_id}, - "seller": {"id": seller_id}, + "lines": asset_lines, + "order": {"id": order["id"]}, + "product": {"id": order["product"]["id"]}, + "seller": {"id": order["seller"]["id"]}, } return factory diff --git a/tests/e2e/commerce/order/asset/test_async_asset.py b/tests/e2e/commerce/order/asset/test_async_asset.py index 234b6af1..2f9f5f9f 100644 --- a/tests/e2e/commerce/order/asset/test_async_asset.py +++ b/tests/e2e/commerce/order/asset/test_async_asset.py @@ -26,32 +26,27 @@ async def async_create_fixture_resource_and_delete(resource_manager, resource_da @pytest.fixture -async def created_order_asset(async_mpt_vendor, order_asset_factory, commerce_asset_draft_order_id): - # Must use this fixture for all tests to prevent api errors - asset_data = order_asset_factory() +async def created_order_asset(async_mpt_vendor, order_asset_factory, created_order): + asset_data = order_asset_factory(created_order.to_dict()) orders = async_mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) async with async_create_fixture_resource_and_delete(assets, asset_data) as asset: yield asset -async def test_get_order_asset_by_id( - async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id -): +async def test_get_order_asset_by_id(async_mpt_vendor, created_order, created_order_asset): asset_id = created_order_asset.id - orders = async_mpt_vendor.commerce.orders.assets(commerce_asset_draft_order_id) + assets = async_mpt_vendor.commerce.orders.assets(created_order.id) - result = await orders.get(asset_id) + result = await assets.get(asset_id) assert result is not None -async def test_list_order_assets( - async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id -): +async def test_list_order_assets(async_mpt_vendor, created_order, created_order_asset): limit = 10 orders = async_mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) result = await assets.fetch_page(limit=limit) @@ -59,21 +54,19 @@ async def test_list_order_assets( async def test_get_order_asset_by_id_not_found( - async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id, invalid_asset_id + async_mpt_vendor, created_order, created_order_asset, invalid_asset_id ): orders = async_mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) with pytest.raises(MPTAPIError, match="404 Not Found"): await assets.get(invalid_asset_id) -async def test_filter_order_assets( - async_mpt_vendor, created_order_asset, commerce_asset_draft_order_id -): +async def test_filter_order_assets(async_mpt_vendor, created_order, created_order_asset): select_fields = ["-externalIds"] asset_id = created_order_asset.id - assets = async_mpt_vendor.commerce.orders.assets(commerce_asset_draft_order_id) + assets = async_mpt_vendor.commerce.orders.assets(created_order.id) filtered_assets = ( assets .filter(RQLQuery(id=asset_id)) @@ -94,15 +87,15 @@ def test_create_order_asset(created_order_asset): async def test_update_order_asset( async_mpt_vendor, + created_order, created_order_asset, - commerce_asset_draft_order_id, ): asset_id = created_order_asset.id updated_asset_data = { "name": "E2E Updated Order Asset", } orders = async_mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) result = await assets.update(asset_id, updated_asset_data) @@ -111,25 +104,25 @@ async def test_update_order_asset( async def test_delete_order_asset( async_mpt_vendor, + created_order, created_order_asset, - commerce_asset_draft_order_id, ): asset_id = created_order_asset.id orders = async_mpt_vendor.commerce.orders - result = orders.assets(commerce_asset_draft_order_id) + result = orders.assets(created_order.id) await result.delete(asset_id) async def test_render_order_asset( async_mpt_vendor, + created_order, created_order_asset, - commerce_asset_draft_order_id, ): asset_id = created_order_asset.id orders = async_mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) result = await assets.render(asset_id) diff --git a/tests/e2e/commerce/order/asset/test_sync_asset.py b/tests/e2e/commerce/order/asset/test_sync_asset.py index b6c47941..c782940d 100644 --- a/tests/e2e/commerce/order/asset/test_sync_asset.py +++ b/tests/e2e/commerce/order/asset/test_sync_asset.py @@ -26,28 +26,28 @@ def create_fixture_resource_and_delete(resource_manager, resource_data): @pytest.fixture -def created_order_asset(mpt_vendor, order_asset_factory, commerce_asset_draft_order_id): +def created_order_asset(mpt_vendor, order_asset_factory, created_order): # Must use this fixture for all tests to prevent api errors - asset_data = order_asset_factory() + asset_data = order_asset_factory(created_order.to_dict()) orders = mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) with create_fixture_resource_and_delete(assets, asset_data) as asset: yield asset -def test_get_order_asset_by_id(mpt_vendor, created_order_asset, commerce_asset_draft_order_id): +def test_get_order_asset_by_id(mpt_vendor, created_order, created_order_asset): asset_id = created_order_asset.id - orders = mpt_vendor.commerce.orders.assets(commerce_asset_draft_order_id) + orders = mpt_vendor.commerce.orders.assets(created_order.id) result = orders.get(asset_id) assert result is not None -def test_list_order_assets(mpt_vendor, created_order_asset, commerce_asset_draft_order_id): +def test_list_order_assets(mpt_vendor, created_order, created_order_asset): limit = 10 orders = mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) result = assets.fetch_page(limit=limit) @@ -55,19 +55,19 @@ def test_list_order_assets(mpt_vendor, created_order_asset, commerce_asset_draft def test_get_order_asset_by_id_not_found( - mpt_vendor, created_order_asset, commerce_asset_draft_order_id, invalid_asset_id + mpt_vendor, created_order, created_order_asset, invalid_asset_id ): orders = mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) with pytest.raises(MPTAPIError, match="404 Not Found"): assets.get(invalid_asset_id) -def test_filter_order_assets(mpt_vendor, created_order_asset, commerce_asset_draft_order_id): +def test_filter_order_assets(mpt_vendor, created_order, created_order_asset): select_fields = ["-externalIds"] asset_id = created_order_asset.id - assets = mpt_vendor.commerce.orders.assets(commerce_asset_draft_order_id) + assets = mpt_vendor.commerce.orders.assets(created_order.id) filtered_assets = ( assets .filter(RQLQuery(id=asset_id)) @@ -88,15 +88,15 @@ def test_create_order_asset(created_order_asset): def test_update_order_asset( mpt_vendor, + created_order, created_order_asset, - commerce_asset_draft_order_id, ): asset_id = created_order_asset.id updated_asset_data = { "name": "E2E Updated Order Asset", } orders = mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) result = assets.update(asset_id, updated_asset_data) @@ -105,25 +105,25 @@ def test_update_order_asset( def test_delete_order_asset( mpt_vendor, + created_order, created_order_asset, - commerce_asset_draft_order_id, ): asset_id = created_order_asset.id orders = mpt_vendor.commerce.orders - result = orders.assets(commerce_asset_draft_order_id) + result = orders.assets(created_order.id) result.delete(asset_id) def test_render_order_asset( mpt_vendor, + created_order, created_order_asset, - commerce_asset_draft_order_id, ): asset_id = created_order_asset.id orders = mpt_vendor.commerce.orders - assets = orders.assets(commerce_asset_draft_order_id) + assets = orders.assets(created_order.id) result = assets.render(asset_id) diff --git a/tests/e2e/commerce/order/conftest.py b/tests/e2e/commerce/order/conftest.py index f10d5216..cfc8bcf4 100644 --- a/tests/e2e/commerce/order/conftest.py +++ b/tests/e2e/commerce/order/conftest.py @@ -7,10 +7,22 @@ def invalid_order_id(): return "ORD-0000-0000" +@pytest.fixture +def created_order(mpt_client, order_factory): + new_order_request_data = order_factory() + + return mpt_client.commerce.orders.create(new_order_request_data) + + @pytest.fixture @freeze_time("2025-12-01T10:00:00.000Z") def order_factory( - licensee_id, commerce_product_id, commerce_item_id, authorization_id, certificate_id + licensee_id, + commerce_product_id, + commerce_item_id, + asset_item_id, + authorization_id, + certificate_id, ): def factory( notes: str = "E2E Created Order", @@ -49,7 +61,21 @@ def factory( "SPxY": 15, }, "quantity": line_quantity, - } + }, + { + "item": { + "id": asset_item_id, + "terms": {"model": "quantity", "period": "one-time"}, + }, + "price": { + "currency": "USD", + "unitSP": 15, + "SPx1": None, + "SPxM": 1.25, + "SPxY": 15, + }, + "quantity": line_quantity, + }, ], "certificates": [{"id": certificate_id}], } diff --git a/tests/e2e/commerce/order/test_sync_order.py b/tests/e2e/commerce/order/test_sync_order.py index 4f91fdaf..2ac5d746 100644 --- a/tests/e2e/commerce/order/test_sync_order.py +++ b/tests/e2e/commerce/order/test_sync_order.py @@ -6,13 +6,6 @@ pytestmark = [pytest.mark.flaky] -@pytest.fixture -def created_order(mpt_client, order_factory): - new_order_request_data = order_factory() - - return mpt_client.commerce.orders.create(new_order_request_data) - - @pytest.fixture def processed_order(mpt_client, created_order): return mpt_client.commerce.orders.process(created_order.id)