Skip to content

Commit

Permalink
tests&coverage flow
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofix committed Dec 14, 2024
1 parent 65bee2b commit 6eea0cd
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 30 deletions.
38 changes: 19 additions & 19 deletions django_payments_chile/FlowProvider.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
94 changes: 83 additions & 11 deletions tests/test_flowprovider.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"}
Expand Down Expand Up @@ -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)

0 comments on commit 6eea0cd

Please sign in to comment.