Skip to content

Commit 6822845

Browse files
author
Robert Segal
committed
Added catalog pricing policies endpoints
1 parent 23b612f commit 6822845

File tree

5 files changed

+218
-1
lines changed

5 files changed

+218
-1
lines changed

mpt_api_client/resources/catalog/catalog.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
AsyncPriceListsService,
1010
PriceListsService,
1111
)
12+
from mpt_api_client.resources.catalog.pricing_policies import (
13+
AsyncPricingPoliciesService,
14+
PricingPoliciesService,
15+
)
1216
from mpt_api_client.resources.catalog.products import AsyncProductsService, ProductsService
1317
from mpt_api_client.resources.catalog.units_of_measure import (
1418
AsyncUnitsOfMeasureService,
@@ -37,6 +41,11 @@ def price_lists(self) -> PriceListsService:
3741
"""Price Lists service."""
3842
return PriceListsService(http_client=self.http_client)
3943

44+
@property
45+
def pricing_policies(self) -> PricingPoliciesService:
46+
"""Pricing policies service."""
47+
return PricingPoliciesService(http_client=self.http_client)
48+
4049
@property
4150
def products(self) -> ProductsService:
4251
"""Products service."""
@@ -74,6 +83,11 @@ def price_lists(self) -> AsyncPriceListsService:
7483
"""Price Lists service."""
7584
return AsyncPriceListsService(http_client=self.http_client)
7685

86+
@property
87+
def pricing_policies(self) -> AsyncPricingPoliciesService:
88+
"""Pricing policies service."""
89+
return AsyncPricingPoliciesService(http_client=self.http_client)
90+
7791
@property
7892
def products(self) -> AsyncProductsService:
7993
"""Products service."""
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
from mpt_api_client.http import (
2+
AsyncCreateMixin,
3+
AsyncDeleteMixin,
4+
AsyncService,
5+
CreateMixin,
6+
DeleteMixin,
7+
Service,
8+
)
9+
from mpt_api_client.models import Model, ResourceData
10+
11+
12+
class PricingPolicy(Model):
13+
"""Pricing policy resource."""
14+
15+
16+
class PricingPoliciesServiceConfig:
17+
"""Pricing policy service config."""
18+
19+
_endpoint = "/public/v1/catalog/pricing-policies"
20+
_model_class = PricingPolicy
21+
_collection_key = "data"
22+
23+
24+
class PricingPoliciesService( # noqa: WPS215
25+
CreateMixin[PricingPolicy],
26+
DeleteMixin,
27+
Service[PricingPolicy],
28+
PricingPoliciesServiceConfig,
29+
):
30+
"""Pricing policies service."""
31+
32+
def activate(self, resource_id: str, resource_data: ResourceData) -> PricingPolicy:
33+
"""Activate pricing policy.
34+
35+
Args:
36+
resource_id: Pricing policy resource ID
37+
resource_data: Pricing policy resource data
38+
39+
Returns:
40+
Activated pricing policy.
41+
"""
42+
return self._resource_action(resource_id, "POST", "activate", json=resource_data)
43+
44+
def disable(self, resource_id: str, resource_data: ResourceData) -> PricingPolicy:
45+
"""Disable pricing policy.
46+
47+
Args:
48+
resource_id: Pricing policy resource ID
49+
resource_data: Pricing policy resource data
50+
51+
Returns:
52+
Disabled pricing policy.
53+
"""
54+
return self._resource_action(resource_id, "POST", "disable", json=resource_data)
55+
56+
57+
class AsyncPricingPoliciesService(
58+
AsyncCreateMixin[PricingPolicy],
59+
AsyncDeleteMixin,
60+
AsyncService[PricingPolicy],
61+
PricingPoliciesServiceConfig,
62+
):
63+
"""Async pricing policies service."""
64+
65+
async def activate(self, resource_id: str, resource_data: ResourceData) -> PricingPolicy:
66+
"""Activate pricing policy.
67+
68+
Args:
69+
resource_id: Pricing policy resource ID
70+
resource_data: Pricing policy resource data
71+
72+
Returns:
73+
Activated pricing policy.
74+
"""
75+
return await self._resource_action(resource_id, "POST", "activate", json=resource_data)
76+
77+
async def disable(self, resource_id: str, resource_data: ResourceData) -> PricingPolicy:
78+
"""Disable pricing policy.
79+
80+
Args:
81+
resource_id: Pricing policy resource ID
82+
resource_data: Pricing policy resource data
83+
84+
Returns:
85+
Disabled pricing policy.
86+
"""
87+
return await self._resource_action(resource_id, "POST", "disable", json=resource_data)

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ extend-ignore =
3232

3333

3434
per-file-ignores =
35-
mpt_api_client/resources/catalog/*.py: WPS110 WPS215
35+
mpt_api_client/resources/catalog/*.py: WPS110 WPS215 WPS214
3636
mpt_api_client/resources/commerce/*.py: WPS215
3737
mpt_api_client/rql/query_builder.py: WPS110 WPS115 WPS210 WPS214
3838
mpt_api_client/resources/catalog/products.py: WPS204 WPS214 WPS215

tests/resources/catalog/test_catalog.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
AsyncPriceListsService,
1212
PriceListsService,
1313
)
14+
from mpt_api_client.resources.catalog.pricing_policies import (
15+
AsyncPricingPoliciesService,
16+
PricingPoliciesService,
17+
)
1418
from mpt_api_client.resources.catalog.products import AsyncProductsService, ProductsService
1519
from mpt_api_client.resources.catalog.units_of_measure import (
1620
AsyncUnitsOfMeasureService,
@@ -34,6 +38,7 @@ def async_catalog(async_http_client):
3438
("authorizations", AuthorizationsService),
3539
("listings", ListingsService),
3640
("price_lists", PriceListsService),
41+
("pricing_policies", PricingPoliciesService),
3742
("products", ProductsService),
3843
("units_of_measure", UnitsOfMeasureService),
3944
("items", ItemsService),
@@ -53,6 +58,7 @@ def test_catalog_properties(catalog, property_name, expected_service_class):
5358
("authorizations", AsyncAuthorizationsService),
5459
("listings", AsyncListingsService),
5560
("price_lists", AsyncPriceListsService),
61+
("pricing_policies", AsyncPricingPoliciesService),
5662
("products", AsyncProductsService),
5763
("units_of_measure", AsyncUnitsOfMeasureService),
5864
("items", AsyncItemsService),
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import httpx
2+
import pytest
3+
import respx
4+
5+
from mpt_api_client.resources.catalog.pricing_policies import (
6+
AsyncPricingPoliciesService,
7+
PricingPoliciesService,
8+
)
9+
10+
11+
@pytest.fixture
12+
def pricing_policies_service(http_client):
13+
return PricingPoliciesService(http_client=http_client)
14+
15+
16+
@pytest.fixture
17+
def async_pricing_policies_service(async_http_client):
18+
return AsyncPricingPoliciesService(http_client=async_http_client)
19+
20+
21+
def test_activate(pricing_policies_service):
22+
pricing_policy_expected = {
23+
"id": "PRP-0000-0001",
24+
"status": "Active",
25+
"name": "Active Pricing Policy",
26+
}
27+
with respx.mock:
28+
respx.post(
29+
"https://api.example.com/public/v1/catalog/pricing-policies/PRP-0000-0001/activate"
30+
).mock(
31+
return_value=httpx.Response(
32+
status_code=httpx.codes.OK,
33+
json=pricing_policy_expected,
34+
)
35+
)
36+
37+
pricing_policy_activated = pricing_policies_service.activate(
38+
"PRP-0000-0001", {"name": "Active Pricing Policy"}
39+
)
40+
41+
assert pricing_policy_activated.to_dict() == pricing_policy_expected
42+
43+
44+
async def test_async_activate(async_pricing_policies_service):
45+
pricing_policy_expected = {
46+
"id": "PRP-0000-0001",
47+
"status": "Active",
48+
"name": "Active Pricing Policy",
49+
}
50+
with respx.mock:
51+
respx.post(
52+
"https://api.example.com/public/v1/catalog/pricing-policies/PRP-0000-0001/activate"
53+
).mock(
54+
return_value=httpx.Response(
55+
status_code=httpx.codes.OK,
56+
json=pricing_policy_expected,
57+
)
58+
)
59+
60+
pricing_policy_activated = await async_pricing_policies_service.activate(
61+
"PRP-0000-0001", {"name": "Active Pricing Policy"}
62+
)
63+
64+
assert pricing_policy_activated.to_dict() == pricing_policy_expected
65+
66+
67+
def test_disable(pricing_policies_service):
68+
pricing_policy_expected = {
69+
"id": "PRP-0000-0001",
70+
"status": "Inactive",
71+
"name": "Inactive Pricing Policy",
72+
}
73+
with respx.mock:
74+
respx.post(
75+
"https://api.example.com/public/v1/catalog/pricing-policies/PRP-0000-0001/disable"
76+
).mock(
77+
return_value=httpx.Response(
78+
status_code=httpx.codes.OK,
79+
json=pricing_policy_expected,
80+
)
81+
)
82+
83+
pricing_policy_disabled = pricing_policies_service.disable(
84+
"PRP-0000-0001", {"name": "Inactive Pricing Policy"}
85+
)
86+
87+
assert pricing_policy_disabled.to_dict() == pricing_policy_expected
88+
89+
90+
async def test_async_disable(async_pricing_policies_service):
91+
pricing_policy_expected = {
92+
"id": "PRP-0000-0001",
93+
"status": "Inactive",
94+
"name": "Inactive Pricing Policy",
95+
}
96+
with respx.mock:
97+
respx.post(
98+
"https://api.example.com/public/v1/catalog/pricing-policies/PRP-0000-0001/disable"
99+
).mock(
100+
return_value=httpx.Response(
101+
status_code=httpx.codes.OK,
102+
json=pricing_policy_expected,
103+
)
104+
)
105+
106+
pricing_policy_disabled = await async_pricing_policies_service.disable(
107+
"PRP-0000-0001", {"name": "Inactive Pricing Policy"}
108+
)
109+
110+
assert pricing_policy_disabled.to_dict() == pricing_policy_expected

0 commit comments

Comments
 (0)