Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions e2e_config.test.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
"catalog.product.id": "PRD-7255-3950",
"accounts.seller.id": "SEL-7310-3075",
"catalog.product.parameter_group.id": "PGR-7255-3950-0001",
"catalog.product.parameter.id": "PAR-7255-3950-0016",
"accounts.account.id": "ACC-9042-0088"
}
7 changes: 5 additions & 2 deletions seed/catalog/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ async def get_product(
) -> Product | None:
"""Get product from context or fetch from API."""
product_id = context.get_string(f"{namespace}.id")
logger.debug("Getting product: %s", product_id)
if not product_id:
return None
try:
Expand All @@ -44,15 +45,17 @@ async def init_product(
) -> Product:
"""Get or create product."""
product = await get_product()
if not product:
if product is None:
logger.debug("Creating product ...")
with pathlib.Path.open(icon, "rb") as icon_file:
product = await mpt_vendor.catalog.products.create(
{"name": "E2E Seeded", "website": "https://www.example.com"}, icon=icon_file
)
context.set_resource(namespace, product)
context[f"{namespace}.id"] = product.id
logger.debug("Product created: %s", product.id)
logger.info("Product created: %s", product.id)
else:
logger.info("Product found: %s", product.id)
return product


Expand Down
14 changes: 7 additions & 7 deletions seed/catalog/product_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

logger = logging.getLogger(__name__)

namespace = "catalog.parameter"
namespace = "catalog.product.parameter"


@inject
Expand All @@ -35,15 +35,15 @@ async def get_parameter(
@inject
def build_parameter(context: Context = DEFAULT_CONTEXT) -> dict[str, Any]:
"""Build parameter data dictionary."""
parameter_group_id = context.get_string("catalog.parameter_group.id")
parameter_group_id = context.get_string("catalog.product.parameter_group.id")
if not parameter_group_id:
raise ValueError("Parameter group id is required.")
return {
"name": "Parameter Name",
"name": "e2e - seed",
"scope": "Order",
"phase": "Order",
"description": "Agreement identifier of the reseller",
"externalId": "RES-233-33-xx3",
"description": "e2e - seeded parameter",
"externalId": "e2e-seed-parameter",
"displayOrder": 100,
"context": "Purchase",
"constraints": {"hidden": True, "readonly": True, "required": False},
Expand Down Expand Up @@ -71,7 +71,7 @@ async def create_parameter(
raise ValueError("Product id is required.")
parameter_data = build_parameter(context=context)
parameter = await mpt_vendor.catalog.products.parameters(product_id).create(parameter_data)
logger.debug("Parameter created: %s", parameter.id)
logger.info("Parameter created: %s", parameter.id)
context[f"{namespace}.id"] = parameter.id
context.set_resource(namespace, parameter)
return parameter
Expand All @@ -87,7 +87,7 @@ async def init_parameter(

if not parameter:
logger.debug("Creating parameter ...")
return await create_parameter(context, mpt_vendor)
return await create_parameter(context=context, mpt_vendor=mpt_vendor)
logger.debug("Parameter found: %s", parameter.id)
return parameter

Expand Down
4 changes: 4 additions & 0 deletions seed/context.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import collections
import json
import logging
import pathlib
from typing import Any

from mpt_api_client.models import Model

logger = logging.getLogger(__name__)


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


Expand Down
2 changes: 1 addition & 1 deletion seed/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from seed.container import wire_container
from seed.seed_api import seed_api

logging.basicConfig(level=logging.INFO)
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)


Expand Down
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ per-file-ignores =
tests/unit/resources/accounts/test_users.py: WPS204 WPS202 WPS210
tests/unit/test_mpt_client.py: WPS235
tests/e2e/accounts/*.py: WPS430 WPS202
tests/e2e/catalog/*.py: WPS421

tests/*:
# Allow magic strings.
Expand Down
10 changes: 10 additions & 0 deletions tests/e2e/catalog/product/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,13 @@ def product_icon():
@pytest.fixture
def product_data():
return {"name": "Test Product", "website": "https://www.example.com"}


@pytest.fixture
def parameter_group_id(e2e_config):
return e2e_config["catalog.product.parameter_group.id"]


@pytest.fixture
def parameter_id(e2e_config):
return e2e_config["catalog.product.parameter.id"]
5 changes: 0 additions & 5 deletions tests/e2e/catalog/product/parameter_groups/conftest.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
import pytest


@pytest.fixture
def parameter_group_id(e2e_config):
return e2e_config["catalog.product.parameter_group.id"]


@pytest.fixture
def parameter_group_data():
return {
Expand Down
21 changes: 21 additions & 0 deletions tests/e2e/catalog/product/parameters/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import pytest


@pytest.fixture
def parameter_data(parameter_group_id):
return {
"constraints": {"hidden": False, "readonly": False, "required": False},
"description": "e2e - please delete",
"displayOrder": 100,
"name": "e2e - please delete",
"phase": "Order",
"scope": "Order",
"type": "SingleLineText",
"context": "Purchase",
"options": {
"hintText": "delete",
"defaultValue": "Delete me",
"placeholderText": "Place holder text",
},
"group": {"id": parameter_group_id},
}
53 changes: 53 additions & 0 deletions tests/e2e/catalog/product/parameters/test_async_parameters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError

pytestmark = [pytest.mark.flaky]


@pytest.fixture
async def async_created_parameter(async_mpt_vendor, product_id, parameter_data):
service = async_mpt_vendor.catalog.products.parameters(product_id)
parameter = await service.create(parameter_data)
yield parameter
try:
await service.delete(parameter.id)
except MPTAPIError as error:
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}")


def test_create_parameter(async_created_parameter):
assert async_created_parameter.name == "e2e - please delete"


async def test_create_parameter_wrong_data(async_mpt_vendor, product_id):
parameter_data = {"name": "e2e - please delete - wrong data test"}
service = async_mpt_vendor.catalog.products.parameters(product_id)
with pytest.raises(MPTAPIError):
await service.create(parameter_data)


async def test_update_parameter(async_mpt_vendor, product_id, async_created_parameter):
service = async_mpt_vendor.catalog.products.parameters(product_id)
update_data = {"name": "please delete me"}
parameter = await service.update(async_created_parameter.id, update_data)
assert parameter.name == "please delete me"


async def test_get_parameter(async_mpt_vendor, product_id, parameter_id):
service = async_mpt_vendor.catalog.products.parameters(product_id)
parameter = await service.get(parameter_id)
assert parameter.id == parameter_id


async def test_iterate_parameters(async_mpt_vendor, product_id, async_created_parameter):
service = async_mpt_vendor.catalog.products.parameters(product_id)
product_parameters = [product_param async for product_param in service.iterate()]
assert any(parameter.id == async_created_parameter.id for parameter in product_parameters)


async def test_delete_parameter(async_mpt_vendor, product_id, async_created_parameter):
service = async_mpt_vendor.catalog.products.parameters(product_id)
await service.delete(async_created_parameter.id)
parameter = await service.get(async_created_parameter.id)
assert parameter.status == "Deleted"
56 changes: 56 additions & 0 deletions tests/e2e/catalog/product/parameters/test_sync_parameters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError

pytestmark = [pytest.mark.flaky]


@pytest.fixture
def created_parameter(mpt_vendor, product_id, parameter_data):
service = mpt_vendor.catalog.products.parameters(product_id)
parameter = service.create(parameter_data)
yield parameter
try:
service.delete(parameter.id)
except MPTAPIError as error:
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}")


def test_create_parameter(created_parameter):
assert created_parameter.name == "e2e - please delete"


def test_create_parameter_wrong_data(mpt_vendor, product_id):
parameter_data = {"name": "e2e - please delete - wrong data test"}
service = mpt_vendor.catalog.products.parameters(product_id)
with pytest.raises(MPTAPIError):
service.create(
parameter_data,
)


def test_update_parameter(mpt_vendor, product_id, created_parameter):
service = mpt_vendor.catalog.products.parameters(product_id)
update_data = {"name": "please delete me"}
parameter = service.update(created_parameter.id, update_data)
assert parameter.name == "please delete me"


def test_get_parameter(mpt_vendor, product_id, parameter_id):
service = mpt_vendor.catalog.products.parameters(product_id)
parameter = service.get(parameter_id)
assert parameter.id == parameter_id


def test_iterate_parameters(mpt_vendor, product_id, created_parameter):
service = mpt_vendor.catalog.products.parameters(product_id)
product_parameters = list(service.iterate())
assert any(parameter.id == created_parameter.id for parameter in product_parameters)


def test_delete_parameter(mpt_vendor, product_id, created_parameter):
service = mpt_vendor.catalog.products.parameters(product_id)
service.delete(created_parameter.id)

parameter = service.get(created_parameter.id)
assert parameter.status == "Deleted"
10 changes: 5 additions & 5 deletions tests/seed/catalog/test_product_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
)
from seed.context import Context

namespace = "catalog.parameter"
namespace = "catalog.product.parameter"


@pytest.fixture
Expand Down Expand Up @@ -55,7 +55,7 @@ async def test_get_parameter_without_id(context: Context) -> None:


def test_build_parameter(context: Context) -> None:
context["catalog.parameter_group.id"] = "group-123"
context["catalog.product.parameter_group.id"] = "group-123"

parameter_payload: dict[str, Any] = build_parameter(context=context)

Expand Down Expand Up @@ -93,16 +93,16 @@ async def test_create_parameter_success(
context: Context, vendor_client: AsyncMock, parameter: Parameter
) -> None:
context["catalog.product.id"] = "product-123"
context["catalog.parameter_group.id"] = "group-123"
context["catalog.product.parameter_group.id"] = "group-123"
service = AsyncMock(spec=AsyncParametersService)
service.create.return_value = parameter
vendor_client.catalog.products.parameters.return_value = service

created = await create_parameter(context=context, mpt_vendor=vendor_client)

assert created == parameter
assert context.get("catalog.parameter.id") == parameter.id
assert context.get(f"catalog.parameter[{parameter.id}]") == parameter
assert context.get("catalog.product.parameter.id") == parameter.id
assert context.get(f"catalog.product.parameter[{parameter.id}]") == parameter


async def test_create_parameter_missing_product(context: Context, vendor_client: AsyncMock) -> None:
Expand Down