22import pytest
33import 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