Skip to content

Commit 454ff27

Browse files
committed
MPT-14886 Add E2E tests for catalog product parameters
1 parent 4baedb0 commit 454ff27

12 files changed

Lines changed: 170 additions & 20 deletions

File tree

e2e_config.test.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
"catalog.product.id": "PRD-7255-3950",
33
"accounts.seller.id": "SEL-7310-3075",
44
"catalog.product.parameter_group.id": "PGR-7255-3950-0001",
5+
"catalog.product.parameter.id": "PAR-8645-3987-0001",
56
"accounts.account.id": "ACC-9042-0088"
67
}

seed/catalog/product.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ async def get_product(
2222
) -> Product | None:
2323
"""Get product from context or fetch from API."""
2424
product_id = context.get_string(f"{namespace}.id")
25+
logger.debug("Getting product: %s", product_id)
2526
if not product_id:
2627
return None
2728
try:
@@ -44,15 +45,17 @@ async def init_product(
4445
) -> Product:
4546
"""Get or create product."""
4647
product = await get_product()
47-
if not product:
48+
if product is None:
4849
logger.debug("Creating product ...")
4950
with pathlib.Path.open(icon, "rb") as icon_file:
5051
product = await mpt_vendor.catalog.products.create(
5152
{"name": "E2E Seeded", "website": "https://www.example.com"}, icon=icon_file
5253
)
5354
context.set_resource(namespace, product)
5455
context[f"{namespace}.id"] = product.id
55-
logger.debug("Product created: %s", product.id)
56+
logger.info("Product created: %s", product.id)
57+
else:
58+
logger.info("Product found: %s", product.id)
5659
return product
5760

5861

seed/catalog/product_parameters.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
logger = logging.getLogger(__name__)
1212

13-
namespace = "catalog.parameter"
13+
namespace = "catalog.product.parameter"
1414

1515

1616
@inject
@@ -35,15 +35,15 @@ async def get_parameter(
3535
@inject
3636
def build_parameter(context: Context = DEFAULT_CONTEXT) -> dict[str, Any]:
3737
"""Build parameter data dictionary."""
38-
parameter_group_id = context.get_string("catalog.parameter_group.id")
38+
parameter_group_id = context.get_string("catalog.product.parameter_group.id")
3939
if not parameter_group_id:
4040
raise ValueError("Parameter group id is required.")
4141
return {
42-
"name": "Parameter Name",
42+
"name": "e2e - seed",
4343
"scope": "Order",
4444
"phase": "Order",
45-
"description": "Agreement identifier of the reseller",
46-
"externalId": "RES-233-33-xx3",
45+
"description": "e2e - seeded parameter",
46+
"externalId": "e2e-seed-parameter",
4747
"displayOrder": 100,
4848
"context": "Purchase",
4949
"constraints": {"hidden": True, "readonly": True, "required": False},
@@ -71,7 +71,7 @@ async def create_parameter(
7171
raise ValueError("Product id is required.")
7272
parameter_data = build_parameter(context=context)
7373
parameter = await mpt_vendor.catalog.products.parameters(product_id).create(parameter_data)
74-
logger.debug("Parameter created: %s", parameter.id)
74+
logger.info("Parameter created: %s", parameter.id)
7575
context[f"{namespace}.id"] = parameter.id
7676
context.set_resource(namespace, parameter)
7777
return parameter
@@ -87,7 +87,7 @@ async def init_parameter(
8787

8888
if not parameter:
8989
logger.debug("Creating parameter ...")
90-
return await create_parameter(context, mpt_vendor)
90+
return await create_parameter(context=context, mpt_vendor=mpt_vendor)
9191
logger.debug("Parameter found: %s", parameter.id)
9292
return parameter
9393

seed/context.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import collections
22
import json
3+
import logging
34
import pathlib
45
from typing import Any
56

67
from mpt_api_client.models import Model
78

9+
logger = logging.getLogger(__name__)
10+
811

912
class Context(collections.UserDict[str, Any]):
1013
"""Application context."""
@@ -45,6 +48,7 @@ def load_context(json_file: pathlib.Path, context: Context | None = None) -> Con
4548
with json_file.open("r", encoding="utf-8") as fd:
4649
existing_data = json.load(fd)
4750
context.update(existing_data)
51+
logger.info("Context loaded: %s", context.items())
4852
return context
4953

5054

seed/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from seed.container import wire_container
55
from seed.seed_api import seed_api
66

7-
logging.basicConfig(level=logging.INFO)
7+
logging.basicConfig(level=logging.DEBUG)
88
logger = logging.getLogger(__name__)
99

1010

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ per-file-ignores =
4949
tests/unit/resources/accounts/test_users.py: WPS204 WPS202 WPS210
5050
tests/unit/test_mpt_client.py: WPS235
5151
tests/e2e/accounts/*.py: WPS430 WPS202
52+
tests/e2e/catalog/*.py: WPS421
5253

5354
tests/*:
5455
# Allow magic strings.

tests/e2e/catalog/product/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,13 @@ def product_icon():
1212
@pytest.fixture
1313
def product_data():
1414
return {"name": "Test Product", "website": "https://www.example.com"}
15+
16+
17+
@pytest.fixture
18+
def parameter_group_id(e2e_config):
19+
return e2e_config["catalog.product.parameter_group.id"]
20+
21+
22+
@pytest.fixture
23+
def parameter_id(e2e_config):
24+
return e2e_config["catalog.product.parameter.id"]

tests/e2e/catalog/product/parameter_groups/conftest.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import pytest
22

33

4-
@pytest.fixture
5-
def parameter_group_id(e2e_config):
6-
return e2e_config["catalog.product.parameter_group.id"]
7-
8-
94
@pytest.fixture
105
def parameter_group_data():
116
return {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def parameter_data(parameter_group_id):
6+
return {
7+
"constraints": {"hidden": False, "readonly": False, "required": False},
8+
"description": "e2e - please delete",
9+
"displayOrder": 100,
10+
"name": "e2e - please delete",
11+
"phase": "Order",
12+
"scope": "Order",
13+
"type": "SingleLineText",
14+
"context": "Purchase",
15+
"options": {
16+
"hintText": "delete",
17+
"defaultValue": "Delete me",
18+
"placeholderText": "Place holder text",
19+
},
20+
"group": {"id": parameter_group_id},
21+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
5+
pytestmark = [pytest.mark.flaky]
6+
7+
8+
@pytest.fixture
9+
async def async_created_parameter(async_mpt_vendor, product_id, parameter_data):
10+
service = async_mpt_vendor.catalog.products.parameters(product_id)
11+
parameter = await service.create(parameter_data)
12+
yield parameter
13+
try:
14+
await service.delete(parameter.id)
15+
except MPTAPIError as error:
16+
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}")
17+
18+
19+
@pytest.mark.asyncio
20+
def test_create_parameter(async_created_parameter):
21+
assert async_created_parameter.name == "e2e - please delete"
22+
23+
24+
@pytest.mark.asyncio
25+
async def test_create_parameter_wrong_data(async_mpt_vendor, product_id):
26+
parameter_data = {"name": "e2e - please delete - wrong data test"}
27+
service = async_mpt_vendor.catalog.products.parameters(product_id)
28+
with pytest.raises(MPTAPIError):
29+
await service.create(parameter_data)
30+
31+
32+
@pytest.mark.asyncio
33+
async def test_update_parameter(async_mpt_vendor, product_id, async_created_parameter):
34+
service = async_mpt_vendor.catalog.products.parameters(product_id)
35+
update_data = {"name": "please delete me"}
36+
parameter = await service.update(async_created_parameter.id, update_data)
37+
assert parameter.name == "please delete me"
38+
39+
40+
@pytest.mark.asyncio
41+
async def test_get_parameter(async_mpt_vendor, product_id, parameter_id):
42+
service = async_mpt_vendor.catalog.products.parameters(product_id)
43+
parameter = await service.get(parameter_id)
44+
assert parameter.id == parameter_id
45+
46+
47+
@pytest.mark.asyncio
48+
async def test_iterate_parameters(async_mpt_vendor, product_id, async_created_parameter):
49+
service = async_mpt_vendor.catalog.products.parameters(product_id)
50+
product_parameters = [product_param async for product_param in service.iterate()]
51+
assert any(parameter.id == async_created_parameter.id for parameter in product_parameters)
52+
53+
54+
@pytest.mark.asyncio
55+
async def test_delete_parameter(async_mpt_vendor, product_id, async_created_parameter):
56+
service = async_mpt_vendor.catalog.products.parameters(product_id)
57+
await service.delete(async_created_parameter.id)
58+
parameter = await service.get(async_created_parameter.id)
59+
assert parameter.status == "Deleted"

0 commit comments

Comments
 (0)