From 60ec06e6ffb1c16a4677da4938138a644159c1ea Mon Sep 17 00:00:00 2001 From: renanneri01 Date: Mon, 27 Jan 2025 10:05:59 -0300 Subject: [PATCH 01/20] [Feature] Initial implementation of the creation order (#1) * Initial implementation of the creation order * Adjust reference devsite --- .pre-commit-config.yaml | 16 +++++++++ mercadopago/resources/__init__.py | 2 ++ mercadopago/resources/order.py | 35 ++++++++++++++++++ mercadopago/sdk.py | 27 +++++++++----- tests/test_order.py | 60 +++++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 mercadopago/resources/order.py create mode 100644 tests/test_order.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..9f72a15 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,16 @@ +repos: + - repo: https://github.com/melisource/fury_websec-git-hooks + rev: v2.0.0 + hooks: + - id: pre_commit_hook + stages: [commit] + - id: post_commit_hook + stages: [post-commit] + + - repo: https://github.com/melisource/fury_datasec-git-hooks + rev: 1.2.2 + hooks: + - id: pre_commit_hook + stages: [commit] + - id: post_commit_hook + stages: [post-commit] diff --git a/mercadopago/resources/__init__.py b/mercadopago/resources/__init__.py index ac555f8..407b471 100644 --- a/mercadopago/resources/__init__.py +++ b/mercadopago/resources/__init__.py @@ -11,6 +11,7 @@ from mercadopago.resources.disbursement_refund import DisbursementRefund from mercadopago.resources.identification_type import IdentificationType from mercadopago.resources.merchant_order import MerchantOrder +from mercadopago.resources.order import Order from mercadopago.resources.payment import Payment from mercadopago.resources.payment_methods import PaymentMethods from mercadopago.resources.plan import Plan @@ -31,6 +32,7 @@ 'HttpClient', 'IdentificationType', 'MerchantOrder', + 'Order', 'Payment', 'PaymentMethods', 'Plan', diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py new file mode 100644 index 0000000..cfd370c --- /dev/null +++ b/mercadopago/resources/order.py @@ -0,0 +1,35 @@ +""" + Module: order +""" +from mercadopago.core import MPBase + + +class Order(MPBase): + """ + This class provides the methods to access the API that will allow you to create + your own order experience on your website. + + From basic to advanced configurations, you control the whole experience. + + [Click here for more info](https://www.mercadopago.com/developers/en/guides/online-payments/checkout-api/introduction/) # pylint: disable=line-too-long + """ + + def create(self, order_object, request_options=None): + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/create/post/) # pylint: disable=line-too-long + + Args: + order_object (dict): Order to be created + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param order_object must be a Dictionary + + Returns: + dict: Order creation response + """ + if not isinstance(order_object, dict): + raise ValueError("Param order_object must be a Dictionary") + + return self._post(uri="/v1/orders", data=order_object, request_options=request_options) diff --git a/mercadopago/sdk.py b/mercadopago/sdk.py index 0536b58..13afaeb 100644 --- a/mercadopago/sdk.py +++ b/mercadopago/sdk.py @@ -12,6 +12,7 @@ DisbursementRefund, IdentificationType, MerchantOrder, + Order, Payment, PaymentMethods, Plan, @@ -33,15 +34,16 @@ class SDK: 5. Disbursement Refund 6. Identification Type 7. Merchant Order - 8. Payment Methods - 9. Payment - 10. Preapproval - 11. Preference - 12. Refund - 13. User - 14. Chargeback - 15. Subscription - 16. Plan + 8. Order + 9. Payment Methods + 10. Payment + 11. Preapproval + 12. Preference + 13. Refund + 14. User + 15. Chargeback + 16. Subscription + 17. Plan """ def __init__( @@ -120,6 +122,13 @@ def merchant_order(self, request_options=None): """ return MerchantOrder(request_options is not None and request_options or self.request_options, self.http_client) + + def order(self, request_options=None): + """ + Returns the attribute value of the function + """ + return Order(request_options is not None and request_options + or self.request_options, self.http_client) def payment(self, request_options=None): """ diff --git a/tests/test_order.py b/tests/test_order.py new file mode 100644 index 0000000..dda7dee --- /dev/null +++ b/tests/test_order.py @@ -0,0 +1,60 @@ +""" + Module: test_order +""" +from datetime import datetime +import os +import unittest +import random +import mercadopago + + +class TestOrder(unittest.TestCase): + """ + Test Module: Order + """ + sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) + + def test_create(self): + """ + Test Function: Order + """ + card_token_object = { + "card_number": "5031433215406351", + "security_code": "123", + "expiration_year": "2025", + "expiration_month": "11", + "cardholder": { + "name": "APRO" + } + } + + card_token_created = self.sdk.card_token().create(card_token_object) + random_email_id = random.randint(100000, 999999) + order_object = { + "type": "online", + "total_amount": "1000.00", + "external_reference": "ext_ref_1234", + "transactions": { + "payments": [ + { + "amount": "1000.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_created["response"]["id"], + "installments": 12 + } + } + ] + }, + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + } + } + + order_created = self.sdk.order().create(order_object) + self.assertEqual(order_created["status"], 201) + self.assertEqual(order_created["response"]["status"], "processed") + +if __name__ == "__main__": + unittest.main() From 6857ba2449ea0a3ead2802ab35bbecf52f738156 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 11:47:29 -0300 Subject: [PATCH 02/20] create endpoint get and process by id --- tests/test_order.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_order.py b/tests/test_order.py index dda7dee..6352a36 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -14,7 +14,7 @@ class TestOrder(unittest.TestCase): """ sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - def test_create(self): + def test_create_get(self): """ Test Function: Order """ @@ -56,5 +56,10 @@ def test_create(self): self.assertEqual(order_created["status"], 201) self.assertEqual(order_created["response"]["status"], "processed") + order_get = self.sdk.order().get( + order_created["response"]["id"]) + self.assertEqual(order_get["status"], 200) + + if __name__ == "__main__": unittest.main() From 5266cac468801b1ee6cc63d3c68a3d362d11cbea Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 11:56:38 -0300 Subject: [PATCH 03/20] update --- mercadopago/resources/order.py | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index cfd370c..c7efcac 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -33,3 +33,43 @@ def create(self, order_object, request_options=None): raise ValueError("Param order_object must be a Dictionary") return self._post(uri="/v1/orders", data=order_object, request_options=request_options) + + def get(self, order_id, request_options=None): + """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/get-order/get) # pylint: disable=line-too-long + + Args: + order_id (str): The Order ID + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param order_id must be a string + + Returns: + dict: Order ID returned in the response to the request made for its creation. + """ + + if not isinstance(order_id, str): + raise ValueError("Param order_id must be a string") + + return self._get(uri="/v1/orders/" + str(order_id), request_options=request_options) + + def process(self, order_id, request_options=None): + """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online/process-order/post # pylint: disable=line-too-long + Args: + order_id (str): ID of the order to be processed. This value is returned in the response to the Create order request. + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param order_id must be a string + Returns: + dict: Order ID returned in the response to the request made for its creation. + """ + + if not isinstance(order_id, str): + raise ValueError("Param order_id must be a string") + + return self._get(uri="/v1/orders/" + str(order_id) + "/process", request_options=request_options) \ No newline at end of file From 5fa24917bb81d8e55459f912eac1d2c98d99a866 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 14:33:34 -0300 Subject: [PATCH 04/20] update order tests --- tests/test_order.py | 65 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index 6352a36..5a37599 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -14,14 +14,14 @@ class TestOrder(unittest.TestCase): """ sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - def test_create_get(self): + def test_create_order_and_get_by_id(self): """ Test Function: Order """ card_token_object = { "card_number": "5031433215406351", "security_code": "123", - "expiration_year": "2025", + "expiration_year": "2055", "expiration_month": "11", "cardholder": { "name": "APRO" @@ -60,6 +60,65 @@ def test_create_get(self): order_created["response"]["id"]) self.assertEqual(order_get["status"], 200) - if __name__ == "__main__": unittest.main() + + +class TestOrderProcess(unittest.TestCase): + sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) + + def test_process_order(self): + card_token_object = { + "card_number": "5031433215406351", + "security_code": "123", + "expiration_year": "2055", + "expiration_month": "11", + "cardholder": { + "name": "APRO" + } + } + card_token_created = self.sdk.card_token().create(card_token_object) + if card_token_created.get("status") != 201 or not card_token_created.get("response"): + self.fail(f"Falha ao criar card token: {card_token_created}") + + card_token_id = card_token_created["response"]["id"] + random_email_id = random.randint(100000, 999999) + order_object = { + "type": "online", + "processing_mode": "manual", + "external_reference": "ext_ref_1234", + "total_amount": "200.00", + "transactions": { + "payments": [ + { + "amount": "200.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 1 + } + } + ] + }, + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + } + } + + order_created = self.sdk.order().create(order_object) + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Falha ao criar pedido: {order_created}") + + order_id = order_created["response"]["id"] + print("Pedido criado com ID:", order_id) + + process_response = self.sdk.order().process(order_id) + if process_response.get("status") != 200 or not process_response.get("response"): + self.fail(f"Falha ao processar pedido: {process_response}") + + self.assertEqual(process_response["status"], 200, "Status HTTP inválido ao processar o pedido") + print("Pedido processado com sucesso.") + + if __name__ == "__main__": + unittest.main() From 19d946eddea82546e040d93e0e2b02a57125ab42 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 14:52:44 -0300 Subject: [PATCH 05/20] fix process method --- mercadopago/resources/order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index c7efcac..993b540 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -72,4 +72,4 @@ def process(self, order_id, request_options=None): if not isinstance(order_id, str): raise ValueError("Param order_id must be a string") - return self._get(uri="/v1/orders/" + str(order_id) + "/process", request_options=request_options) \ No newline at end of file + return self._post(uri="/v1/orders/" + str(order_id) + "/process", request_options=request_options) \ No newline at end of file From afd7023351919b590eb279380b811ee39fa591a6 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 16:40:07 -0300 Subject: [PATCH 06/20] endpoint cancel and capture --- mercadopago/resources/order.py | 38 ++++++++++++++++++++ tests/test_order.py | 65 ++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index cfd370c..a716795 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -33,3 +33,41 @@ def create(self, order_object, request_options=None): raise ValueError("Param order_object must be a Dictionary") return self._post(uri="/v1/orders", data=order_object, request_options=request_options) + + def cancel(self, order_id, request_options=None): + """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/cancel-order/post) # pylint: disable=line-too-long + + Args: + order_id (str): Order ID + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param order_id must be a string + + Returns: + dict: Order cancellation response + """ + if not isinstance(order_id, str): + raise ValueError("Param order_id must be a string") + + return self._post(uri="/v1/orders/" + str(order_id) + "/cancel", request_options=request_options) + + def capture(self, order_id, request_options=None): + """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online/capture-order/post) # pylint: disable=line-too-long + Args: + order_id (str): ID of the order to be captured. This value is returned in the response to the Create order request. + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + Raises: + ValueError: Param order_id must be a string + Returns: + dict: Order ID returned in the response to the request made for its creation. + """ + + if not isinstance(order_id, str): + raise ValueError("Param order_id must be a string") + + return self._post(uri="/v1/orders/" + str(order_id) + "/capture", request_options=request_options) \ No newline at end of file diff --git a/tests/test_order.py b/tests/test_order.py index dda7dee..88e72a4 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -58,3 +58,68 @@ def test_create(self): if __name__ == "__main__": unittest.main() + +class TestOrderCancelAndCapture(unittest.TestCase): + sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) + + def create_card_token(self): + card_token_object = { + "card_number": "5031433215406351", + "security_code": "123", + "expiration_year": "2025", + "expiration_month": "11", + "cardholder": { + "name": "APRO" + } + } + card_token_created = self.sdk.card_token().create(card_token_object) + if card_token_created.get("status") != 201 or not card_token_created.get("response"): + self.fail(f"Failed to create card token: {card_token_created}") + return card_token_created["response"]["id"] + + def create_order_canceled_or_captured(self, card_token_id): + order_object_cc = { + "type": "online", + "processing_mode": "automatic", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "payer": { + "email": "test_1731350184@testuser.com" + }, + "capture_mode": "manual", + "transactions": { + "payments": [ + { + "amount": "200.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 1 + } + } + ] + } + } + order_created = self.sdk.order().create(order_object_cc) + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"]["id"] + + def test_cancel_order(self): + card_token_id = self.create_card_token() + order_id = self.create_order_canceled_or_captured(card_token_id) + order_canceled = self.sdk.order().cancel(order_id) + self.assertEqual(order_canceled["status"], 200) + self.assertEqual(order_canceled["response"]["status"], "canceled") + + def test_capture_order(self): + card_token_id = self.create_card_token() + order_id = self.create_order_canceled_or_captured(card_token_id) + order_captured = self.sdk.order().capture(order_id) + self.assertEqual(order_captured["status"], 200) + self.assertEqual(order_captured["response"]["status"], "processed") + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file From 7709cdcf151d8f7c27a4f26d751aa3d3112570b7 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 16:50:26 -0300 Subject: [PATCH 07/20] fixes --- mercadopago/resources/order.py | 2 +- tests/test_order.py | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index 993b540..b4c2f89 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -35,7 +35,7 @@ def create(self, order_object, request_options=None): return self._post(uri="/v1/orders", data=order_object, request_options=request_options) def get(self, order_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/get-order/get) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/online-payments/get-order/get ) # pylint: disable=line-too-long Args: order_id (str): The Order ID diff --git a/tests/test_order.py b/tests/test_order.py index 5a37599..d73398c 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -60,9 +60,6 @@ def test_create_order_and_get_by_id(self): order_created["response"]["id"]) self.assertEqual(order_get["status"], 200) -if __name__ == "__main__": - unittest.main() - class TestOrderProcess(unittest.TestCase): sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) @@ -79,7 +76,7 @@ def test_process_order(self): } card_token_created = self.sdk.card_token().create(card_token_object) if card_token_created.get("status") != 201 or not card_token_created.get("response"): - self.fail(f"Falha ao criar card token: {card_token_created}") + self.fail(f"Failed to create card token: {card_token_created}") card_token_id = card_token_created["response"]["id"] random_email_id = random.randint(100000, 999999) @@ -108,17 +105,15 @@ def test_process_order(self): order_created = self.sdk.order().create(order_object) if order_created.get("status") != 201 or not order_created.get("response"): - self.fail(f"Falha ao criar pedido: {order_created}") - + self.fail(f"Failed to create an order: {order_created}") order_id = order_created["response"]["id"] - print("Pedido criado com ID:", order_id) process_response = self.sdk.order().process(order_id) if process_response.get("status") != 200 or not process_response.get("response"): - self.fail(f"Falha ao processar pedido: {process_response}") + self.fail(f"Failed to create an order: {process_response}") self.assertEqual(process_response["status"], 200, "Status HTTP inválido ao processar o pedido") - print("Pedido processado com sucesso.") + print("Order processed successfully.") - if __name__ == "__main__": - unittest.main() +if __name__ == "__main__": + unittest.main() From a4c157973454d7249dfe8059fc4887b7a7a4fbe1 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Mon, 3 Feb 2025 17:17:45 -0300 Subject: [PATCH 08/20] updates --- mercadopago/resources/order.py | 3 ++- tests/test_order.py | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index a716795..7e50209 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -36,7 +36,7 @@ def create(self, order_object, request_options=None): def cancel(self, order_id, request_options=None): """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/cancel-order/post) # pylint: disable=line-too-long - + // esperando confirmação do link com a Paloma Args: order_id (str): Order ID request_options (mercadopago.config.request_options, optional): An instance of @@ -56,6 +56,7 @@ def cancel(self, order_id, request_options=None): def capture(self, order_id, request_options=None): """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online/capture-order/post) # pylint: disable=line-too-long + // esperando confirmação do link com a Paloma Args: order_id (str): ID of the order to be captured. This value is returned in the response to the Create order request. request_options (mercadopago.config.request_options, optional): An instance of diff --git a/tests/test_order.py b/tests/test_order.py index 88e72a4..63b85c3 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -56,8 +56,6 @@ def test_create(self): self.assertEqual(order_created["status"], 201) self.assertEqual(order_created["response"]["status"], "processed") -if __name__ == "__main__": - unittest.main() class TestOrderCancelAndCapture(unittest.TestCase): sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) @@ -78,13 +76,14 @@ def create_card_token(self): return card_token_created["response"]["id"] def create_order_canceled_or_captured(self, card_token_id): + random_email_id = random.randint(100000, 999999) order_object_cc = { "type": "online", "processing_mode": "automatic", "total_amount": "200.00", "external_reference": "ext_ref_1234", "payer": { - "email": "test_1731350184@testuser.com" + "email": f"test_payer_{random_email_id}@testuser.com" }, "capture_mode": "manual", "transactions": { From 029629252845a664b17fab0283c3fc42961a88f4 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Tue, 4 Feb 2025 09:24:16 -0300 Subject: [PATCH 09/20] update link doc dev site --- mercadopago/resources/order.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index 7e50209..7054fb6 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -36,7 +36,6 @@ def create(self, order_object, request_options=None): def cancel(self, order_id, request_options=None): """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/cancel-order/post) # pylint: disable=line-too-long - // esperando confirmação do link com a Paloma Args: order_id (str): Order ID request_options (mercadopago.config.request_options, optional): An instance of @@ -55,8 +54,7 @@ def cancel(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/cancel", request_options=request_options) def capture(self, order_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online/capture-order/post) # pylint: disable=line-too-long - // esperando confirmação do link com a Paloma + """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/capture/post) # pylint: disable=line-too-long Args: order_id (str): ID of the order to be captured. This value is returned in the response to the Create order request. request_options (mercadopago.config.request_options, optional): An instance of From 20b2267ea9dfcae3c4467c34e5ba846747a6091b Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Tue, 4 Feb 2025 17:19:22 -0300 Subject: [PATCH 10/20] create endpoints create and update transaction --- mercadopago/resources/order.py | 62 +++++++++++++++++--- tests/test_order.py | 104 ++++++++++++++++++++++++++++++++- 2 files changed, 158 insertions(+), 8 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index cfd370c..570d4cd 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -3,33 +3,81 @@ """ from mercadopago.core import MPBase - class Order(MPBase): """ This class provides the methods to access the API that will allow you to create your own order experience on your website. - From basic to advanced configurations, you control the whole experience. - [Click here for more info](https://www.mercadopago.com/developers/en/guides/online-payments/checkout-api/introduction/) # pylint: disable=line-too-long """ def create(self, order_object, request_options=None): """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/create/post/) # pylint: disable=line-too-long - Args: order_object (dict): Order to be created request_options (mercadopago.config.request_options, optional): An instance of RequestOptions can be pass changing or adding custom options to ur REST call. Defaults to None. - Raises: ValueError: Param order_object must be a Dictionary - Returns: dict: Order creation response """ if not isinstance(order_object, dict): raise ValueError("Param order_object must be a Dictionary") - return self._post(uri="/v1/orders", data=order_object, request_options=request_options) + response = self._post(uri="/v1/orders", data=order_object, request_options=request_options) + if response.get("status") != 201: + raise Exception(f"Failed to create order: {response}") + return response + + def add_transaction(self, order_id, transaction_object, request_options=None): + """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/add-transaction/post) # pylint: disable=line-too-long + + Args: + order_id (str): The ID of the order to which the transaction will be added + transaction_object (dict): Transaction to be added + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param transaction_object must be a Dictionary + + Returns: + dict: Transaction addition response + """ + if not isinstance(transaction_object, dict): + raise ValueError("Param transaction_object must be a Dictionary") + + response = self._post(uri=f"/v1/orders/{order_id}/transactions", data=transaction_object, + request_options=request_options) + if response.get("status") != 201: + raise Exception(f"Failed to add transaction: {response}") + return response + + def update_transaction(self, order_id, transaction_id, transaction_object, request_options=None): + """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/update-transaction/put) # pylint: disable=line-too-long + + Args: + order_id (str): The ID of the order to which the transaction belongs + transaction_id (str): The ID of the transaction to be updated + transaction_object (dict): Transaction details to be updated + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param transaction_object must be a Dictionary + + Returns: + dict: Transaction update response + """ + if not isinstance(transaction_object, dict): + raise ValueError("Param transaction_object must be a Dictionary") + + response = self._put(uri=f"/v1/orders/{order_id}/transactions/{transaction_id}", data=transaction_object, + request_options=request_options) + if response.get("status") != 200: + raise Exception(f"Failed to update transaction: {response}") + return response diff --git a/tests/test_order.py b/tests/test_order.py index dda7dee..a05c8c7 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -56,5 +56,107 @@ def test_create(self): self.assertEqual(order_created["status"], 201) self.assertEqual(order_created["response"]["status"], "processed") + +class TestsTransaction(unittest.TestCase): + sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) + + def create_card_token(self): + card_token_object = { + "card_number": "5031433215406351", + "security_code": "123", + "expiration_year": "2025", + "expiration_month": "11", + "cardholder": { + "name": "APRO" + } + } + print("Creating card token...") + card_token_created = self.sdk.card_token().create(card_token_object) + print("Card token creation response:", card_token_created) + + if card_token_created.get("status") != 201 or not card_token_created.get("response"): + self.fail(f"Failed to create card token: {card_token_created}") + return card_token_created["response"]["id"] + + def create_order_builder_mode(self, card_token_id): + random_email_id = random.randint(100000, 999999) + order_object_cc = { + "type": "online", + "processing_mode": "manual", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + }, + } + print("Creating order in builder mode...") + order_created = self.sdk.order().create(order_object_cc) + print("Order creation response:", order_created) + + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"]["id"] + + def test_add_transaction(self): + card_token_id = self.create_card_token() + print("Card token ID:", card_token_id) + + order_id = self.create_order_builder_mode(card_token_id) + print("Order ID:", order_id) + + transaction_object = { + "payments": [ + { + "amount": "1000.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 12 + } + } + ] + } + + print("Adding transaction...") + transaction_added = self.sdk.order().add_transaction(order_id, transaction_object) + print("Transaction addition response:", transaction_added) + + self.assertEqual(transaction_added["status"], 201) + self.assertEqual(transaction_added["response"]["status"], "processed") + + def test_cancel_transaction(self): + card_token_id = self.create_card_token() + order_id = self.create_order_builder_mode(card_token_id) + + transaction_object = { + "payments": [ + { + "amount": "1000.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 12 + } + } + ] + } + + print("Adding transaction for cancellation...") + transaction_added = self.sdk.order().add_transaction(order_id, transaction_object) + print("Transaction addition response:", transaction_added) + + transaction_id = transaction_added["response"]["id"] + print("Transaction ID:", transaction_id) + + print("Cancelling transaction...") + transaction_canceled = self.sdk.order().cancel_transaction(order_id, transaction_id) + print("Transaction cancellation response:", transaction_canceled) + + self.assertEqual(transaction_canceled["status"], 200) + self.assertEqual(transaction_canceled["response"]["status"], "canceled") + + if __name__ == "__main__": - unittest.main() + unittest.main() \ No newline at end of file From c2512d790e30ae026fc0a3af5dd3016f9c51e7b6 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Tue, 4 Feb 2025 18:35:00 -0300 Subject: [PATCH 11/20] update --- tests/test_order.py | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index a05c8c7..8126350 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -107,7 +107,7 @@ def test_add_transaction(self): transaction_object = { "payments": [ { - "amount": "1000.00", + "amount": "200.00", "payment_method": { "id": "master", "type": "credit_card", @@ -125,38 +125,5 @@ def test_add_transaction(self): self.assertEqual(transaction_added["status"], 201) self.assertEqual(transaction_added["response"]["status"], "processed") - def test_cancel_transaction(self): - card_token_id = self.create_card_token() - order_id = self.create_order_builder_mode(card_token_id) - - transaction_object = { - "payments": [ - { - "amount": "1000.00", - "payment_method": { - "id": "master", - "type": "credit_card", - "token": card_token_id, - "installments": 12 - } - } - ] - } - - print("Adding transaction for cancellation...") - transaction_added = self.sdk.order().add_transaction(order_id, transaction_object) - print("Transaction addition response:", transaction_added) - - transaction_id = transaction_added["response"]["id"] - print("Transaction ID:", transaction_id) - - print("Cancelling transaction...") - transaction_canceled = self.sdk.order().cancel_transaction(order_id, transaction_id) - print("Transaction cancellation response:", transaction_canceled) - - self.assertEqual(transaction_canceled["status"], 200) - self.assertEqual(transaction_canceled["response"]["status"], "canceled") - - if __name__ == "__main__": unittest.main() \ No newline at end of file From 728230131f1dba6d02d04c0ce675e3a45288e8f3 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Wed, 5 Feb 2025 09:53:22 -0300 Subject: [PATCH 12/20] fix indentation --- mercadopago/resources/order.py | 7 +++---- tests/test_order.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index be258a1..25fe703 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -3,7 +3,6 @@ """ from mercadopago.core import MPBase - class Order(MPBase): """ This class provides the methods to access the API that will allow you to create @@ -74,7 +73,7 @@ def process(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/process", request_options=request_options) - def cancel(self, order_id, request_options=None): + def cancel(self, order_id, request_options=None): """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/cancel-order/post) # pylint: disable=line-too-long Args: order_id (str): Order ID @@ -111,7 +110,7 @@ def capture(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/capture", request_options=request_options) - def add_transaction(self, order_id, transaction_object, request_options=None): + def add_transaction(self, order_id, transaction_object, request_options=None): """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/add-transaction/post) # pylint: disable=line-too-long Args: @@ -160,4 +159,4 @@ def update_transaction(self, order_id, transaction_id, transaction_object, reque request_options=request_options) if response.get("status") != 200: raise Exception(f"Failed to update transaction: {response}") - return response + return response \ No newline at end of file diff --git a/tests/test_order.py b/tests/test_order.py index 09d21b4..028006f 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -248,4 +248,4 @@ def test_add_transaction(self): self.assertEqual(transaction_added["response"]["status"], "processed") if __name__ == "__main__": - unittest.main() + unittest.main() \ No newline at end of file From 1e7b3fc4d17c1ecf4104c55ed485ca5c33e677e4 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Wed, 5 Feb 2025 12:21:28 -0300 Subject: [PATCH 13/20] fix some tests --- tests/test_order.py | 100 +++++++++----------------------------------- 1 file changed, 20 insertions(+), 80 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index 028006f..d2a8092 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -1,7 +1,6 @@ """ Module: test_order """ -from datetime import datetime import os import unittest import random @@ -14,21 +13,23 @@ class TestOrder(unittest.TestCase): """ sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - def test_create_order_and_get_by_id(self): - """ - Test Function: Order - """ + def create_test_card(self, status="APRO"): card_token_object = { "card_number": "5031433215406351", "security_code": "123", - "expiration_year": "2055", + "expiration_year": "2030", "expiration_month": "11", - "cardholder": { - "name": "APRO" - } + "cardholder": {"name": status} } - card_token_created = self.sdk.card_token().create(card_token_object) + return card_token_created["response"]["id"] + + """teste ok""" + def test_create_order_and_get_by_id(self): + """ + Test Function: Create an Order and Get an Order by ID + """ + card_token_id = self.create_test_card() random_email_id = random.randint(100000, 999999) order_object = { "type": "online", @@ -41,7 +42,7 @@ def test_create_order_and_get_by_id(self): "payment_method": { "id": "master", "type": "credit_card", - "token": card_token_created["response"]["id"], + "token": card_token_id, "installments": 12 } } @@ -51,34 +52,17 @@ def test_create_order_and_get_by_id(self): "email": f"test_payer_{random_email_id}@testuser.com" } } - + order_created = self.sdk.order().create(order_object) self.assertEqual(order_created["status"], 201) self.assertEqual(order_created["response"]["status"], "processed") - order_get = self.sdk.order().get( - order_created["response"]["id"]) + order_get = self.sdk.order().get(order_created["response"]["id"]) self.assertEqual(order_get["status"], 200) - -class TestOrderProcess(unittest.TestCase): - sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - + """teste ok""" def test_process_order(self): - card_token_object = { - "card_number": "5031433215406351", - "security_code": "123", - "expiration_year": "2055", - "expiration_month": "11", - "cardholder": { - "name": "APRO" - } - } - card_token_created = self.sdk.card_token().create(card_token_object) - if card_token_created.get("status") != 201 or not card_token_created.get("response"): - self.fail(f"Failed to create card token: {card_token_created}") - - card_token_id = card_token_created["response"]["id"] + card_token_id = self.create_test_card() random_email_id = random.randint(100000, 999999) order_object = { "type": "online", @@ -104,36 +88,13 @@ def test_process_order(self): } order_created = self.sdk.order().create(order_object) - if order_created.get("status") != 201 or not order_created.get("response"): - self.fail(f"Failed to create an order: {order_created}") order_id = order_created["response"]["id"] - process_response = self.sdk.order().process(order_id) if process_response.get("status") != 200 or not process_response.get("response"): self.fail(f"Failed to create an order: {process_response}") - self.assertEqual(process_response["status"], 200, "Status HTTP inválido ao processar o pedido") print("Order processed successfully.") - -class TestOrderCancelAndCapture(unittest.TestCase): - sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - - def create_card_token(self): - card_token_object = { - "card_number": "5031433215406351", - "security_code": "123", - "expiration_year": "2025", - "expiration_month": "11", - "cardholder": { - "name": "APRO" - } - } - card_token_created = self.sdk.card_token().create(card_token_object) - if card_token_created.get("status") != 201 or not card_token_created.get("response"): - self.fail(f"Failed to create card token: {card_token_created}") - return card_token_created["response"]["id"] - def create_order_canceled_or_captured(self, card_token_id): random_email_id = random.randint(100000, 999999) order_object_cc = { @@ -165,41 +126,20 @@ def create_order_canceled_or_captured(self, card_token_id): return order_created["response"]["id"] def test_cancel_order(self): - card_token_id = self.create_card_token() + card_token_id = self.create_test_card() order_id = self.create_order_canceled_or_captured(card_token_id) order_canceled = self.sdk.order().cancel(order_id) self.assertEqual(order_canceled["status"], 200) self.assertEqual(order_canceled["response"]["status"], "canceled") + """teste ok""" def test_capture_order(self): - card_token_id = self.create_card_token() + card_token_id = self.create_test_card() order_id = self.create_order_canceled_or_captured(card_token_id) order_captured = self.sdk.order().capture(order_id) self.assertEqual(order_captured["status"], 200) self.assertEqual(order_captured["response"]["status"], "processed") - -class TestsTransaction(unittest.TestCase): - sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - - def create_card_token(self): - card_token_object = { - "card_number": "5031433215406351", - "security_code": "123", - "expiration_year": "2025", - "expiration_month": "11", - "cardholder": { - "name": "APRO" - } - } - print("Creating card token...") - card_token_created = self.sdk.card_token().create(card_token_object) - print("Card token creation response:", card_token_created) - - if card_token_created.get("status") != 201 or not card_token_created.get("response"): - self.fail(f"Failed to create card token: {card_token_created}") - return card_token_created["response"]["id"] - def create_order_builder_mode(self, card_token_id): random_email_id = random.randint(100000, 999999) order_object_cc = { @@ -220,7 +160,7 @@ def create_order_builder_mode(self, card_token_id): return order_created["response"]["id"] def test_add_transaction(self): - card_token_id = self.create_card_token() + card_token_id = self.create_test_card() print("Card token ID:", card_token_id) order_id = self.create_order_builder_mode(card_token_id) From f3d99f982157896f7b7d017c03e142c87dfd400a Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Wed, 5 Feb 2025 14:53:21 -0300 Subject: [PATCH 14/20] update testes --- mercadopago/resources/order.py | 2 +- tests/test_order.py | 57 ++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index 25fe703..eee182b 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -110,7 +110,7 @@ def capture(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/capture", request_options=request_options) - def add_transaction(self, order_id, transaction_object, request_options=None): + def create_transaction(self, order_id, transaction_object, request_options=None): """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/add-transaction/post) # pylint: disable=line-too-long Args: diff --git a/tests/test_order.py b/tests/test_order.py index d2a8092..066684d 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -125,6 +125,7 @@ def create_order_canceled_or_captured(self, card_token_id): self.fail(f"Failed to create order: {order_created}") return order_created["response"]["id"] + """teste ok""" def test_cancel_order(self): card_token_id = self.create_test_card() order_id = self.create_order_canceled_or_captured(card_token_id) @@ -159,6 +160,7 @@ def create_order_builder_mode(self, card_token_id): self.fail(f"Failed to create order: {order_created}") return order_created["response"]["id"] + """teste ok""" def test_add_transaction(self): card_token_id = self.create_test_card() print("Card token ID:", card_token_id) @@ -181,11 +183,62 @@ def test_add_transaction(self): } print("Adding transaction...") - transaction_added = self.sdk.order().add_transaction(order_id, transaction_object) + transaction_added = self.sdk.order().create_transaction(order_id, transaction_object) print("Transaction addition response:", transaction_added) self.assertEqual(transaction_added["status"], 201) - self.assertEqual(transaction_added["response"]["status"], "processed") + + def test_update_transaction(self): + card_token_id = self.create_test_card() + order_id = self.create_order_builder_mode(card_token_id) + random_email_id = random.randint(100000, 999999) + order_mode_builder_complete = { + "type": "online", + "processing_mode": "manual", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "transactions": { + "payments": [ + { + "amount": "200.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 12 + } + } + ] + }, + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + } + } + + order_created = self.sdk.order().create(order_mode_builder_complete) + transaction_id = order_created["response"]["transactions"]["payments"][0]["id"] + + transaction_update = { + "payment_method": { + "type": "credit_card", + "installments": 5 + } + } + + transaction_added = self.sdk.order().add_transaction(order_id, transaction_update) + self.assertEqual(transaction_added["status"], 201) + + update_transaction_object = { + "amount": "150.00", + "payment_method": { + "installments": 1 + } + } + + transaction_id = transaction_added["response"]["payments"][0]["id"] + transaction_updated = self.sdk.order().update_transaction(order_id, transaction_id, update_transaction_object) + self.assertEqual(transaction_updated["status"], 200) + if __name__ == "__main__": unittest.main() \ No newline at end of file From 360c9aa655fb88c87f9d6ac880654703b3c4594a Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Wed, 5 Feb 2025 16:09:32 -0300 Subject: [PATCH 15/20] fix test --- tests/test_order.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index 066684d..bdaba59 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -1,6 +1,7 @@ """ Module: test_order """ +import json import os import unittest import random @@ -188,9 +189,7 @@ def test_add_transaction(self): self.assertEqual(transaction_added["status"], 201) - def test_update_transaction(self): - card_token_id = self.create_test_card() - order_id = self.create_order_builder_mode(card_token_id) + def create_order_builder_mode_complete(self, card_token_id): random_email_id = random.randint(100000, 999999) order_mode_builder_complete = { "type": "online", @@ -216,7 +215,20 @@ def test_update_transaction(self): } order_created = self.sdk.order().create(order_mode_builder_complete) - transaction_id = order_created["response"]["transactions"]["payments"][0]["id"] + + + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"] + + def test_update_transaction(self): + card_token_id = self.create_test_card() + order_created = self.create_order_builder_mode_complete(card_token_id) + order_id = order_created["id"] + print("orderID :", order_id) + transaction_id = order_created["transactions"]["payments"][0]["id"] + print("transactionID :" ,transaction_id) + transaction_update = { "payment_method": { @@ -225,18 +237,7 @@ def test_update_transaction(self): } } - transaction_added = self.sdk.order().add_transaction(order_id, transaction_update) - self.assertEqual(transaction_added["status"], 201) - - update_transaction_object = { - "amount": "150.00", - "payment_method": { - "installments": 1 - } - } - - transaction_id = transaction_added["response"]["payments"][0]["id"] - transaction_updated = self.sdk.order().update_transaction(order_id, transaction_id, update_transaction_object) + transaction_updated = self.sdk.order().update_transaction(order_id, transaction_id, transaction_update) self.assertEqual(transaction_updated["status"], 200) From 79fa1d9782c40c8e57857cdd5c137d3b688ba413 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Wed, 5 Feb 2025 16:23:16 -0300 Subject: [PATCH 16/20] include sleep --- tests/test_order.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index bdaba59..11a4dd0 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -3,6 +3,7 @@ """ import json import os +import time import unittest import random import mercadopago @@ -25,7 +26,6 @@ def create_test_card(self, status="APRO"): card_token_created = self.sdk.card_token().create(card_token_object) return card_token_created["response"]["id"] - """teste ok""" def test_create_order_and_get_by_id(self): """ Test Function: Create an Order and Get an Order by ID @@ -61,7 +61,6 @@ def test_create_order_and_get_by_id(self): order_get = self.sdk.order().get(order_created["response"]["id"]) self.assertEqual(order_get["status"], 200) - """teste ok""" def test_process_order(self): card_token_id = self.create_test_card() random_email_id = random.randint(100000, 999999) @@ -126,15 +125,14 @@ def create_order_canceled_or_captured(self, card_token_id): self.fail(f"Failed to create order: {order_created}") return order_created["response"]["id"] - """teste ok""" def test_cancel_order(self): card_token_id = self.create_test_card() order_id = self.create_order_canceled_or_captured(card_token_id) + time.sleep(4) order_canceled = self.sdk.order().cancel(order_id) self.assertEqual(order_canceled["status"], 200) self.assertEqual(order_canceled["response"]["status"], "canceled") - """teste ok""" def test_capture_order(self): card_token_id = self.create_test_card() order_id = self.create_order_canceled_or_captured(card_token_id) @@ -161,7 +159,6 @@ def create_order_builder_mode(self, card_token_id): self.fail(f"Failed to create order: {order_created}") return order_created["response"]["id"] - """teste ok""" def test_add_transaction(self): card_token_id = self.create_test_card() print("Card token ID:", card_token_id) @@ -229,7 +226,6 @@ def test_update_transaction(self): transaction_id = order_created["transactions"]["payments"][0]["id"] print("transactionID :" ,transaction_id) - transaction_update = { "payment_method": { "type": "credit_card", From a7a9737f9fb7aab73d9719d78ac1df1530412bc9 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Wed, 5 Feb 2025 17:47:04 -0300 Subject: [PATCH 17/20] create methods --- mercadopago/resources/order.py | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index eee182b..fd2a913 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -159,4 +159,52 @@ def update_transaction(self, order_id, transaction_id, transaction_object, reque request_options=request_options) if response.get("status") != 200: raise Exception(f"Failed to update transaction: {response}") + return response + + def refund_transaction(self, order_id, transaction_object, request_options=None): + """[Click here for more info](https://www.mercadopago.com/developers/pt/reference/order/online-payments/refund/post) # pylint: disable=line-too-long + + Args: + order_id (str): The ID of the order to which the transaction belongs + transaction_object (dict): Transaction details to be updated + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to ur REST call. + Defaults to None. + + Raises: + ValueError: Param transaction_object must be a Dictionary + + Returns: + dict: Transaction update response + """ + if not isinstance(transaction_object, dict): + raise ValueError("Param transaction_object must be a Dictionary") + + response = self._post(uri=f"/v1/orders/{order_id}/refund", data=transaction_object, + request_options=request_options) + if response.get("status") != 201: + raise Exception(f"Failed to refund transaction: {response}") + return response + + def delete_transaction(self, order_id, transaction_id, request_options=None): + """[Click here for more info](https://www.mercadopago.com/developers/pt/reference/order/online-payments/delete-transaction/delete) # pylint: disable=line-too-long + Args: + order_id (str): The ID of the order to which the transaction belongs + transaction_id (str): The ID of the transaction to be deleted + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to the REST call. + Defaults to None. + Raises: + ValueError: Param transaction_id must be a string + Returns: + dict: Transaction deletion response + """ + + if not isinstance(transaction_id, str): + raise ValueError("Param transaction_id must be a string") + + response = self._delete(uri=f"/v1/orders/{order_id}/transactions/{transaction_id}", + request_options=request_options) + if response.get("status") != 204: + raise Exception(f"Failed to delete transaction: {response}") return response \ No newline at end of file From 518315c031d54b8fc8f14d78a998f35e1a121d77 Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Thu, 6 Feb 2025 14:57:12 -0300 Subject: [PATCH 18/20] update methods and tests --- mercadopago/resources/order.py | 42 +++--- tests/test_order.py | 253 +++++++++++++++++++++------------ 2 files changed, 179 insertions(+), 116 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index fd2a913..187b89a 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -161,23 +161,20 @@ def update_transaction(self, order_id, transaction_id, transaction_object, reque raise Exception(f"Failed to update transaction: {response}") return response - def refund_transaction(self, order_id, transaction_object, request_options=None): + def refund_transaction(self, order_id, transaction_object=None, request_options=None): """[Click here for more info](https://www.mercadopago.com/developers/pt/reference/order/online-payments/refund/post) # pylint: disable=line-too-long - Args: order_id (str): The ID of the order to which the transaction belongs - transaction_object (dict): Transaction details to be updated + transaction_object (dict, optional): Transaction details to be updated request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. - Raises: ValueError: Param transaction_object must be a Dictionary - Returns: dict: Transaction update response """ - if not isinstance(transaction_object, dict): + if transaction_object is not None and not isinstance(transaction_object, dict): raise ValueError("Param transaction_object must be a Dictionary") response = self._post(uri=f"/v1/orders/{order_id}/refund", data=transaction_object, @@ -187,24 +184,19 @@ def refund_transaction(self, order_id, transaction_object, request_options=None) return response def delete_transaction(self, order_id, transaction_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com/developers/pt/reference/order/online-payments/delete-transaction/delete) # pylint: disable=line-too-long - Args: - order_id (str): The ID of the order to which the transaction belongs - transaction_id (str): The ID of the transaction to be deleted - request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to the REST call. - Defaults to None. - Raises: - ValueError: Param transaction_id must be a string - Returns: - dict: Transaction deletion response - """ - - if not isinstance(transaction_id, str): - raise ValueError("Param transaction_id must be a string") + if not isinstance(order_id, str) or not isinstance(transaction_id, str): + raise ValueError("Params order_id and transaction_id must be strings") response = self._delete(uri=f"/v1/orders/{order_id}/transactions/{transaction_id}", request_options=request_options) - if response.get("status") != 204: - raise Exception(f"Failed to delete transaction: {response}") - return response \ No newline at end of file + + print(f"HTTP Status: {response.status_code}") + print(f"HTTP Response Text: {response.text}") # Log da resposta para depuração + + if response.status_code == 204: + return None # Retornar None para indicar sucesso sem conteúdo + + try: + return response.json() # Tentar retornar JSON se não for 204 + except ValueError: + raise Exception(f"Invalid JSON response: {response.text}") \ No newline at end of file diff --git a/tests/test_order.py b/tests/test_order.py index 11a4dd0..9c243fd 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -6,6 +6,8 @@ import time import unittest import random +from time import sleep + import mercadopago @@ -26,6 +28,116 @@ def create_test_card(self, status="APRO"): card_token_created = self.sdk.card_token().create(card_token_object) return card_token_created["response"]["id"] + def create_order_canceled_or_captured(self, card_token_id): + random_email_id = random.randint(100000, 999999) + order_object_cc = { + "type": "online", + "processing_mode": "automatic", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + }, + "capture_mode": "manual", + "transactions": { + "payments": [ + { + "amount": "200.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 1 + } + } + ] + } + } + order_created = self.sdk.order().create(order_object_cc) + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"]["id"] + + def create_order_builder_mode(self, card_token_id): + random_email_id = random.randint(100000, 999999) + order_object_cc = { + "type": "online", + "processing_mode": "manual", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + }, + } + order_created = self.sdk.order().create(order_object_cc) + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"]["id"] + + def create_order_oneshot_mode_complete(self, card_token_id): + random_email_id = random.randint(100000, 999999) + order_mode_oneshot_complete = { + "type": "online", + "processing_mode": "automatic", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "transactions": { + "payments": [ + { + "amount": "200.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 1 + } + } + ] + }, + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + } + } + + order_created = self.sdk.order().create(order_mode_oneshot_complete) + + + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"] + + def create_order_builder_mode_complete(self, card_token_id): + random_email_id = random.randint(100000, 999999) + order_mode_builder_complete = { + "type": "online", + "processing_mode": "manual", + "total_amount": "200.00", + "external_reference": "ext_ref_1234", + "transactions": { + "payments": [ + { + "amount": "200.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 12 + } + } + ] + }, + "payer": { + "email": f"test_payer_{random_email_id}@testuser.com" + } + } + + order_created = self.sdk.order().create(order_mode_builder_complete) + + + if order_created.get("status") != 201 or not order_created.get("response"): + self.fail(f"Failed to create order: {order_created}") + return order_created["response"] + def test_create_order_and_get_by_id(self): """ Test Function: Create an Order and Get an Order by ID @@ -93,37 +205,6 @@ def test_process_order(self): if process_response.get("status") != 200 or not process_response.get("response"): self.fail(f"Failed to create an order: {process_response}") self.assertEqual(process_response["status"], 200, "Status HTTP inválido ao processar o pedido") - print("Order processed successfully.") - - def create_order_canceled_or_captured(self, card_token_id): - random_email_id = random.randint(100000, 999999) - order_object_cc = { - "type": "online", - "processing_mode": "automatic", - "total_amount": "200.00", - "external_reference": "ext_ref_1234", - "payer": { - "email": f"test_payer_{random_email_id}@testuser.com" - }, - "capture_mode": "manual", - "transactions": { - "payments": [ - { - "amount": "200.00", - "payment_method": { - "id": "master", - "type": "credit_card", - "token": card_token_id, - "installments": 1 - } - } - ] - } - } - order_created = self.sdk.order().create(order_object_cc) - if order_created.get("status") != 201 or not order_created.get("response"): - self.fail(f"Failed to create order: {order_created}") - return order_created["response"]["id"] def test_cancel_order(self): card_token_id = self.create_test_card() @@ -140,32 +221,9 @@ def test_capture_order(self): self.assertEqual(order_captured["status"], 200) self.assertEqual(order_captured["response"]["status"], "processed") - def create_order_builder_mode(self, card_token_id): - random_email_id = random.randint(100000, 999999) - order_object_cc = { - "type": "online", - "processing_mode": "manual", - "total_amount": "200.00", - "external_reference": "ext_ref_1234", - "payer": { - "email": f"test_payer_{random_email_id}@testuser.com" - }, - } - print("Creating order in builder mode...") - order_created = self.sdk.order().create(order_object_cc) - print("Order creation response:", order_created) - - if order_created.get("status") != 201 or not order_created.get("response"): - self.fail(f"Failed to create order: {order_created}") - return order_created["response"]["id"] - def test_add_transaction(self): card_token_id = self.create_test_card() - print("Card token ID:", card_token_id) - order_id = self.create_order_builder_mode(card_token_id) - print("Order ID:", order_id) - transaction_object = { "payments": [ { @@ -180,51 +238,14 @@ def test_add_transaction(self): ] } - print("Adding transaction...") transaction_added = self.sdk.order().create_transaction(order_id, transaction_object) - print("Transaction addition response:", transaction_added) - self.assertEqual(transaction_added["status"], 201) - def create_order_builder_mode_complete(self, card_token_id): - random_email_id = random.randint(100000, 999999) - order_mode_builder_complete = { - "type": "online", - "processing_mode": "manual", - "total_amount": "200.00", - "external_reference": "ext_ref_1234", - "transactions": { - "payments": [ - { - "amount": "200.00", - "payment_method": { - "id": "master", - "type": "credit_card", - "token": card_token_id, - "installments": 12 - } - } - ] - }, - "payer": { - "email": f"test_payer_{random_email_id}@testuser.com" - } - } - - order_created = self.sdk.order().create(order_mode_builder_complete) - - - if order_created.get("status") != 201 or not order_created.get("response"): - self.fail(f"Failed to create order: {order_created}") - return order_created["response"] - def test_update_transaction(self): card_token_id = self.create_test_card() order_created = self.create_order_builder_mode_complete(card_token_id) order_id = order_created["id"] - print("orderID :", order_id) transaction_id = order_created["transactions"]["payments"][0]["id"] - print("transactionID :" ,transaction_id) transaction_update = { "payment_method": { @@ -236,6 +257,56 @@ def test_update_transaction(self): transaction_updated = self.sdk.order().update_transaction(order_id, transaction_id, transaction_update) self.assertEqual(transaction_updated["status"], 200) + def test_partial_refund_transaction(self): + card_token_id = self.create_test_card() + order_created = self.create_order_oneshot_mode_complete(card_token_id) + order_id = order_created["id"] + transaction_id = order_created["transactions"]["payments"][0]["id"] + + transaction_refund = { + "transactions": [ + { + "id": transaction_id, + "amount": "25.00" + } + ] + } + + sleep(3) + + transaction_refunded = self.sdk.order().refund_transaction(order_id, transaction_refund) + print("Refund Transaction Response:", transaction_refunded) + self.assertIn(transaction_refunded["status"], [ 201], + f"Unexpected status code for refund: {transaction_refunded['status']}. Response: {transaction_refunded}") + + def test_refund_transaction(self): + card_token_id = self.create_test_card() + order_created = self.create_order_oneshot_mode_complete(card_token_id) + order_id = order_created["id"] + sleep(3) + transaction_refunded = self.sdk.order().refund_transaction(order_id) + print("Refund Transaction Response:", transaction_refunded) + self.assertIn(transaction_refunded["status"], [ 201], + f"Unexpected status code for refund: {transaction_refunded['status']}. Response: {transaction_refunded}") + + def test_delete_transaction(self): + print( "TESTE DO DELETE TRANSACTION") + card_token_id = self.create_test_card() + order_created = self.create_order_builder_mode_complete(card_token_id) + order_id = order_created["id"] + print("Order ID:", order_id) + + transaction_id = order_created["transactions"]["payments"][0]["id"] + print("Transaction ID:", transaction_id) + sleep(3) + + try: + transaction_deleted = self.sdk.order().delete_transaction(order_id, transaction_id) + print("Transaction delete response:", transaction_deleted) # Log do retorno + self.assertIsNone(transaction_deleted, "Expected no response body, method might have failed.") + except Exception as e: + print(f"Error occurred during transaction deletion: {str(e)}") + self.fail(f"Transaction deletion failed: {str(e)}") if __name__ == "__main__": unittest.main() \ No newline at end of file From 795e2626135ddb430f6895b27d7004961e37c9cb Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Thu, 6 Feb 2025 16:07:44 -0300 Subject: [PATCH 19/20] update delete --- mercadopago/http/http_client.py | 14 +++++++++----- mercadopago/resources/order.py | 13 +++---------- tests/test_order.py | 15 ++++----------- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/mercadopago/http/http_client.py b/mercadopago/http/http_client.py index 81d7040..6fe628f 100644 --- a/mercadopago/http/http_client.py +++ b/mercadopago/http/http_client.py @@ -24,12 +24,16 @@ def request(self, method, url, maxretries=None, **kwargs): http.mount("https://", HTTPAdapter(max_retries=retry_strategy)) with http as session: api_result = session.request(method, url, **kwargs) - response = { - "status": api_result.status_code, - "response": api_result.json() - } + response = {"status": api_result.status_code, "response": None} - return response + if api_result.status_code != 204 and api_result.content: + try: + response["response"] = api_result.json() + except ValueError as e: + print(f"Failed to parse JSON: {str(e)}") + response["response"] = None + + return response def get(self, url, headers, params=None, timeout=None, maxretries=None): # pylint: disable=too-many-arguments """Makes a GET request to the API""" diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index 187b89a..fcde0fa 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -190,13 +190,6 @@ def delete_transaction(self, order_id, transaction_id, request_options=None): response = self._delete(uri=f"/v1/orders/{order_id}/transactions/{transaction_id}", request_options=request_options) - print(f"HTTP Status: {response.status_code}") - print(f"HTTP Response Text: {response.text}") # Log da resposta para depuração - - if response.status_code == 204: - return None # Retornar None para indicar sucesso sem conteúdo - - try: - return response.json() # Tentar retornar JSON se não for 204 - except ValueError: - raise Exception(f"Invalid JSON response: {response.text}") \ No newline at end of file + if response.get("status") != 204: + raise Exception(f"Failed to delete transaction: {response}") + return response \ No newline at end of file diff --git a/tests/test_order.py b/tests/test_order.py index 9c243fd..e7ca485 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -290,23 +290,16 @@ def test_refund_transaction(self): f"Unexpected status code for refund: {transaction_refunded['status']}. Response: {transaction_refunded}") def test_delete_transaction(self): - print( "TESTE DO DELETE TRANSACTION") card_token_id = self.create_test_card() order_created = self.create_order_builder_mode_complete(card_token_id) order_id = order_created["id"] - print("Order ID:", order_id) - transaction_id = order_created["transactions"]["payments"][0]["id"] - print("Transaction ID:", transaction_id) sleep(3) - try: - transaction_deleted = self.sdk.order().delete_transaction(order_id, transaction_id) - print("Transaction delete response:", transaction_deleted) # Log do retorno - self.assertIsNone(transaction_deleted, "Expected no response body, method might have failed.") - except Exception as e: - print(f"Error occurred during transaction deletion: {str(e)}") - self.fail(f"Transaction deletion failed: {str(e)}") + transaction_deleted = self.sdk.order().delete_transaction(order_id, transaction_id) + print("Transaction Deleted:", transaction_deleted) + self.assertEqual(transaction_deleted["status"], 204) + if __name__ == "__main__": unittest.main() \ No newline at end of file From a57005f25fbcdb8525347915e4dca06b189fb87c Mon Sep 17 00:00:00 2001 From: Danielen Cestari Nunes Date: Thu, 6 Feb 2025 17:42:16 -0300 Subject: [PATCH 20/20] fixes --- mercadopago/resources/order.py | 50 +++++++++++++++++++++------------- tests/test_order.py | 2 +- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index fcde0fa..4b48206 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -19,7 +19,7 @@ def create(self, order_object, request_options=None): Args: order_object (dict): Order to be created request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: @@ -34,19 +34,19 @@ def create(self, order_object, request_options=None): return self._post(uri="/v1/orders", data=order_object, request_options=request_options) def get(self, order_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/online-payments/get-order/get ) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/get-order/get ) # pylint: disable=line-too-long Args: order_id (str): The Order ID request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: ValueError: Param order_id must be a string Returns: - dict: Order ID returned in the response to the request made for its creation. + dict: Order returned in the response to the request made for its creation. """ if not isinstance(order_id, str): @@ -55,17 +55,17 @@ def get(self, order_id, request_options=None): return self._get(uri="/v1/orders/" + str(order_id), request_options=request_options) def process(self, order_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online/process-order/post # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online/process-order/post) # pylint: disable=line-too-long Args: order_id (str): ID of the order to be processed. This value is returned in the response to the Create order request. request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: ValueError: Param order_id must be a string Returns: - dict: Order ID returned in the response to the request made for its creation. + dict: Order returned in the response to the request made for its creation. """ if not isinstance(order_id, str): @@ -74,11 +74,11 @@ def process(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/process", request_options=request_options) def cancel(self, order_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/en/reference/order/in-person-payments/point/cancel-order/post) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/in-person-payments/point/cancel-order/post) # pylint: disable=line-too-long Args: order_id (str): Order ID request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: @@ -93,16 +93,16 @@ def cancel(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/cancel", request_options=request_options) def capture(self, order_id, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/capture/post) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/capture/post) # pylint: disable=line-too-long Args: order_id (str): ID of the order to be captured. This value is returned in the response to the Create order request. request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: ValueError: Param order_id must be a string Returns: - dict: Order ID returned in the response to the request made for its creation. + dict: Order returned in the response to the request made for its creation. """ if not isinstance(order_id, str): @@ -111,20 +111,20 @@ def capture(self, order_id, request_options=None): return self._post(uri="/v1/orders/" + str(order_id) + "/capture", request_options=request_options) def create_transaction(self, order_id, transaction_object, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/add-transaction/post) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/add-transaction/post) # pylint: disable=line-too-long Args: order_id (str): The ID of the order to which the transaction will be added transaction_object (dict): Transaction to be added request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: ValueError: Param transaction_object must be a Dictionary Returns: - dict: Transaction addition response + dict: Transaction created response """ if not isinstance(transaction_object, dict): raise ValueError("Param transaction_object must be a Dictionary") @@ -136,14 +136,14 @@ def create_transaction(self, order_id, transaction_object, request_options=None) return response def update_transaction(self, order_id, transaction_id, transaction_object, request_options=None): - """[Click here for more info](https://www.mercadopago.com.br/developers/pt/reference/order/online-payments/update-transaction/put) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/update-transaction/put) # pylint: disable=line-too-long Args: order_id (str): The ID of the order to which the transaction belongs transaction_id (str): The ID of the transaction to be updated transaction_object (dict): Transaction details to be updated request_options (mercadopago.config.request_options, optional): An instance of - RequestOptions can be pass changing or adding custom options to ur REST call. + RequestOptions can be pass changing or adding custom options to the REST call. Defaults to None. Raises: @@ -162,7 +162,7 @@ def update_transaction(self, order_id, transaction_id, transaction_object, reque return response def refund_transaction(self, order_id, transaction_object=None, request_options=None): - """[Click here for more info](https://www.mercadopago.com/developers/pt/reference/order/online-payments/refund/post) # pylint: disable=line-too-long + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/refund/post) # pylint: disable=line-too-long Args: order_id (str): The ID of the order to which the transaction belongs transaction_object (dict, optional): Transaction details to be updated @@ -172,7 +172,7 @@ def refund_transaction(self, order_id, transaction_object=None, request_options= Raises: ValueError: Param transaction_object must be a Dictionary Returns: - dict: Transaction update response + dict: Order refunded response """ if transaction_object is not None and not isinstance(transaction_object, dict): raise ValueError("Param transaction_object must be a Dictionary") @@ -184,6 +184,18 @@ def refund_transaction(self, order_id, transaction_object=None, request_options= return response def delete_transaction(self, order_id, transaction_id, request_options=None): + """[Click here for more info](https://www.mercadopago.com/developers/en/reference/order/online-payments/delete-transaction/delete) # pylint: disable=line-too-long + Args: + order_id (str): The ID of the order to which the transaction belongs + transaction_id (str): The ID of the transaction to be deleted + request_options (mercadopago.config.request_options, optional): An instance of + RequestOptions can be pass changing or adding custom options to the REST call. + Defaults to None. + Raises: + ValueError: Params order_id and transaction_id must be strings + Returns: + Status 204 - No Content - if deleted successfully + """ if not isinstance(order_id, str) or not isinstance(transaction_id, str): raise ValueError("Params order_id and transaction_id must be strings") diff --git a/tests/test_order.py b/tests/test_order.py index e7ca485..fef50fd 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -204,7 +204,7 @@ def test_process_order(self): process_response = self.sdk.order().process(order_id) if process_response.get("status") != 200 or not process_response.get("response"): self.fail(f"Failed to create an order: {process_response}") - self.assertEqual(process_response["status"], 200, "Status HTTP inválido ao processar o pedido") + self.assertEqual(process_response["status"], 200, "Invalid HTTP status when processing the order") def test_cancel_order(self): card_token_id = self.create_test_card()