55from mpt_api_client .http .async_service import AsyncService
66from mpt_api_client .http .service import Service
77from mpt_api_client .resources .billing .mixins import (
8+ AcceptableMixin ,
9+ AsyncAcceptableMixin ,
810 AsyncRecalculatableMixin ,
911 AsyncRegeneratableMixin ,
1012 RecalculatableMixin ,
@@ -49,6 +51,24 @@ class DummyAsyncRecalculatableService(
4951 _collection_key = "data"
5052
5153
54+ class DummyAcceptableService (
55+ AcceptableMixin [DummyModel ],
56+ Service [DummyModel ],
57+ ):
58+ _endpoint = "/public/v1/dummy/acceptable/"
59+ _model_class = DummyModel
60+ _collection_key = "data"
61+
62+
63+ class DummyAsyncAcceptableService (
64+ AsyncAcceptableMixin [DummyModel ],
65+ AsyncService [DummyModel ],
66+ ):
67+ _endpoint = "/public/v1/dummy/acceptable/"
68+ _model_class = DummyModel
69+ _collection_key = "data"
70+
71+
5272@pytest .fixture
5373def regeneratable_service (http_client ):
5474 return DummyRegeneratableService (http_client = http_client )
@@ -69,6 +89,16 @@ def async_recalculatable_service(async_http_client):
6989 return DummyAsyncRecalculatableService (http_client = async_http_client )
7090
7191
92+ @pytest .fixture
93+ def acceptable_service (http_client ):
94+ return DummyAcceptableService (http_client = http_client )
95+
96+
97+ @pytest .fixture
98+ def async_acceptable_service (async_http_client ):
99+ return DummyAsyncAcceptableService (http_client = async_http_client )
100+
101+
72102@pytest .mark .parametrize (
73103 ("action" , "input_status" ),
74104 [
@@ -321,3 +351,119 @@ async def test_async_recalculate_resource_actions_no_data(
321351 assert request .content == request_expected_content
322352 assert recalc_obj .to_dict () == response_expected_data
323353 assert isinstance (recalc_obj , DummyModel )
354+
355+
356+ @pytest .mark .parametrize (
357+ ("action" , "input_status" ),
358+ [
359+ ("accept" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
360+ ("queue" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
361+ ],
362+ )
363+ def test_acceptable_resource_actions (acceptable_service , action , input_status ):
364+ request_expected_content = b'{"id":"OBJ-0000-0001","status":"update"}'
365+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
366+ with respx .mock :
367+ mock_route = respx .post (
368+ f"https://api.example.com/public/v1/dummy/acceptable/OBJ-0000-0001/{ action } "
369+ ).mock (
370+ return_value = httpx .Response (
371+ status_code = httpx .codes .OK ,
372+ headers = {"content-type" : "application/json" },
373+ json = response_expected_data ,
374+ )
375+ )
376+ accept_obj = getattr (acceptable_service , action )("OBJ-0000-0001" , input_status )
377+
378+ assert mock_route .call_count == 1
379+ request = mock_route .calls [0 ].request
380+
381+ assert request .content == request_expected_content
382+ assert accept_obj .to_dict () == response_expected_data
383+ assert isinstance (accept_obj , DummyModel )
384+
385+
386+ @pytest .mark .parametrize (
387+ ("action" , "input_status" ),
388+ [("accept" , None ), ("queue" , None )],
389+ )
390+ def test_acceptable_resource_actions_no_data (acceptable_service , action , input_status ):
391+ request_expected_content = b""
392+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
393+ with respx .mock :
394+ mock_route = respx .post (
395+ f"https://api.example.com/public/v1/dummy/acceptable/OBJ-0000-0001/{ action } "
396+ ).mock (
397+ return_value = httpx .Response (
398+ status_code = httpx .codes .OK ,
399+ headers = {"content-type" : "application/json" },
400+ json = response_expected_data ,
401+ )
402+ )
403+ accept_obj = getattr (acceptable_service , action )("OBJ-0000-0001" , input_status )
404+
405+ assert mock_route .call_count == 1
406+ request = mock_route .calls [0 ].request
407+
408+ assert request .content == request_expected_content
409+ assert accept_obj .to_dict () == response_expected_data
410+ assert isinstance (accept_obj , DummyModel )
411+
412+
413+ @pytest .mark .parametrize (
414+ ("action" , "input_status" ),
415+ [
416+ ("accept" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
417+ ("queue" , {"id" : "OBJ-0000-0001" , "status" : "update" }),
418+ ],
419+ )
420+ async def test_async_acceptable_resource_actions (async_acceptable_service , action , input_status ):
421+ request_expected_content = b'{"id":"OBJ-0000-0001","status":"update"}'
422+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
423+ with respx .mock :
424+ mock_route = respx .post (
425+ f"https://api.example.com/public/v1/dummy/acceptable/OBJ-0000-0001/{ action } "
426+ ).mock (
427+ return_value = httpx .Response (
428+ status_code = httpx .codes .OK ,
429+ headers = {"content-type" : "application/json" },
430+ json = response_expected_data ,
431+ )
432+ )
433+ accept_obj = await getattr (async_acceptable_service , action )("OBJ-0000-0001" , input_status )
434+
435+ assert mock_route .call_count == 1
436+ request = mock_route .calls [0 ].request
437+
438+ assert request .content == request_expected_content
439+ assert accept_obj .to_dict () == response_expected_data
440+ assert isinstance (accept_obj , DummyModel )
441+
442+
443+ @pytest .mark .parametrize (
444+ ("action" , "input_status" ),
445+ [("accept" , None ), ("queue" , None )],
446+ )
447+ async def test_async_acceptable_resource_actions_no_data (
448+ async_acceptable_service , action , input_status
449+ ):
450+ request_expected_content = b""
451+ response_expected_data = {"id" : "OBJ-0000-0001" , "status" : "new_status" }
452+ with respx .mock :
453+ mock_route = respx .post (
454+ f"https://api.example.com/public/v1/dummy/acceptable/OBJ-0000-0001/{ action } "
455+ ).mock (
456+ return_value = httpx .Response (
457+ status_code = httpx .codes .OK ,
458+ headers = {"content-type" : "application/json" },
459+ json = response_expected_data ,
460+ )
461+ )
462+ accept_obj = await getattr (async_acceptable_service , action )("OBJ-0000-0001" , input_status )
463+
464+ assert mock_route .call_count == 1
465+ request = mock_route .calls [0 ].request
466+
467+ assert request .content == request_expected_content
468+ assert accept_obj .to_dict () == response_expected_data
469+ assert isinstance (accept_obj , DummyModel )
0 commit comments