From 6eea0cd294737bda27fde0d0dd718f5dd7baa410 Mon Sep 17 00:00:00 2001 From: Mario Hernandez Date: Sat, 14 Dec 2024 16:06:03 -0300 Subject: [PATCH] tests&coverage flow --- django_payments_chile/FlowProvider.py | 38 +++++------ tests/test_flowprovider.py | 94 +++++++++++++++++++++++---- 2 files changed, 102 insertions(+), 30 deletions(-) diff --git a/django_payments_chile/FlowProvider.py b/django_payments_chile/FlowProvider.py index d942e39..2ad6df1 100644 --- a/django_payments_chile/FlowProvider.py +++ b/django_payments_chile/FlowProvider.py @@ -1,10 +1,9 @@ -from dataclasses import asdict from typing import Any, Optional import requests from django.http import HttpResponseBadRequest, JsonResponse from payments import PaymentError, PaymentStatus, RedirectNeeded -from payments.core import BasicProvider, get_base_url +from payments.core import BasicProvider from payments.forms import PaymentForm as BasePaymentForm from .clientes import ClienteAPI @@ -88,7 +87,7 @@ def get_form(self, payment, data: Optional[dict] = None) -> Any: datos_para_flow = dict(sorted(datos_para_flow.items())) firma_datos = ClienteAPI.genera_firma(datos_para_flow, self.api_secret) datos_para_flow.update({"s": firma_datos}) - print(f"{datos_para_flow = }") + try: pago_req = requests.post(f"{self.api_endpoint}/payment/create", data=datos_para_flow, timeout=5) pago_req.raise_for_status() @@ -142,7 +141,6 @@ def actualiza_estado(self, payment) -> dict: datos_para_flow = dict(sorted(datos_para_flow.items())) firma_datos = ClienteAPI.genera_firma(datos_para_flow, self.api_secret) datos_para_flow.update({"s": firma_datos}) - print(f"{datos_para_flow = }") try: # status = FlowPayment.getStatus(self._client, payment.transaction_id) @@ -153,13 +151,13 @@ def actualiza_estado(self, payment) -> dict: raise e else: status = estado_req.json() - if status.status == 2: + if status["status"] == 2: payment.change_status(PaymentStatus.CONFIRMED) - elif status.status == 3: + elif status["status"] == 3: payment.change_status(PaymentStatus.REJECTED) - elif status.status == 4: + elif status["status"] == 4: payment.change_status(PaymentStatus.ERROR) - return asdict(status) + return status def _extra_data(self, attrs) -> dict: """Busca los datos que son enviandos por django-payments y los saca del diccionario @@ -210,21 +208,23 @@ def refund(self, payment, amount: Optional[int] = None) -> int: raise PaymentError("El pago debe estar confirmado para reversarse.") to_refund = amount or payment.total + + datos_reembolso = { + "apiKey": self.api_key, + "refundCommerceOrder": payment.token, + "receiverEmail": payment.billing_email, + "amount": to_refund, + "urlCallBack": payment.get_process_url(), + "commerceTrxId": payment.token, + "flowTrxId": payment.attrs.respuesta_flow["flowOrder"], + } try: - datos_reembolso = { - "apiKey": self.api_key, - "refundCommerceOrder": payment.token, - "receiverEmail": payment.billing_email, - "amount": to_refund, - "urlCallBack": f"{get_base_url()}{payment.get_process_url()}", - "commerceTrxId": payment.token, - "flowTrxId": payment.attrs.respuesta_flow["flowOrder"], - } - refund = datos_reembolso # FlowRefund.create(self._client, datos_reembolso) + refun_req = requests.post(f"{self.api_endpoint}/refund/create", data=datos_reembolso, timeout=5) + refun_req.raise_for_status() except Exception as pe: raise PaymentError(pe) else: - payment.attrs.solicitud_reembolso = refund + payment.attrs.solicitud_reembolso = refun_req.json() payment.save() payment.change_status(PaymentStatus.REFUNDED) return to_refund diff --git a/tests/test_flowprovider.py b/tests/test_flowprovider.py index ce2651a..69ed1fa 100644 --- a/tests/test_flowprovider.py +++ b/tests/test_flowprovider.py @@ -46,7 +46,7 @@ def get_success_url(self): return "http://mi-app.cl/exito" -class TestFlowProviderLive(TestCase): +class TestFlowProvider(TestCase): def test_provider_create_session_success(self): test_payment = Payment() test_payment.attrs.datos_extra = {"payment_currency": "CLP", "currency": "CLP"} @@ -103,22 +103,94 @@ def test_provider_transaction_id_set(self): self.assertEqual(payment.transaction_id, "TOKEN_ID") + def test_provider_sandbox(self): + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET, api_endpoint="sandbox") -class TestFlowProviderSandbox(TestCase): - def test_provider_create_session_success(self): + self.assertEqual(provider.api_endpoint, "https://sandbox.flow.cl/api") + + def test_provider_refund_error(self): payment = Payment() - provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET, api_endpoint="sandbox") + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET) + with self.assertRaises(PaymentError): + provider.refund(payment) + + def test_provider_full_refund(self): + payment = Payment(status=PaymentStatus.CONFIRMED) + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET) + with patch("django_payments_chile.FlowProvider.requests.post") as mock_post_refund: + # Configure mock response + mock_response_refund = Mock() + mock_response_refund.raise_for_status.return_value = None # Simulates no exception raised + mock_response_refund.json.return_value = { + "token": "C93B4FAD6D63ED9A3F25D21E5D6DD0105FA8CAAQ", + "flowRefundOrder": "122767", + "date": "2017-07-21 12:33:15", + "status": "created", + "amount": "12000.00", + "fee": "240.00", + } + mock_post_refund.return_value = mock_response_refund + + refund = provider.refund(payment) + # print(f"{refund = }") + self.assertEqual(refund, payment.total) + + def test_provider_full_refund_error(self): + payment = Payment(status=PaymentStatus.CONFIRMED) + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET) with patch("django_payments_chile.FlowProvider.requests.post") as mock_post: # Configure mock response mock_response = Mock() - mock_response.raise_for_status.return_value = None # Simulates no exception raised - mock_response.json.return_value = {"url": "https://flow.cl", "token": "TOKEN_ID", "flowOrder": "ORDER_ID"} + mock_response.raise_for_status.side_effect = requests.exceptions.RequestException("Error occurred") mock_post.return_value = mock_response - with self.assertRaises(RedirectNeeded): + with self.assertRaises(PaymentError): provider.get_form(payment) - self.assertEqual(payment.status, PaymentStatus.WAITING) - self.assertEqual(payment.attrs.respuesta_flow["url"], "https://flow.cl") - self.assertEqual(payment.attrs.respuesta_flow["token"], "TOKEN_ID") - self.assertEqual(payment.attrs.respuesta_flow["flowOrder"], "ORDER_ID") + def test_provider_update_status_confirmed(self): + test_payment = Payment() + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET) + with patch("django_payments_chile.FlowProvider.requests.get") as mock_status: + # Configure mock response + mock_response = Mock() + mock_response.raise_for_status.return_value = None # Simulates no exception raised + mock_response.json.return_value = { + "status": 2, + } + mock_status.return_value = mock_response + + provider.actualiza_estado(test_payment) + + self.assertEqual(test_payment.status, PaymentStatus.CONFIRMED) + + def test_provider_update_status_rejected(self): + test_payment = Payment() + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET) + with patch("django_payments_chile.FlowProvider.requests.get") as mock_status: + # Configure mock response + mock_response = Mock() + mock_response.raise_for_status.return_value = None # Simulates no exception raised + mock_response.json.return_value = { + "status": 3, + } + mock_status.return_value = mock_response + + provider.actualiza_estado(test_payment) + + self.assertEqual(test_payment.status, PaymentStatus.REJECTED) + + def test_provider_update_status_error(self): + test_payment = Payment() + provider = FlowProvider(api_key=API_KEY, api_secret=API_SECRET) + with patch("django_payments_chile.FlowProvider.requests.get") as mock_status: + # Configure mock response + mock_response = Mock() + mock_response.raise_for_status.return_value = None # Simulates no exception raised + mock_response.json.return_value = { + "status": 4, + } + mock_status.return_value = mock_response + + provider.actualiza_estado(test_payment) + + self.assertEqual(test_payment.status, PaymentStatus.ERROR)