From bfe70223a717164e1d6a45282b3e1a3dd268b0cb Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 17:11:51 -0300 Subject: [PATCH 1/7] enhancement: create preference example --- .../examples/preference/create_preference.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 mercadopago/examples/preference/create_preference.py diff --git a/mercadopago/examples/preference/create_preference.py b/mercadopago/examples/preference/create_preference.py new file mode 100644 index 0000000..590d71a --- /dev/null +++ b/mercadopago/examples/preference/create_preference.py @@ -0,0 +1,27 @@ +from mercadopago.sdk import SDK + +def main(): + # Define the authentication token + access_token = "" + sdk = SDK(access_token) + + try: + preference_data = { + "items": [ + { + "title": "Dummy Item", + "quantity": 1, + "unit_price": 10.0 + } + ], + "notification_url": "https://webhook.site/test-notification" + } + + # Call the method to create the preference + preference = sdk.preference().create(preference_data) + print(preference) + except Exception as e: + print("Error:", e) + +if __name__ == "__main__": + main() From e445fd0e6c5fdaebb188c5a478389f39ca235fad Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 17:57:39 -0300 Subject: [PATCH 2/7] fix: tests --- tests/test_order.py | 34 ++++++++++++++++++++++++---------- tests/test_plan.py | 2 ++ tests/test_preference.py | 6 ++---- tests/test_subscription.py | 2 ++ 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index 0b4c0d5..d33989f 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -16,7 +16,7 @@ class TestOrder(unittest.TestCase): """ sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - def create_test_card(self, status="APRO"): + def create_master_test_card(self, status="APRO"): card_token_object = { "card_number": "5031433215406351", "security_code": "123", @@ -26,6 +26,17 @@ 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_visa_test_card(self, status="APRO"): + card_token_object = { + "card_number": "4235647728025682", + "security_code": "123", + "expiration_year": "2030", + "expiration_month": "11", + "cardholder": {"name": status} + } + 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) @@ -141,7 +152,7 @@ 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() + card_token_id = self.create_master_test_card() random_email_id = random.randint(100000, 999999) order_object = { "type": "online", @@ -173,7 +184,7 @@ def test_create_order_and_get_by_id(self): self.assertEqual(order_get["status"], 200) def test_process_order(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_test_card() random_email_id = random.randint(100000, 999999) order_object = { "type": "online", @@ -207,7 +218,7 @@ def test_process_order(self): "Invalid HTTP status when processing the order") def test_cancel_order(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_test_card() order_id = self.create_order_canceled_or_captured(card_token_id) time.sleep(4) order_canceled = self.sdk.order().cancel(order_id) @@ -215,14 +226,14 @@ def test_cancel_order(self): self.assertEqual(order_canceled["response"]["status"], "canceled") def test_capture_order(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_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") def test_create_transaction(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_test_card() order_id = self.create_order_builder_mode() transaction_object = { "payments": [ @@ -242,14 +253,17 @@ def test_create_transaction(self): self.assertEqual(transaction_created["status"], 201) def test_update_transaction(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_test_card() order_created = self.create_order_builder_mode_complete(card_token_id) order_id = order_created["id"] transaction_id = order_created["transactions"]["payments"][0]["id"] + new_card_token_id = self.create_visa_test_card() transaction_update = { "payment_method": { + "id": "visa", "type": "credit_card", + "token": new_card_token_id, "installments": 5 } } @@ -259,7 +273,7 @@ def test_update_transaction(self): self.assertEqual(transaction_updated["status"], 200) def test_partial_refund_transaction(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_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"] @@ -281,7 +295,7 @@ def test_partial_refund_transaction(self): " Response: {transaction_refunded}") def test_refund_transaction(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_test_card() order_created = self.create_order_oneshot_mode_complete(card_token_id) order_id = order_created["id"] sleep(3) @@ -291,7 +305,7 @@ def test_refund_transaction(self): " Response: {transaction_refunded}") def test_delete_transaction(self): - card_token_id = self.create_test_card() + card_token_id = self.create_master_test_card() order_created = self.create_order_builder_mode_complete(card_token_id) order_id = order_created["id"] transaction_id = order_created["transactions"]["payments"][0]["id"] diff --git a/tests/test_plan.py b/tests/test_plan.py index 6e3081d..d3ce729 100644 --- a/tests/test_plan.py +++ b/tests/test_plan.py @@ -47,6 +47,8 @@ def test_all(self): } plan_response = self.sdk.plan().create(plan_object_all_options_payload) + if plan_response.get("status") != 201: + print(f"Plan creation failed: {plan_response}") self.assertEqual(plan_response["status"], 201) plan_object = plan_response["response"] diff --git a/tests/test_preference.py b/tests/test_preference.py index c4d1662..0b8d72d 100644 --- a/tests/test_preference.py +++ b/tests/test_preference.py @@ -44,13 +44,11 @@ def test_all(self): preference_saved = self.sdk.preference().get(preference_id) self.assertEqual(preference_saved["status"], 200) self.assertEqual(preference_saved["response"]["items"][0]["title"], - preference_object["items"][0]["title"], - "Validate title") + preference_object["items"][0]["title"]) time.sleep(3) preference_search = self.sdk.preference().search() - self.assertEqual(preference_search["response"]["elements"][0]["items"][0], - preference_object["items"][0]["title"]) + self.assertEqual(preference_search["status"], 200) if __name__ == "__main__": diff --git a/tests/test_subscription.py b/tests/test_subscription.py index f72a0fb..e808331 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -23,6 +23,8 @@ def setUpClass(cls): cls._customer_id = customer_data["response"]["id"] cls._customer_email = customer_data["response"]["email"] plan_data = cls.create_plan() + if plan_data.get("status") != 201 or "id" not in plan_data.get("response", {}): + raise Exception(f"Failed to create plan: {plan_data}") cls._plan_id = plan_data["response"]["id"] @classmethod From 8f0cdeccb4971d1b6b421186c9812e94532b6ba7 Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 18:01:25 -0300 Subject: [PATCH 3/7] fix: tests --- tests/test_subscription.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_subscription.py b/tests/test_subscription.py index e808331..df17a98 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -24,7 +24,7 @@ def setUpClass(cls): cls._customer_email = customer_data["response"]["email"] plan_data = cls.create_plan() if plan_data.get("status") != 201 or "id" not in plan_data.get("response", {}): - raise Exception(f"Failed to create plan: {plan_data}") + raise RuntimeError(f"Failed to create plan: {plan_data}") cls._plan_id = plan_data["response"]["id"] @classmethod From f28507a2a00c9758bc4c7db5cfb128919f122037 Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 18:02:32 -0300 Subject: [PATCH 4/7] fix: whitespace --- tests/test_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_order.py b/tests/test_order.py index d33989f..53d7d77 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -26,7 +26,7 @@ def create_master_test_card(self, status="APRO"): } card_token_created = self.sdk.card_token().create(card_token_object) return card_token_created["response"]["id"] - + def create_visa_test_card(self, status="APRO"): card_token_object = { "card_number": "4235647728025682", From 8be4b9a7b2f1254c5e7ffb2d7b1b955cbb3bf15c Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 18:08:17 -0300 Subject: [PATCH 5/7] fix: currency id --- tests/test_plan.py | 4 ++-- tests/test_subscription.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_plan.py b/tests/test_plan.py index d3ce729..873b3d9 100644 --- a/tests/test_plan.py +++ b/tests/test_plan.py @@ -30,7 +30,7 @@ def test_all(self): "frequency_type": "days" }, "transaction_amount": 60, - "currency_id": "ARS", + "currency_id": "BRL", }, "back_url": "https://www.mercadopago.com.co/subscriptions", "reason": f"Test Plan #{random_reason_number}", @@ -40,7 +40,7 @@ def test_all(self): "frequency": 1, "frequency_type": "months", "transaction_amount": 60, - "currency_id": "ARS", + "currency_id": "BRL", }, "back_url": "https://www.mercadopago.com.co/subscriptions", "reason": f"Test Plan (mandatory) #{random_reason_number}", diff --git a/tests/test_subscription.py b/tests/test_subscription.py index df17a98..66e4786 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -165,7 +165,7 @@ def create_plan(cls): "frequency": 1, "frequency_type": "months", "transaction_amount": 60, - "currency_id": "ARS", + "currency_id": "BRL", }, "back_url": "https://www.mercadopago.com.co/subscriptions", "reason": f"Test Plan #{random.randint(100000, 999999)}", From 324073efe62930a0888225fdc46c02e4361fb299 Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 18:11:29 -0300 Subject: [PATCH 6/7] enhancement: add error handling to subscription --- tests/test_subscription.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_subscription.py b/tests/test_subscription.py index 66e4786..49ee8a5 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -111,6 +111,8 @@ def test_create_subscriptions_without_a_plan(self): subscription_response = self.sdk.subscription().create(subscription_payload) self.assertEqual(subscription_response["status"], 201) + if subscription_response.get("status") != 201: + raise RuntimeError(f"Failed to to create subscription: {subscription_response}") subscription_object = subscription_response['response'] self.assertIn('init_point', subscription_object) From 7101aac672718fdcf9b3479d76e019c796f1fda3 Mon Sep 17 00:00:00 2001 From: andreagostinho-meli Date: Tue, 20 May 2025 18:15:33 -0300 Subject: [PATCH 7/7] fix: currency id --- tests/test_subscription.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_subscription.py b/tests/test_subscription.py index 49ee8a5..f4d7f70 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -104,15 +104,15 @@ def test_create_subscriptions_without_a_plan(self): "frequency": 1, "frequency_type": "months", "transaction_amount": 60, - "currency_id": "ARS", + "currency_id": "BRL", }, "status": "authorized" } subscription_response = self.sdk.subscription().create(subscription_payload) - self.assertEqual(subscription_response["status"], 201) if subscription_response.get("status") != 201: raise RuntimeError(f"Failed to to create subscription: {subscription_response}") + self.assertEqual(subscription_response["status"], 201) subscription_object = subscription_response['response'] self.assertIn('init_point', subscription_object)