Skip to content

Commit 7f1230f

Browse files
committed
implement transfer status update functionality in the Transfer class with corresponding tests.
1 parent 2cbdb51 commit 7f1230f

7 files changed

Lines changed: 131 additions & 6 deletions

File tree

cuenca/resources/transfers.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
import datetime as dt
2-
from typing import ClassVar, Optional, cast
2+
from typing import ClassVar, Literal, Optional, cast
33

44
from cuenca_validations.types import (
5+
TransactionStatus,
56
TransferNetwork,
67
TransferQuery,
78
TransferRequest,
9+
UpdateTransferRequest,
810
)
911
from cuenca_validations.typing import DictStrAny
1012
from requests import HTTPError
1113

1214
from ..exc import CuencaException
15+
from ..http import Session, session as global_session
1316
from .accounts import Account
14-
from .base import Creatable, Transaction
17+
from .base import Creatable, Transaction, Updateable
1518
from .resources import retrieve_uri
1619

1720

18-
class Transfer(Transaction, Creatable):
21+
class Transfer(Transaction, Creatable, Updateable):
1922
_resource: ClassVar = 'transfers'
2023
_query_params: ClassVar = TransferQuery
2124

@@ -71,6 +74,28 @@ def create(
7174
)
7275
return cls._create(**req.model_dump())
7376

77+
@classmethod
78+
def update(
79+
cls,
80+
transfer_id: str,
81+
status: Literal[
82+
TransactionStatus.succeeded,
83+
TransactionStatus.failed,
84+
],
85+
*,
86+
session: Session = global_session,
87+
) -> 'Transfer':
88+
"""
89+
Updates the status of a held transfer.
90+
91+
:param transfer_id: existing transfer_id
92+
:param status: TransactionStatus.succeeded to approve, or
93+
TransactionStatus.failed to reject
94+
:return: Updated transfer object
95+
"""
96+
req = UpdateTransferRequest(status=status)
97+
return cls._update(transfer_id, session=session, **req.model_dump())
98+
7499
@classmethod
75100
def create_many(cls, requests: list[TransferRequest]) -> DictStrAny:
76101
transfers: DictStrAny = dict(submitted=[], errors=[])

cuenca/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = '2.2.0'
1+
__version__ = '2.1.21'
22
CLIENT_VERSION = __version__
33
API_VERSION = '2020-03-19'

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
requests==2.32.3
2-
cuenca-validations==2.1.31
2+
cuenca-validations==2.1.34
33
pydantic-extra-types==2.10.2

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
python_requires='>=3.9',
2525
install_requires=[
2626
'requests>=2.32.0',
27-
'cuenca-validations>=2.1.27',
27+
'cuenca-validations>=2.1.34',
2828
'pydantic-extra-types>=2.10.0',
2929
],
3030
classifiers=[
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
interactions:
2+
- request:
3+
body: '{"status": "failed"}'
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Authorization:
10+
- DUMMY
11+
Connection:
12+
- keep-alive
13+
Content-Length:
14+
- '20'
15+
Content-Type:
16+
- application/json
17+
User-Agent:
18+
- cuenca-python/2.1.21
19+
X-Cuenca-Api-Version:
20+
- '2020-03-19'
21+
method: PATCH
22+
uri: https://sandbox.cuenca.com/transfers/TR02
23+
response:
24+
body:
25+
string: '{"id":"TR02","created_at":"2026-05-26T12:00:00.000000","updated_at":"2026-05-26T12:02:00.000000","account_number":"646180157046685645","recipient_name":"Rogelio
26+
Lopez","amount":10000,"descriptor":"held transfer","idempotency_key":"idem-tr02","status":"failed","network":"internal","destination_uri":"/accounts/LA1CVCZVNLR4KM42kPcqhBLV","tracking_key":null,"user_id":"US4PCNV8rLB2wqBfORzIAXUl","reference_number":null}'
27+
headers:
28+
Connection:
29+
- keep-alive
30+
Content-Type:
31+
- application/json
32+
status:
33+
code: 200
34+
message: OK
35+
version: 1
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
interactions:
2+
- request:
3+
body: '{"status": "succeeded"}'
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Authorization:
10+
- DUMMY
11+
Connection:
12+
- keep-alive
13+
Content-Length:
14+
- '23'
15+
Content-Type:
16+
- application/json
17+
User-Agent:
18+
- cuenca-python/2.1.21
19+
X-Cuenca-Api-Version:
20+
- '2020-03-19'
21+
method: PATCH
22+
uri: https://sandbox.cuenca.com/transfers/TR01
23+
response:
24+
body:
25+
string: '{"id":"TR01","created_at":"2026-05-26T12:00:00.000000","updated_at":"2026-05-26T12:01:00.000000","account_number":"646180157046685645","recipient_name":"Rogelio
26+
Lopez","amount":10000,"descriptor":"held transfer","idempotency_key":"idem-tr01","status":"succeeded","network":"internal","destination_uri":"/accounts/LA1CVCZVNLR4KM42kPcqhBLV","tracking_key":"tk01","user_id":"US4PCNV8rLB2wqBfORzIAXUl","reference_number":null}'
27+
headers:
28+
Connection:
29+
- keep-alive
30+
Content-Type:
31+
- application/json
32+
status:
33+
code: 200
34+
message: OK
35+
version: 1

tests/resources/test_transfers.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,33 @@ def test_invalid_params():
130130
with pytest.raises(ValidationError) as e:
131131
Transfer.one(invalid_param='invalid_param')
132132
assert 'Extra inputs are not permitted' in str(e)
133+
134+
135+
@pytest.mark.vcr
136+
def test_transfers_update_succeeded():
137+
transfer = Transfer.update('TR01', status=TransactionStatus.succeeded)
138+
assert transfer.id == 'TR01'
139+
assert transfer.status == TransactionStatus.succeeded
140+
141+
142+
@pytest.mark.vcr
143+
def test_transfers_update_failed():
144+
transfer = Transfer.update('TR02', status=TransactionStatus.failed)
145+
assert transfer.id == 'TR02'
146+
assert transfer.status == TransactionStatus.failed
147+
148+
149+
@pytest.mark.parametrize(
150+
'invalid_status',
151+
[
152+
TransactionStatus.created,
153+
TransactionStatus.submitted,
154+
TransactionStatus.in_review,
155+
'cancelled',
156+
'approve',
157+
'reject',
158+
],
159+
)
160+
def test_transfers_update_rejects_invalid_status(invalid_status):
161+
with pytest.raises(ValidationError):
162+
Transfer.update('TR03', status=invalid_status)

0 commit comments

Comments
 (0)