44
55from mpt_api_client .http .async_service import AsyncService
66from mpt_api_client .http .service import Service
7- from mpt_api_client .resources .billing .mixins import AsyncRegeneratableMixin , RegeneratableMixin
7+ from mpt_api_client .resources .billing .mixins import (
8+ AsyncRecalculatableMixin ,
9+ AsyncRegeneratableMixin ,
10+ RecalculatableMixin ,
11+ RegeneratableMixin ,
12+ )
813from tests .conftest import DummyModel
914
1015
@@ -26,6 +31,24 @@ class DummyAsyncRegeneratableService(
2631 _collection_key = "data"
2732
2833
34+ class DummyRecalculatableService (
35+ RecalculatableMixin [DummyModel ],
36+ Service [DummyModel ],
37+ ):
38+ _endpoint = "/public/v1/dummy/recalculatable/"
39+ _model_class = DummyModel
40+ _collection_key = "data"
41+
42+
43+ class DummyAsyncRecalculatableService (
44+ AsyncRecalculatableMixin [DummyModel ],
45+ AsyncService [DummyModel ],
46+ ):
47+ _endpoint = "/public/v1/dummy/recalculatable/"
48+ _model_class = DummyModel
49+ _collection_key = "data"
50+
51+
2952@pytest .fixture
3053def regeneratable_service (http_client ):
3154 return DummyRegeneratableService (http_client = http_client )
@@ -36,6 +59,16 @@ def async_regeneratable_service(async_http_client):
3659 return DummyAsyncRegeneratableService (http_client = async_http_client )
3760
3861
62+ @pytest .fixture
63+ def recalculatable_service (http_client ):
64+ return DummyRecalculatableService (http_client = http_client )
65+
66+
67+ @pytest .fixture
68+ def async_recalculatable_service (async_http_client ):
69+ return DummyAsyncRecalculatableService (http_client = async_http_client )
70+
71+
3972@pytest .mark .parametrize (
4073 ("action" , "input_status" ),
4174 [
@@ -164,3 +197,127 @@ async def test_async_custom_resource_actions_no_data(
164197 assert request .content == request_expected_content
165198 assert journal .to_dict () == response_expected_data
166199 assert isinstance (journal , DummyModel )
200+
201+
202+ @pytest .mark .parametrize (
203+ ("action" , "input_status" ),
204+ [
205+ ("recalculate" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
206+ ("accept" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
207+ ("queue" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
208+ ],
209+ )
210+ def test_recalculate_resource_actions (recalculatable_service , action , input_status ):
211+ request_expected_content = b'{"id":"OBJ-0000-0001","status":"update"}'
212+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
213+ with respx .mock :
214+ mock_route = respx .post (
215+ f"https://api.example.com/public/v1/dummy/recalculatable/OBJ-0000-0001/{ action } "
216+ ).mock (
217+ return_value = httpx .Response (
218+ status_code = httpx .codes .OK ,
219+ headers = {"content-type" : "application/json" },
220+ json = response_expected_data ,
221+ )
222+ )
223+ recalc_obj = getattr (recalculatable_service , action )("OBJ-0000-0001" , input_status )
224+
225+ assert mock_route .call_count == 1
226+ request = mock_route .calls [0 ].request
227+
228+ assert request .content == request_expected_content
229+ assert recalc_obj .to_dict () == response_expected_data
230+ assert isinstance (recalc_obj , DummyModel )
231+
232+
233+ @pytest .mark .parametrize (
234+ ("action" , "input_status" ),
235+ [("recalculate" , None ), ("accept" , None ), ("queue" , None )],
236+ )
237+ def test_recalculate_resource_actions_no_data (recalculatable_service , action , input_status ):
238+ request_expected_content = b""
239+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
240+ with respx .mock :
241+ mock_route = respx .post (
242+ f"https://api.example.com/public/v1/dummy/recalculatable/OBJ-0000-0001/{ action } "
243+ ).mock (
244+ return_value = httpx .Response (
245+ status_code = httpx .codes .OK ,
246+ headers = {"content-type" : "application/json" },
247+ json = response_expected_data ,
248+ )
249+ )
250+ recalc_obj = getattr (recalculatable_service , action )("OBJ-0000-0001" , input_status )
251+
252+ assert mock_route .call_count == 1
253+ request = mock_route .calls [0 ].request
254+
255+ assert request .content == request_expected_content
256+ assert recalc_obj .to_dict () == response_expected_data
257+ assert isinstance (recalc_obj , DummyModel )
258+
259+
260+ @pytest .mark .parametrize (
261+ ("action" , "input_status" ),
262+ [
263+ ("recalculate" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
264+ ("accept" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
265+ ("queue" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
266+ ],
267+ )
268+ async def test_async_recalculate_resource_actions (
269+ async_recalculatable_service , action , input_status
270+ ):
271+ request_expected_content = b'{"id":"OBJ-0000-0001","status":"update"}'
272+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
273+ with respx .mock :
274+ mock_route = respx .post (
275+ f"https://api.example.com/public/v1/dummy/recalculatable/OBJ-0000-0001/{ action } "
276+ ).mock (
277+ return_value = httpx .Response (
278+ status_code = httpx .codes .OK ,
279+ headers = {"content-type" : "application/json" },
280+ json = response_expected_data ,
281+ )
282+ )
283+ recalc_obj = await getattr (async_recalculatable_service , action )(
284+ "OBJ-0000-0001" , input_status
285+ )
286+
287+ assert mock_route .call_count == 1
288+ request = mock_route .calls [0 ].request
289+
290+ assert request .content == request_expected_content
291+ assert recalc_obj .to_dict () == response_expected_data
292+ assert isinstance (recalc_obj , DummyModel )
293+
294+
295+ @pytest .mark .parametrize (
296+ ("action" , "input_status" ),
297+ [("recalculate" , None ), ("accept" , None ), ("queue" , None )],
298+ )
299+ async def test_async_recalculate_resource_actions_no_data (
300+ async_recalculatable_service , action , input_status
301+ ):
302+ request_expected_content = b""
303+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
304+ with respx .mock :
305+ mock_route = respx .post (
306+ f"https://api.example.com/public/v1/dummy/recalculatable/OBJ-0000-0001/{ action } "
307+ ).mock (
308+ return_value = httpx .Response (
309+ status_code = httpx .codes .OK ,
310+ headers = {"content-type" : "application/json" },
311+ json = response_expected_data ,
312+ )
313+ )
314+ recalc_obj = await getattr (async_recalculatable_service , action )(
315+ "OBJ-0000-0001" , input_status
316+ )
317+
318+ assert mock_route .call_count == 1
319+ request = mock_route .calls [0 ].request
320+
321+ assert request .content == request_expected_content
322+ assert recalc_obj .to_dict () == response_expected_data
323+ assert isinstance (recalc_obj , DummyModel )
0 commit comments