Skip to content

Commit eb32e2d

Browse files
committed
Ruff
1 parent c570904 commit eb32e2d

File tree

9 files changed

+163
-89
lines changed

9 files changed

+163
-89
lines changed

santander_sdk/api_client/client.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,6 @@ def _request(
104104
error_content = try_parse_response_to_json(e.response)
105105
status_description = get_status_code_description(status_code)
106106

107-
raise SantanderRequestError(
108-
status_description, status_code, error_content
109-
)
107+
raise SantanderRequestError(status_description, status_code, error_content)
110108
except Exception as e:
111109
raise SantanderRequestError(f"Erro na requisição: {e}", 0, None) from e

santander_sdk/api_client/exceptions.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ def __init__(self, message: str, status_code: int, content: dict | None = None):
1717

1818
def __str__(self):
1919
error_content = self.content or "No response details"
20-
return f"Request failed: {super().__str__()} - {self.status_code} {error_content}"
20+
return (
21+
f"Request failed: {super().__str__()} - {self.status_code} {error_content}"
22+
)
2123

2224

2325
class SantanderClientError(SantanderError):
@@ -27,6 +29,7 @@ def __init__(self, message):
2729
def __str__(self):
2830
return f"Santander client error: {super().__str__()}"
2931

32+
3033
class SantanderValueError(SantanderError, ValueError):
3134
def __init__(self, message):
3235
super().__init__(message)
@@ -50,4 +53,3 @@ def __init__(self, message, step: Literal["CREATE", "CONFIRM"]):
5053

5154
def __str__(self):
5255
return f"Status update timeout after several attempts: {super().__str__()}"
53-

santander_sdk/pix.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
logger = logging.getLogger("santanderLogger")
2323
PIX_ENDPOINT = "/management_payments_partners/v1/workspaces/:workspaceid/pix_payments"
2424

25+
2526
def transfer_pix(
2627
client: SantanderApiClient,
2728
pix_key: str | SantanderBeneficiary,
@@ -32,9 +33,9 @@ def transfer_pix(
3233
try:
3334
if value is None or value <= 0:
3435
raise SantanderValueError(f"Invalid value for PIX transfer: {value}")
35-
36+
3637
transfer_flow = SantanderPaymentFlow(client, logger, PIX_ENDPOINT)
37-
38+
3839
create_pix_dict = _generate_create_pix_dict(pix_key, value, description, tags)
3940
create_pix_response = transfer_flow.create_payment(create_pix_dict)
4041
if not create_pix_response.get("id"):
@@ -47,7 +48,9 @@ def transfer_pix(
4748
"status": "AUTHORIZED",
4849
"paymentValue": truncate_value(value),
4950
}
50-
confirm_response = transfer_flow.confirm_payment(payment_data, create_pix_response.get('id'))
51+
confirm_response = transfer_flow.confirm_payment(
52+
payment_data, create_pix_response.get("id")
53+
)
5154
return {"success": True, "data": confirm_response, "error": ""}
5255
except Exception as e:
5356
error_message = str(e)
@@ -79,7 +82,7 @@ def _generate_create_pix_dict(
7982
pix_type = get_pix_key_type(pix_key)
8083
data.update({"dictCode": pix_key, "dictCodeType": pix_type})
8184
return data
82-
85+
8386
if isinstance(pix_key, dict):
8487
beneficiary = cast(dict, pix_key.copy())
8588
if beneficiary.get("bankCode") is None and beneficiary.get("ispb") is None:
@@ -89,4 +92,4 @@ def _generate_create_pix_dict(
8992
data.update({"beneficiary": beneficiary})
9093
else:
9194
raise SantanderValueError("PIX key or Beneficiary not provided")
92-
return data
95+
return data

santander_sdk/transfer_flow.py

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
SantanderStatusTimeoutError,
1111
)
1212

13-
from santander_sdk.api_client.helpers import (retry_one_time_on_request_exception,)
13+
from santander_sdk.api_client.helpers import (
14+
retry_one_time_on_request_exception,
15+
)
1416
from santander_sdk.types import (
1517
ConfirmOrderStatus,
1618
CreateOrderStatus,
@@ -27,29 +29,34 @@
2729
class SantanderPaymentFlow:
2830
current_step: Literal["CREATE", "CONFIRM"] = "CREATE"
2931

30-
def __init__(self, client: SantanderApiClient, logger: logging.Logger, endpoint: str):
32+
def __init__(
33+
self, client: SantanderApiClient, logger: logging.Logger, endpoint: str
34+
):
3135
self.client = client
3236
self.logger = logger or logging.getLogger(__name__)
3337
self.endpoint = endpoint
3438

35-
3639
def create_payment(self, data: dict) -> SantanderPixResponse:
37-
response = cast(SantanderPixResponse, self.client.post(self.endpoint, data=data))
40+
response = cast(
41+
SantanderPixResponse, self.client.post(self.endpoint, data=data)
42+
)
3843
self._check_for_rejected_error(response)
3944
self.logger.info("Payment created: ", response.get("id"))
4045
return response
41-
46+
4247
def ensure_ready_to_pay(self, confirm_data) -> None:
43-
payment_status = confirm_data.get('status')
48+
payment_status = confirm_data.get("status")
4449
if payment_status != CreateOrderStatus.READY_TO_PAY:
4550
self.logger.info("PIX is not ready for payment", payment_status)
4651
self._payment_status_polling(
47-
payment_id=confirm_data.get('id'),
48-
until_status=[CreateOrderStatus.READY_TO_PAY],
49-
max_update_attemps=MAX_UPDATE_STATUS_BEFORE_CONFIRM
52+
payment_id=confirm_data.get("id"),
53+
until_status=[CreateOrderStatus.READY_TO_PAY],
54+
max_update_attemps=MAX_UPDATE_STATUS_BEFORE_CONFIRM,
5055
)
5156

52-
def confirm_payment(self, confirm_data: dict, payment_id: str) -> SantanderPixResponse:
57+
def confirm_payment(
58+
self, confirm_data: dict, payment_id: str
59+
) -> SantanderPixResponse:
5360
try:
5461
confirm_response = self._request_confirm_payment(confirm_data, payment_id)
5562
except SantanderRequestError as e:
@@ -58,23 +65,25 @@ def confirm_payment(self, confirm_data: dict, payment_id: str) -> SantanderPixRe
5865

5966
if not confirm_response.get("status") == ConfirmOrderStatus.PAYED:
6067
try:
61-
confirm_response = self._resolve_lazy_status_payed(payment_id, confirm_response.get("status"))
68+
confirm_response = self._resolve_lazy_status_payed(
69+
payment_id, confirm_response.get("status")
70+
)
6271
except SantanderStatusTimeoutError as e:
6372
self.logger.info("Timeout occurred while updating status:", str(e))
6473
return confirm_response
6574

66-
6775
@retry_one_time_on_request_exception
68-
def _request_payment_status(self, payment_id: str) -> SantanderPixResponse:
76+
def _request_payment_status(self, payment_id: str) -> SantanderPixResponse:
6977
if not payment_id:
7078
raise ValueError("payment_id not provided")
7179
response = self.client.get(f"{self.endpoint}/{payment_id}")
7280
response = cast(SantanderPixResponse, response)
7381
self._check_for_rejected_error(response)
7482
return response
7583

76-
77-
def _request_confirm_payment(self, confirm_data: dict, payment_id: str) -> SantanderPixResponse:
84+
def _request_confirm_payment(
85+
self, confirm_data: dict, payment_id: str
86+
) -> SantanderPixResponse:
7887
self.current_step = "CONFIRM"
7988
if not payment_id:
8089
raise ValueError("payment_id not provided")
@@ -83,33 +92,44 @@ def _request_confirm_payment(self, confirm_data: dict, payment_id: str) -> Santa
8392
self._check_for_rejected_error(response)
8493
return response
8594

86-
8795
def _check_for_rejected_error(self, payment_response: SantanderPixResponse):
8896
if not payment_response.get("status") == OrderStatus.REJECTED:
89-
return
90-
reject_reason = payment_response.get("rejectReason", "Reason not returned by Santander")
91-
raise SantanderRejectedError(f"Payment rejected by the bank at step {self.current_step} - {reject_reason}")
92-
97+
return
98+
reject_reason = payment_response.get(
99+
"rejectReason", "Reason not returned by Santander"
100+
)
101+
raise SantanderRejectedError(
102+
f"Payment rejected by the bank at step {self.current_step} - {reject_reason}"
103+
)
93104

94-
def _resolve_lazy_status_payed(self, payment_id: str, current_status: OrderStatusType) -> None:
105+
def _resolve_lazy_status_payed(
106+
self, payment_id: str, current_status: OrderStatusType
107+
) -> None:
95108
if not current_status == ConfirmOrderStatus.PENDING_CONFIRMATION:
96-
raise SantanderClientError( f"Unexpected status after confirmation: {current_status}")
109+
raise SantanderClientError(
110+
f"Unexpected status after confirmation: {current_status}"
111+
)
97112
confirm_response = self._payment_status_polling(
98-
payment_id=payment_id,
99-
until_status=[ConfirmOrderStatus.PAYED],
100-
max_update_attemps=MAX_UPDATE_STATUS_AFTER_CONFIRM
113+
payment_id=payment_id,
114+
until_status=[ConfirmOrderStatus.PAYED],
115+
max_update_attemps=MAX_UPDATE_STATUS_AFTER_CONFIRM,
101116
)
102117
return confirm_response
103-
104118

105-
def _payment_status_polling(self, payment_id: str, until_status: List[str], max_update_attemps: int) -> SantanderPixResponse:
119+
def _payment_status_polling(
120+
self, payment_id: str, until_status: List[str], max_update_attemps: int
121+
) -> SantanderPixResponse:
106122
for attempt in range(1, max_update_attemps + 1):
107123
response = self._request_payment_status(payment_id)
108-
self.logger.info(f"Checking status by polling: {payment_id} - {response.get("status")}")
124+
self.logger.info(
125+
f"Checking status by polling: {payment_id} - {response.get('status')}"
126+
)
109127
if response.get("status") in until_status:
110128
break
111129
if attempt == max_update_attemps:
112-
raise SantanderStatusTimeoutError("Status update attempt limit reached", self.current_step)
130+
raise SantanderStatusTimeoutError(
131+
"Status update attempt limit reached", self.current_step
132+
)
113133
sleep(UPDATE_STATUS_INTERVAL_TIME)
114134

115-
return response
135+
return response

tests/test_client_unit.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ def test_request(mock_request, client):
3333
response_dict = get_dict_payment_pix_response(
3434
"12345678", D(299.99), OrderStatus.READY_TO_PAY, "12345678909", "CPF"
3535
)
36-
request_dict = get_dict_payment_pix_request("12345678", D(299.99), "12345678909", "CPF")
36+
request_dict = get_dict_payment_pix_request(
37+
"12345678", D(299.99), "12345678909", "CPF"
38+
)
3739
mock_request.return_value.json.return_value = response_dict
3840
response_data = client._request("GET", "/test_endpoint")
3941
assert response_data == response_dict
@@ -42,9 +44,7 @@ def test_request(mock_request, client):
4244
)
4345

4446
mock_request.reset_mock()
45-
response_data = client._request(
46-
"POST", "/test_endpoint", data=request_dict
47-
)
47+
response_data = client._request("POST", "/test_endpoint", data=request_dict)
4848
assert response_data == response_dict
4949
mock_request.assert_called_once_with(
5050
"POST",

tests/test_pix_integration.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
import requests_mock
33
from decimal import Decimal
44
from santander_sdk.api_client.client import SantanderApiClient
5-
from santander_sdk.transfer_flow import (MAX_UPDATE_STATUS_AFTER_CONFIRM, MAX_UPDATE_STATUS_BEFORE_CONFIRM)
5+
from santander_sdk.transfer_flow import (
6+
MAX_UPDATE_STATUS_AFTER_CONFIRM,
7+
MAX_UPDATE_STATUS_BEFORE_CONFIRM,
8+
)
69
from santander_sdk.pix import transfer_pix
710
from mock.santander_mocker import (
811
PIX_ENDPOINT_WITH_WORKSPACE,

tests/test_pix_unit.py

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,37 @@
2525
"dictCodeType": "CPF",
2626
}
2727
tags = ["bf: 1234", "nf: 1234", "nf_data: 2021-10-10"]
28-
create_pix_response = get_dict_payment_pix_response('1234', D("123"), OrderStatus.PENDING_VALIDATION)
29-
ready_to_pay_response = get_dict_payment_pix_response('1234', D("123"), OrderStatus.READY_TO_PAY)
30-
confirm_response = get_dict_payment_pix_response('1234', D("123"), OrderStatus.PAYED)
28+
create_pix_response = get_dict_payment_pix_response(
29+
"1234", D("123"), OrderStatus.PENDING_VALIDATION
30+
)
31+
ready_to_pay_response = get_dict_payment_pix_response(
32+
"1234", D("123"), OrderStatus.READY_TO_PAY
33+
)
34+
confirm_response = get_dict_payment_pix_response("1234", D("123"), OrderStatus.PAYED)
35+
3136

3237
@pytest.fixture
3338
def api_client():
3439
return MagicMock()
3540

41+
3642
@pytest.fixture
3743
def mock_sdk(mocker):
3844
mock_sdk = MagicMock()
39-
mock_sdk.create = mocker.patch("santander_sdk.pix.SantanderPaymentFlow.create_payment")
40-
mock_sdk.ready_to_pay = mocker.patch("santander_sdk.pix.SantanderPaymentFlow.ensure_ready_to_pay")
41-
mock_sdk.confirm = mocker.patch("santander_sdk.pix.SantanderPaymentFlow.confirm_payment")
45+
mock_sdk.create = mocker.patch(
46+
"santander_sdk.pix.SantanderPaymentFlow.create_payment"
47+
)
48+
mock_sdk.ready_to_pay = mocker.patch(
49+
"santander_sdk.pix.SantanderPaymentFlow.ensure_ready_to_pay"
50+
)
51+
mock_sdk.confirm = mocker.patch(
52+
"santander_sdk.pix.SantanderPaymentFlow.confirm_payment"
53+
)
4254
mock_sdk.get_transfer = mocker.patch("santander_sdk.pix.get_transfer")
4355
mock_sdk.ready_to_pay.return_value = ready_to_pay_response
4456
mock_sdk.create.return_value = create_pix_response
4557
mock_sdk.confirm.return_value = confirm_response
46-
mock_sdk.get_transfer.return_value = confirm_response
58+
mock_sdk.get_transfer.return_value = confirm_response
4759
return mock_sdk
4860

4961

@@ -63,36 +75,50 @@ def test_request_create_pix_payment_by_key(api_client, mock_sdk):
6375
tags=tags,
6476
)
6577
assert response["success"] is True
66-
mock_sdk.create.assert_called_with({
67-
"tags": tags,
68-
"paymentValue": "123.00",
69-
"remittanceInformation": "Pagamento Teste",
70-
"dictCode": key_value,
71-
"dictCodeType": key_type,
72-
})
78+
mock_sdk.create.assert_called_with(
79+
{
80+
"tags": tags,
81+
"paymentValue": "123.00",
82+
"remittanceInformation": "Pagamento Teste",
83+
"dictCode": key_value,
84+
"dictCodeType": key_type,
85+
}
86+
)
7387
mock_sdk.ready_to_pay.assert_called_once_with(create_pix_response)
74-
mock_sdk.confirm.assert_called_with({
75-
"status": "AUTHORIZED",
76-
"paymentValue": "123.00",
77-
}, "1234")
88+
mock_sdk.confirm.assert_called_with(
89+
{
90+
"status": "AUTHORIZED",
91+
"paymentValue": "123.00",
92+
},
93+
"1234",
94+
)
7895
mock_sdk.create.reset_mock()
7996
mock_sdk.ready_to_pay.reset_mock()
8097
mock_sdk.confirm.reset_mock()
8198

99+
82100
def test_request_create_pix_payment_with_beneficiary(api_client, mock_sdk):
83-
response = transfer_pix(api_client, santander_beneciary_john, D("1248.33"), "Pagamento de teste", tags)
101+
response = transfer_pix(
102+
api_client, santander_beneciary_john, D("1248.33"), "Pagamento de teste", tags
103+
)
84104
assert response["success"] is True
85-
mock_sdk.create.assert_called_with({
86-
"tags": tags,
87-
"paymentValue": "1248.33",
88-
"remittanceInformation": "Pagamento de teste",
89-
"beneficiary": beneciary_john_dict_json,
90-
})
105+
mock_sdk.create.assert_called_with(
106+
{
107+
"tags": tags,
108+
"paymentValue": "1248.33",
109+
"remittanceInformation": "Pagamento de teste",
110+
"beneficiary": beneciary_john_dict_json,
111+
}
112+
)
91113
mock_sdk.ready_to_pay.assert_called_once_with(create_pix_response)
92-
mock_sdk.confirm.assert_called_with({
93-
"status": "AUTHORIZED",
94-
"paymentValue": "1248.33",
95-
}, "1234")
114+
mock_sdk.confirm.assert_called_with(
115+
{
116+
"status": "AUTHORIZED",
117+
"paymentValue": "1248.33",
118+
},
119+
"1234",
120+
)
121+
96122

97123
def test_request_pix_payment_status(api_client):
98124
api_client.get.return_value = confirm_response

0 commit comments

Comments
 (0)