Skip to content

Commit e81745b

Browse files
author
Robert Segal
committed
Added Accounts buyers e2e tests
1 parent 002a77a commit e81745b

9 files changed

Lines changed: 496 additions & 7 deletions

File tree

e2e_config.test.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
"accounts.seller.id": "SEL-7310-3075",
44
"catalog.product.parameter_group.id": "PGR-7255-3950-0001",
55
"catalog.product.parameter.id": "PAR-7255-3950-0016",
6-
"accounts.account.id": "ACC-9042-0088"
6+
"accounts.account.id": "ACC-9042-0088",
7+
"accounts.buyer.account.id": "ACC-1086-6867",
8+
"accounts.buyer.id": "BUY-1591-2112"
79
}

mpt_api_client/resources/accounts/buyers.py

Lines changed: 129 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1+
from typing import override
2+
13
from mpt_api_client.http import AsyncService, Service
24
from mpt_api_client.http.mixins import (
35
AsyncCollectionMixin,
4-
AsyncManagedResourceMixin,
6+
AsyncCreateWithIconMixin,
7+
AsyncDeleteMixin,
8+
AsyncGetMixin,
9+
AsyncUpdateWithIconMixin,
510
CollectionMixin,
6-
ManagedResourceMixin,
11+
CreateWithIconMixin,
12+
DeleteMixin,
13+
GetMixin,
14+
UpdateWithIconMixin,
715
)
16+
from mpt_api_client.http.types import FileTypes
817
from mpt_api_client.models import Model
918
from mpt_api_client.models.model import ResourceData
1019
from mpt_api_client.resources.accounts.mixins import (
@@ -30,16 +39,74 @@ class BuyersServiceConfig:
3039

3140

3241
class BuyersService(
42+
CreateWithIconMixin[Buyer],
43+
UpdateWithIconMixin[Buyer],
44+
GetMixin[Buyer],
45+
DeleteMixin,
3346
ActivatableMixin[Buyer],
3447
EnablableMixin[Buyer],
3548
ValidateMixin[Buyer],
36-
ManagedResourceMixin[Buyer],
3749
CollectionMixin[Buyer],
3850
Service[Buyer],
3951
BuyersServiceConfig,
4052
):
4153
"""Buyers Service."""
4254

55+
@override
56+
def create(
57+
self,
58+
resource_data: ResourceData,
59+
logo: FileTypes,
60+
data_key: str = "buyer",
61+
icon_key: str = "logo",
62+
) -> Buyer:
63+
"""Create a buyer.
64+
65+
Args:
66+
resource_data (ResourceData): Buyer data.
67+
logo: Logo image in jpg, png, GIF, etc.
68+
data_key: The key for the buyer data.
69+
icon_key: The key for the logo image.
70+
71+
Returns:
72+
Buyer: Created buyer
73+
"""
74+
return super().create(
75+
resource_data=resource_data,
76+
icon=logo,
77+
data_key=data_key,
78+
icon_key=icon_key,
79+
)
80+
81+
@override
82+
def update(
83+
self,
84+
resource_id: str,
85+
resource_data: ResourceData,
86+
logo: FileTypes,
87+
data_key: str = "buyer",
88+
icon_key: str = "logo",
89+
) -> Buyer:
90+
"""Update a buyer.
91+
92+
Args:
93+
resource_id: Resource ID
94+
resource_data (ResourceData): Buyer data.
95+
logo: Logo image in jpg, png, GIF, etc.
96+
data_key: The key for the buyer data.
97+
icon_key: The key for the logo image.
98+
99+
Returns:
100+
Buyer: Updated buyer
101+
"""
102+
return super().update(
103+
resource_id=resource_id,
104+
resource_data=resource_data,
105+
icon=logo,
106+
data_key=data_key,
107+
icon_key=icon_key,
108+
)
109+
43110
def synchronize(self, resource_id: str, resource_data: ResourceData | None = None) -> Buyer:
44111
"""Synchronize a buyer.
45112
@@ -60,16 +127,74 @@ def transfer(self, resource_id: str, resource_data: ResourceData | None = None)
60127

61128

62129
class AsyncBuyersService(
130+
AsyncCreateWithIconMixin[Buyer],
131+
AsyncUpdateWithIconMixin[Buyer],
132+
AsyncGetMixin[Buyer],
133+
AsyncDeleteMixin,
63134
AsyncActivatableMixin[Buyer],
64135
AsyncEnablableMixin[Buyer],
65136
AsyncValidateMixin[Buyer],
66-
AsyncManagedResourceMixin[Buyer],
67137
AsyncCollectionMixin[Buyer],
68138
AsyncService[Buyer],
69139
BuyersServiceConfig,
70140
):
71141
"""Async Buyers Service."""
72142

143+
@override
144+
async def create(
145+
self,
146+
resource_data: ResourceData,
147+
logo: FileTypes,
148+
data_key: str = "buyer",
149+
icon_key: str = "logo",
150+
) -> Buyer:
151+
"""Create a buyer.
152+
153+
Args:
154+
resource_data (ResourceData): Buyer data.
155+
logo: Logo image in jpg, png, GIF, etc.
156+
data_key: The key for the buyer data.
157+
icon_key: The key for the logo image.
158+
159+
Returns:
160+
Buyer: Created buyer
161+
"""
162+
return await super().create(
163+
resource_data=resource_data,
164+
icon=logo,
165+
data_key=data_key,
166+
icon_key=icon_key,
167+
)
168+
169+
@override
170+
async def update(
171+
self,
172+
resource_id: str,
173+
resource_data: ResourceData,
174+
logo: FileTypes,
175+
data_key: str = "buyer",
176+
icon_key: str = "logo",
177+
) -> Buyer:
178+
"""Update a buyer.
179+
180+
Args:
181+
resource_id: Resource ID
182+
resource_data (ResourceData): Buyer data.
183+
logo: Logo image in jpg, png, GIF, etc.
184+
data_key: The key for the buyer data.
185+
icon_key: The key for the logo image.
186+
187+
Returns:
188+
Buyer: Updated buyer
189+
"""
190+
return await super().update(
191+
resource_id=resource_id,
192+
resource_data=resource_data,
193+
icon=logo,
194+
data_key=data_key,
195+
icon_key=icon_key,
196+
)
197+
73198
async def synchronize(
74199
self, resource_id: str, resource_data: ResourceData | None = None
75200
) -> Buyer:

setup.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ per-file-ignores =
3636
mpt_api_client/http/mixins.py: WPS202 WPS204 WPS235
3737
mpt_api_client/resources/*: WPS215
3838
mpt_api_client/models/model.py: WPS215 WPS110
39-
mpt_api_client/resources/accounts/*.py: WPS202 WPS215 WPS214
39+
mpt_api_client/resources/accounts/*.py: WPS202 WPS215 WPS214 WPS235
4040
mpt_api_client/resources/billing/*.py: WPS202 WPS204 WPS214 WPS215
4141
mpt_api_client/resources/catalog/*.py: WPS110 WPS214 WPS215 WPS235
4242
mpt_api_client/resources/catalog/products.py: WPS204 WPS214 WPS215 WPS235
@@ -45,8 +45,8 @@ per-file-ignores =
4545
tests/unit/http/test_service.py: WPS204 WPS202
4646
tests/unit/http/test_mixins.py: WPS204 WPS202 WPS210
4747
tests/unit/resources/catalog/test_products.py: WPS202 WPS210
48+
tests/unit/resources/accounts/*.py: WPS204 WPS202 WPS210
4849
tests/unit/resources/*/test_mixins.py: WPS118 WPS202 WPS204 WPS235
49-
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
5252
tests/e2e/catalog/*.py: WPS421
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
async def async_created_buyer(async_mpt_ops, buyer, buyer_account_id, account_icon):
11+
new_buyer_request_data = buyer(
12+
name="E2E Created Buyer",
13+
account_id=buyer_account_id,
14+
)
15+
16+
new_buyer = await async_mpt_ops.accounts.buyers.create(
17+
new_buyer_request_data, logo=account_icon
18+
)
19+
20+
yield new_buyer
21+
22+
try:
23+
await async_mpt_ops.accounts.buyers.delete(new_buyer.id)
24+
except MPTAPIError as error:
25+
print(f"TEARDOWN - Unable to delete buyer: {error.title}") # noqa: WPS421
26+
27+
28+
async def test_get_buyer_by_id(async_mpt_ops, buyer_id):
29+
buyer = await async_mpt_ops.accounts.buyers.get(buyer_id)
30+
assert buyer is not None
31+
32+
33+
async def test_list_buyers(async_mpt_ops):
34+
limit = 10
35+
buyers = await async_mpt_ops.accounts.buyers.fetch_page(limit=limit)
36+
assert len(buyers) > 0
37+
38+
39+
async def test_get_buyer_by_id_not_found(async_mpt_ops, invalid_buyer_id):
40+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41+
await async_mpt_ops.accounts.buyers.get(invalid_buyer_id)
42+
43+
44+
async def test_filter_buyers(async_mpt_ops, buyer_id):
45+
select_fields = ["-address"]
46+
47+
async_filtered_buyers = (
48+
async_mpt_ops.accounts.buyers.filter(RQLQuery(id=buyer_id))
49+
.filter(RQLQuery(name="E2E Seeded Buyer"))
50+
.select(*select_fields)
51+
)
52+
53+
buyers = [filtered_buyer async for filtered_buyer in async_filtered_buyers.iterate()]
54+
55+
assert len(buyers) == 1
56+
57+
58+
def test_create_buyer(async_created_buyer):
59+
assert async_created_buyer is not None
60+
61+
62+
async def test_delete_buyer(async_mpt_ops, async_created_buyer):
63+
await async_mpt_ops.accounts.buyers.delete(async_created_buyer.id)
64+
65+
66+
async def test_delete_buyer_not_found(async_mpt_ops, invalid_buyer_id):
67+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
68+
await async_mpt_ops.accounts.buyers.delete(invalid_buyer_id)
69+
70+
71+
async def test_update_buyer(
72+
async_mpt_ops, buyer, buyer_account_id, account_icon, async_created_buyer
73+
):
74+
updated_buyer_data = buyer(name="E2E Updated Buyer", account_id=buyer_account_id)
75+
76+
updated_buyer = await async_mpt_ops.accounts.buyers.update(
77+
async_created_buyer.id, updated_buyer_data, logo=account_icon
78+
)
79+
80+
assert updated_buyer is not None
81+
82+
83+
async def test_update_buyer_not_found(
84+
async_mpt_ops, buyer, buyer_account_id, account_icon, invalid_buyer_id
85+
):
86+
updated_buyer_data = buyer(name="Nonexistent Buyer", account_id=buyer_account_id)
87+
88+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
89+
await async_mpt_ops.accounts.buyers.update(
90+
invalid_buyer_id, updated_buyer_data, logo=account_icon
91+
)
92+
93+
94+
async def test_buyer_disable(async_mpt_ops, async_created_buyer):
95+
disabled_buyer = await async_mpt_ops.accounts.buyers.disable(async_created_buyer.id)
96+
97+
assert disabled_buyer is not None
98+
99+
100+
async def test_buyer_disable_not_found(async_mpt_ops, invalid_buyer_id):
101+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
102+
await async_mpt_ops.accounts.buyers.disable(invalid_buyer_id)
103+
104+
105+
async def test_buyer_enable(async_mpt_ops, async_created_buyer):
106+
await async_mpt_ops.accounts.buyers.disable(async_created_buyer.id)
107+
108+
enabled_buyer = await async_mpt_ops.accounts.buyers.enable(async_created_buyer.id)
109+
110+
assert enabled_buyer is not None
111+
112+
113+
async def test_buyer_enable_not_found(async_mpt_ops, invalid_buyer_id):
114+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
115+
await async_mpt_ops.accounts.buyers.enable(invalid_buyer_id)

0 commit comments

Comments
 (0)