Skip to content

Commit 6a44566

Browse files
author
Robert Segal
committed
Add additional mixin tests for activatable resource
1 parent 3524b0b commit 6a44566

2 files changed

Lines changed: 201 additions & 25 deletions

File tree

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ per-file-ignores =
4141
tests/http/test_service.py: WPS204 WPS202
4242
tests/http/test_mixins.py: WPS204 WPS202
4343
tests/resources/catalog/test_products.py: WPS202 WPS210
44+
tests/resources/catalog/test_mixins.py: WPS118 WPS202 WPS204
4445

4546
tests/*:
4647
# Allow magic strings.

tests/resources/catalog/test_mixins.py

Lines changed: 200 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,66 @@
22
import pytest
33
import respx
44

5-
from mpt_api_client.resources.catalog.products import AsyncProductsService, Product, ProductsService
5+
from mpt_api_client.resources.catalog.mixins import (
6+
ActivatableMixin,
7+
AsyncActivatableMixin,
8+
AsyncPublishableMixin,
9+
PublishableMixin,
10+
)
11+
from tests.conftest import DummyModel
12+
from tests.http.conftest import AsyncDummyService, DummyService
13+
14+
15+
class DummyPublishableService( # noqa: WPS215
16+
PublishableMixin[DummyModel],
17+
DummyService,
18+
):
19+
_endpoint = "/public/v1/dummy/publishable/"
20+
_model_class = DummyModel
21+
22+
23+
class DummyAsyncPublishableService( # noqa: WPS215
24+
AsyncPublishableMixin[DummyModel],
25+
AsyncDummyService,
26+
):
27+
_endpoint = "/public/v1/dummy/publishable/"
28+
_model_class = DummyModel
29+
30+
31+
class DummyActivatableService( # noqa: WPS215
32+
ActivatableMixin[DummyModel],
33+
DummyService,
34+
):
35+
_endpoint = "/public/v1/dummy/activatable/"
36+
_model_class = DummyModel
37+
38+
39+
class DummyAsyncActivatableService( # noqa: WPS215
40+
AsyncActivatableMixin[DummyModel],
41+
AsyncDummyService,
42+
):
43+
_endpoint = "/public/v1/dummy/activatable/"
44+
_model_class = DummyModel
45+
46+
47+
@pytest.fixture
48+
def publishable_service(http_client):
49+
return DummyPublishableService(http_client=http_client)
650

751

852
@pytest.fixture
9-
def product_service(http_client):
10-
return ProductsService(http_client=http_client)
53+
def async_publishable_service(async_http_client):
54+
return DummyAsyncPublishableService(http_client=async_http_client)
1155

1256

1357
@pytest.fixture
14-
def async_product_service(async_http_client):
15-
return AsyncProductsService(http_client=async_http_client)
58+
def activatable_service(http_client):
59+
return DummyActivatableService(http_client=http_client)
60+
61+
62+
@pytest.fixture
63+
def async_activatable_service(async_http_client):
64+
return DummyAsyncActivatableService(http_client=async_http_client)
1665

1766

1867
@pytest.mark.parametrize(
@@ -23,27 +72,27 @@ def async_product_service(async_http_client):
2372
("unpublish", {"id": "PRD-123", "status": "update"}),
2473
],
2574
)
26-
def test_custom_resource_actions(product_service, action, input_status):
75+
def test_custom_resource_actions(publishable_service, action, input_status):
2776
request_expected_content = b'{"id":"PRD-123","status":"update"}'
2877
response_expected_data = {"id": "PRD-123", "status": "new_status"}
2978
with respx.mock:
3079
mock_route = respx.post(
31-
f"https://api.example.com/public/v1/catalog/products/PRD-123/{action}"
80+
f"https://api.example.com/public/v1/dummy/publishable/PRD-123/{action}"
3281
).mock(
3382
return_value=httpx.Response(
34-
status_code=200,
83+
status_code=httpx.codes.OK,
3584
headers={"content-type": "application/json"},
3685
json=response_expected_data,
3786
)
3887
)
39-
order = getattr(product_service, action)("PRD-123", input_status)
88+
order = getattr(publishable_service, action)("PRD-123", input_status)
4089

4190
assert mock_route.call_count == 1
4291
request = mock_route.calls[0].request
4392

4493
assert request.content == request_expected_content
4594
assert order.to_dict() == response_expected_data
46-
assert isinstance(order, Product)
95+
assert isinstance(order, DummyModel)
4796

4897

4998
@pytest.mark.parametrize(
@@ -54,27 +103,27 @@ def test_custom_resource_actions(product_service, action, input_status):
54103
("unpublish", None),
55104
],
56105
)
57-
def test_custom_resource_actions_no_data(product_service, action, input_status):
106+
def test_custom_resource_actions_no_data(publishable_service, action, input_status):
58107
request_expected_content = b""
59108
response_expected_data = {"id": "PRD-123", "status": "new_status"}
60109
with respx.mock:
61110
mock_route = respx.post(
62-
f"https://api.example.com/public/v1/catalog/products/PRD-123/{action}"
111+
f"https://api.example.com/public/v1/dummy/publishable/PRD-123/{action}"
63112
).mock(
64113
return_value=httpx.Response(
65-
status_code=200,
114+
status_code=httpx.codes.OK,
66115
headers={"content-type": "application/json"},
67116
json=response_expected_data,
68117
)
69118
)
70119

71-
order = getattr(product_service, action)("PRD-123")
120+
order = getattr(publishable_service, action)("PRD-123")
72121

73122
assert mock_route.call_count == 1
74123
request = mock_route.calls[0].request
75124
assert request.content == request_expected_content
76125
assert order.to_dict() == response_expected_data
77-
assert isinstance(order, Product)
126+
assert isinstance(order, DummyModel)
78127

79128

80129
@pytest.mark.parametrize(
@@ -85,27 +134,27 @@ def test_custom_resource_actions_no_data(product_service, action, input_status):
85134
("unpublish", {"id": "PRD-123", "status": "update"}),
86135
],
87136
)
88-
async def test_async_custom_resource_actions(async_product_service, action, input_status):
137+
async def test_async_custom_resource_actions(async_publishable_service, action, input_status):
89138
request_expected_content = b'{"id":"PRD-123","status":"update"}'
90139
response_expected_data = {"id": "PRD-123", "status": "new_status"}
91140
with respx.mock:
92141
mock_route = respx.post(
93-
f"https://api.example.com/public/v1/catalog/products/PRD-123/{action}"
142+
f"https://api.example.com/public/v1/dummy/publishable/PRD-123/{action}"
94143
).mock(
95144
return_value=httpx.Response(
96-
status_code=200,
145+
status_code=httpx.codes.OK,
97146
headers={"content-type": "application/json"},
98147
json=response_expected_data,
99148
)
100149
)
101-
order = await getattr(async_product_service, action)("PRD-123", input_status)
150+
order = await getattr(async_publishable_service, action)("PRD-123", input_status)
102151

103152
assert mock_route.call_count == 1
104153
request = mock_route.calls[0].request
105154

106155
assert request.content == request_expected_content
107156
assert order.to_dict() == response_expected_data
108-
assert isinstance(order, Product)
157+
assert isinstance(order, DummyModel)
109158

110159

111160
@pytest.mark.parametrize(
@@ -116,24 +165,150 @@ async def test_async_custom_resource_actions(async_product_service, action, inpu
116165
("unpublish", None),
117166
],
118167
)
119-
async def test_async_custom_resource_actions_no_data(async_product_service, action, input_status):
168+
async def test_async_custom_resource_actions_no_data(
169+
async_publishable_service, action, input_status
170+
):
120171
request_expected_content = b""
121172
response_expected_data = {"id": "PRD-123", "status": "new_status"}
122173
with respx.mock:
123174
mock_route = respx.post(
124-
f"https://api.example.com/public/v1/catalog/products/PRD-123/{action}"
175+
f"https://api.example.com/public/v1/dummy/publishable/PRD-123/{action}"
125176
).mock(
126177
return_value=httpx.Response(
127-
status_code=200,
178+
status_code=httpx.codes.OK,
128179
headers={"content-type": "application/json"},
129180
json=response_expected_data,
130181
)
131182
)
132183

133-
order = await getattr(async_product_service, action)("PRD-123")
184+
order = await getattr(async_publishable_service, action)("PRD-123")
134185

135186
assert mock_route.call_count == 1
136187
request = mock_route.calls[0].request
137188
assert request.content == request_expected_content
138189
assert order.to_dict() == response_expected_data
139-
assert isinstance(order, Product)
190+
assert isinstance(order, DummyModel)
191+
192+
193+
@pytest.mark.parametrize(
194+
("action", "input_status"),
195+
[
196+
("activate", {"id": "OBJ-0000-0001", "status": "update"}),
197+
("deactivate", {"id": "OBJ-0000-0001", "status": "update"}),
198+
],
199+
)
200+
def test_custom_resource_activatable_actions(activatable_service, action, input_status):
201+
request_expected_content = b'{"id":"OBJ-0000-0001","status":"update"}'
202+
response_expected_data = {"id": "OBJ-0000-0001", "status": "new_status"}
203+
with respx.mock:
204+
mock_route = respx.post(
205+
f"https://api.example.com/public/v1/dummy/activatable/OBJ-0000-0001/{action}"
206+
).mock(
207+
return_value=httpx.Response(
208+
status_code=httpx.codes.OK,
209+
headers={"content-type": "application/json"},
210+
json=response_expected_data,
211+
)
212+
)
213+
attachment = getattr(activatable_service, action)("OBJ-0000-0001", input_status)
214+
215+
assert mock_route.call_count == 1
216+
request = mock_route.calls[0].request
217+
218+
assert request.content == request_expected_content
219+
assert attachment.to_dict() == response_expected_data
220+
assert isinstance(attachment, DummyModel)
221+
222+
223+
@pytest.mark.parametrize(
224+
("action", "input_status"),
225+
[
226+
("activate", None),
227+
("deactivate", None),
228+
],
229+
)
230+
def test_custom_resource_activatable_actions_no_data(activatable_service, action, input_status):
231+
request_expected_content = b""
232+
response_expected_data = {"id": "OBJ-0000-0001", "status": "new_status"}
233+
with respx.mock:
234+
mock_route = respx.post(
235+
f"https://api.example.com/public/v1/dummy/activatable/OBJ-0000-0001/{action}"
236+
).mock(
237+
return_value=httpx.Response(
238+
status_code=httpx.codes.OK,
239+
headers={"content-type": "application/json"},
240+
json=response_expected_data,
241+
)
242+
)
243+
attachment = getattr(activatable_service, action)("OBJ-0000-0001", input_status)
244+
245+
assert mock_route.call_count == 1
246+
request = mock_route.calls[0].request
247+
248+
assert request.content == request_expected_content
249+
assert attachment.to_dict() == response_expected_data
250+
assert isinstance(attachment, DummyModel)
251+
252+
253+
@pytest.mark.parametrize(
254+
("action", "input_status"),
255+
[
256+
("activate", {"id": "OBJ-0000-0001", "status": "update"}),
257+
("deactivate", {"id": "OBJ-0000-0001", "status": "update"}),
258+
],
259+
)
260+
async def test_async_custom_resource_activatable_actions(
261+
async_activatable_service, action, input_status
262+
):
263+
request_expected_content = b'{"id":"OBJ-0000-0001","status":"update"}'
264+
response_expected_data = {"id": "OBJ-0000-0001", "status": "new_status"}
265+
with respx.mock:
266+
mock_route = respx.post(
267+
f"https://api.example.com/public/v1/dummy/activatable/OBJ-0000-0001/{action}"
268+
).mock(
269+
return_value=httpx.Response(
270+
status_code=httpx.codes.OK,
271+
headers={"content-type": "application/json"},
272+
json=response_expected_data,
273+
)
274+
)
275+
attachment = await getattr(async_activatable_service, action)("OBJ-0000-0001", input_status)
276+
277+
assert mock_route.call_count == 1
278+
request = mock_route.calls[0].request
279+
280+
assert request.content == request_expected_content
281+
assert attachment.to_dict() == response_expected_data
282+
assert isinstance(attachment, DummyModel)
283+
284+
285+
@pytest.mark.parametrize(
286+
("action", "input_status"),
287+
[
288+
("activate", None),
289+
("deactivate", None),
290+
],
291+
)
292+
async def test_async_custom_resource_activatable_actions_no_data(
293+
async_activatable_service, action, input_status
294+
):
295+
request_expected_content = b""
296+
response_expected_data = {"id": "OBJ-0000-0001", "status": "new_status"}
297+
with respx.mock:
298+
mock_route = respx.post(
299+
f"https://api.example.com/public/v1/dummy/activatable/OBJ-0000-0001/{action}"
300+
).mock(
301+
return_value=httpx.Response(
302+
status_code=httpx.codes.OK,
303+
headers={"content-type": "application/json"},
304+
json=response_expected_data,
305+
)
306+
)
307+
attachment = await getattr(async_activatable_service, action)("OBJ-0000-0001", input_status)
308+
309+
assert mock_route.call_count == 1
310+
request = mock_route.calls[0].request
311+
312+
assert request.content == request_expected_content
313+
assert attachment.to_dict() == response_expected_data
314+
assert isinstance(attachment, DummyModel)

0 commit comments

Comments
 (0)