Skip to content

Commit e9db3ed

Browse files
authored
MPT-13318 Add catalog product parameters (#32)
2 parents 0845d3c + d28cf35 commit e9db3ed

File tree

8 files changed

+131
-30
lines changed

8 files changed

+131
-30
lines changed

mpt_api_client/resources/catalog/products.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
AsyncParameterGroupsService,
1616
ParameterGroupsService,
1717
)
18+
from mpt_api_client.resources.catalog.products_parameters import (
19+
AsyncParametersService,
20+
ParametersService,
21+
)
1822

1923

2024
class Product(Model):
@@ -45,6 +49,12 @@ def parameter_groups(self, product_id: str) -> ParameterGroupsService:
4549
http_client=self.http_client, endpoint_params={"product_id": product_id}
4650
)
4751

52+
def product_parameters(self, product_id: str) -> ParametersService:
53+
"""Return product_parameters service."""
54+
return ParametersService(
55+
http_client=self.http_client, endpoint_params={"product_id": product_id}
56+
)
57+
4858

4959
class AsyncProductsService(
5060
AsyncCreateMixin[Product],
@@ -61,3 +71,9 @@ def parameter_groups(self, product_id: str) -> AsyncParameterGroupsService:
6171
return AsyncParameterGroupsService(
6272
http_client=self.http_client, endpoint_params={"product_id": product_id}
6373
)
74+
75+
def product_parameters(self, product_id: str) -> AsyncParametersService:
76+
"""Return product_parameters service."""
77+
return AsyncParametersService(
78+
http_client=self.http_client, endpoint_params={"product_id": product_id}
79+
)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from mpt_api_client.http import AsyncService, CreateMixin, DeleteMixin, Service
2+
from mpt_api_client.http.mixins import (
3+
AsyncCreateMixin,
4+
AsyncDeleteMixin,
5+
AsyncUpdateMixin,
6+
UpdateMixin,
7+
)
8+
from mpt_api_client.models import Model
9+
10+
11+
class Parameter(Model):
12+
"""Parameter resource."""
13+
14+
15+
class ParametersServiceConfig:
16+
"""Parameters service configuration."""
17+
18+
_endpoint = "/public/v1/catalog/products/{product_id}/parameters"
19+
_model_class = Parameter
20+
_collection_key = "data"
21+
22+
23+
class ParametersService(
24+
CreateMixin[Parameter],
25+
DeleteMixin,
26+
UpdateMixin[Parameter],
27+
Service[Parameter],
28+
ParametersServiceConfig,
29+
):
30+
"""Parameters service."""
31+
32+
33+
class AsyncParametersService(
34+
AsyncCreateMixin[Parameter],
35+
AsyncDeleteMixin,
36+
AsyncUpdateMixin[Parameter],
37+
AsyncService[Parameter],
38+
ParametersServiceConfig,
39+
):
40+
"""Parameters service."""

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ per-file-ignores =
3636
mpt_api_client/resources/catalog/products.py: WPS215
3737
mpt_api_client/resources/catalog/items.py: WPS215
3838
mpt_api_client/resources/catalog/products_parameter_groups.py: WPS215
39+
mpt_api_client/resources/catalog/products_parameters.py: WPS215
3940
tests/http/test_async_service.py: WPS204 WPS202
4041
tests/http/test_service.py: WPS204 WPS202
4142

tests/resources/catalog/test_catalog.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Any
2-
31
import pytest
42

53
from mpt_api_client.resources.catalog.catalog import AsyncCatalog, Catalog
@@ -8,12 +6,12 @@
86

97

108
@pytest.fixture
11-
def catalog(http_client: Any) -> Catalog:
9+
def catalog(http_client):
1210
return Catalog(http_client=http_client)
1311

1412

1513
@pytest.fixture
16-
def async_catalog(async_http_client: Any) -> AsyncCatalog:
14+
def async_catalog(async_http_client):
1715
return AsyncCatalog(http_client=async_http_client)
1816

1917

@@ -24,9 +22,7 @@ def async_catalog(async_http_client: Any) -> AsyncCatalog:
2422
("items", ItemsService),
2523
],
2624
)
27-
def test_catalog_properties(
28-
catalog: Catalog, property_name: str, expected_service_class: type
29-
) -> None:
25+
def test_catalog_properties(catalog, property_name, expected_service_class):
3026
"""Test that Catalog properties return correct instances."""
3127
service = getattr(catalog, property_name)
3228

@@ -41,25 +37,23 @@ def test_catalog_properties(
4137
("items", AsyncItemsService),
4238
],
4339
)
44-
def test_async_catalog_properties(
45-
async_catalog: AsyncCatalog, property_name: str, expected_service_class: type
46-
) -> None:
40+
def test_async_catalog_properties(async_catalog, property_name, expected_service_class):
4741
"""Test that AsyncCatalog properties return correct instances."""
4842
service = getattr(async_catalog, property_name)
4943

5044
assert isinstance(service, expected_service_class)
5145
assert service.http_client is async_catalog.http_client
5246

5347

54-
def test_catalog_initialization(http_client: Any) -> None:
48+
def test_catalog_initialization(http_client):
5549
"""Test that Catalog can be properly initialized with http_client."""
5650
catalog = Catalog(http_client=http_client)
5751

5852
assert catalog.http_client is http_client
5953
assert isinstance(catalog, Catalog)
6054

6155

62-
def test_async_catalog_initialization(async_http_client: Any) -> None:
56+
def test_async_catalog_initialization(async_http_client):
6357
"""Test that AsyncCatalog can be properly initialized with http_client."""
6458
async_catalog = AsyncCatalog(http_client=async_http_client)
6559

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
1-
from typing import Any
2-
31
import pytest
42

53
from mpt_api_client.resources.catalog.items import AsyncItemsService, ItemsService
64

75

86
@pytest.fixture
9-
def items_service(http_client: Any) -> ItemsService:
7+
def items_service(http_client):
108
return ItemsService(http_client=http_client)
119

1210

1311
@pytest.fixture
14-
def async_items_service(async_http_client: Any) -> AsyncItemsService:
12+
def async_items_service(async_http_client):
1513
return AsyncItemsService(http_client=async_http_client)
1614

1715

1816
@pytest.mark.parametrize(
1917
"method", ["get", "create", "update", "delete", "review", "publish", "unpublish"]
2018
)
21-
def test_mixins_present(items_service: ItemsService, method: str) -> None:
19+
def test_mixins_present(items_service, method):
2220
assert hasattr(items_service, method)
2321

2422

2523
@pytest.mark.parametrize(
2624
"method", ["get", "create", "update", "delete", "review", "publish", "unpublish"]
2725
)
28-
def test_async_mixins_present(async_items_service: AsyncItemsService, method: str) -> None:
26+
def test_async_mixins_present(async_items_service, method):
2927
assert hasattr(async_items_service, method)

tests/resources/catalog/test_products.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
AsyncParameterGroupsService,
66
ParameterGroupsService,
77
)
8+
from mpt_api_client.resources.catalog.products_parameters import (
9+
AsyncParametersService,
10+
ParametersService,
11+
)
812

913

1014
@pytest.fixture
@@ -31,15 +35,29 @@ def test_async_mixins_present(async_products_service, method):
3135
assert hasattr(async_products_service, method)
3236

3337

34-
def test_parameters_groups_service(products_service):
35-
parameters_groups_service = products_service.parameter_groups("PRD-001")
38+
@pytest.mark.parametrize(
39+
("service_method", "expected_service_class"),
40+
[
41+
("parameter_groups", ParameterGroupsService),
42+
("product_parameters", ParametersService),
43+
],
44+
)
45+
def test_property_services(products_service, service_method, expected_service_class):
46+
property_service = getattr(products_service, service_method)("PRD-001")
3647

37-
assert isinstance(parameters_groups_service, ParameterGroupsService)
38-
assert parameters_groups_service.endpoint_params == {"product_id": "PRD-001"}
48+
assert isinstance(property_service, expected_service_class)
49+
assert property_service.endpoint_params == {"product_id": "PRD-001"}
3950

4051

41-
def test_async_parameters_groups_service(async_products_service):
42-
parameters_groups_service = async_products_service.parameter_groups("PRD-001")
52+
@pytest.mark.parametrize(
53+
("service_method", "expected_service_class"),
54+
[
55+
("parameter_groups", AsyncParameterGroupsService),
56+
("product_parameters", AsyncParametersService),
57+
],
58+
)
59+
def test_async_property_services(async_products_service, service_method, expected_service_class):
60+
property_service = getattr(async_products_service, service_method)("PRD-001")
4361

44-
assert isinstance(parameters_groups_service, AsyncParameterGroupsService)
45-
assert parameters_groups_service.endpoint_params == {"product_id": "PRD-001"}
62+
assert isinstance(property_service, expected_service_class)
63+
assert property_service.endpoint_params == {"product_id": "PRD-001"}

tests/resources/catalog/test_products_parameter_groups.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Any
2-
31
import pytest
42

53
from mpt_api_client.resources.catalog.products_parameter_groups import (
@@ -9,14 +7,14 @@
97

108

119
@pytest.fixture
12-
def parameter_groups_service(http_client: Any) -> ParameterGroupsService:
10+
def parameter_groups_service(http_client):
1311
return ParameterGroupsService(
1412
http_client=http_client, endpoint_params={"product_id": "PRD-001"}
1513
)
1614

1715

1816
@pytest.fixture
19-
def async_parameter_groups_service(async_http_client: Any) -> AsyncParameterGroupsService:
17+
def async_parameter_groups_service(async_http_client):
2018
return AsyncParameterGroupsService(
2119
http_client=async_http_client, endpoint_params={"product_id": "PRD-001"}
2220
)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import pytest
2+
3+
from mpt_api_client.resources.catalog.products_parameters import (
4+
AsyncParametersService,
5+
ParametersService,
6+
)
7+
8+
9+
@pytest.fixture
10+
def parameters_service(http_client):
11+
return ParametersService(http_client=http_client, endpoint_params={"product_id": "PRD-001"})
12+
13+
14+
@pytest.fixture
15+
def async_parameters_service(async_http_client):
16+
return AsyncParametersService(
17+
http_client=async_http_client, endpoint_params={"product_id": "PRD-001"}
18+
)
19+
20+
21+
def test_endpoint(parameters_service):
22+
assert parameters_service.endpoint == "/public/v1/catalog/products/PRD-001/parameters"
23+
24+
25+
def test_async_endpoint(async_parameters_service):
26+
assert async_parameters_service.endpoint == "/public/v1/catalog/products/PRD-001/parameters"
27+
28+
29+
@pytest.mark.parametrize("method", ["get", "create", "delete", "update"])
30+
def test_methods_present(parameters_service, method):
31+
assert hasattr(parameters_service, method)
32+
33+
34+
@pytest.mark.parametrize("method", ["get", "create", "delete", "update"])
35+
def test_async_methods_present(async_parameters_service, method):
36+
assert hasattr(async_parameters_service, method)

0 commit comments

Comments
 (0)