cuenca-validations 2.1.35.dev2__py3-none-any.whl → 2.1.36.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cuenca_validations/types/__init__.py +8 -0
- cuenca_validations/types/enums.py +8 -0
- cuenca_validations/types/queries.py +0 -2
- cuenca_validations/types/requests.py +20 -0
- cuenca_validations/version.py +1 -1
- {cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/METADATA +1 -1
- {cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/RECORD +11 -11
- tests/test_types.py +57 -33
- {cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/WHEEL +0 -0
- {cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/licenses/LICENSE +0 -0
- {cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/top_level.txt +0 -0
|
@@ -44,6 +44,10 @@ __all__ = [
|
|
|
44
44
|
'FileBatchUploadRequest',
|
|
45
45
|
'FileRequest',
|
|
46
46
|
'FileUploadRequest',
|
|
47
|
+
'FraudFundsTransferErrorResponse',
|
|
48
|
+
'FraudFundsTransferReasonCode',
|
|
49
|
+
'FraudFundsTransferRequest',
|
|
50
|
+
'FraudFundsTransferSuccessResponse',
|
|
47
51
|
'Gender',
|
|
48
52
|
'IncomeType',
|
|
49
53
|
'IssuerNetwork',
|
|
@@ -144,6 +148,7 @@ from .enums import (
|
|
|
144
148
|
EventType,
|
|
145
149
|
FileExtension,
|
|
146
150
|
FileFormat,
|
|
151
|
+
FraudFundsTransferReasonCode,
|
|
147
152
|
Gender,
|
|
148
153
|
IncomeType,
|
|
149
154
|
IssuerNetwork,
|
|
@@ -231,6 +236,9 @@ from .requests import (
|
|
|
231
236
|
FileBatchUploadRequest,
|
|
232
237
|
FileRequest,
|
|
233
238
|
FileUploadRequest,
|
|
239
|
+
FraudFundsTransferErrorResponse,
|
|
240
|
+
FraudFundsTransferRequest,
|
|
241
|
+
FraudFundsTransferSuccessResponse,
|
|
234
242
|
KYCValidationRequest,
|
|
235
243
|
LimitedWalletRequest,
|
|
236
244
|
PartnerRequest,
|
|
@@ -79,6 +79,14 @@ class TransactionStatus(str, Enum):
|
|
|
79
79
|
failed = 'failed'
|
|
80
80
|
|
|
81
81
|
|
|
82
|
+
class FraudFundsTransferReasonCode(str, Enum):
|
|
83
|
+
user_not_found = 'USER_NOT_FOUND'
|
|
84
|
+
user_not_fraud_blocked = 'USER_NOT_FRAUD_BLOCKED'
|
|
85
|
+
insufficient_funds = 'INSUFFICIENT_FUNDS'
|
|
86
|
+
clabe_invalid = 'CLABE_INVALID'
|
|
87
|
+
internal_error = 'INTERNAL_ERROR'
|
|
88
|
+
|
|
89
|
+
|
|
82
90
|
class TransferNetwork(str, Enum):
|
|
83
91
|
internal = 'internal'
|
|
84
92
|
spei = 'spei'
|
|
@@ -40,7 +40,6 @@ class QueryParams(BaseModel):
|
|
|
40
40
|
]
|
|
41
41
|
limit: Optional[PositiveInt] = None
|
|
42
42
|
user_id: Optional[str] = None
|
|
43
|
-
ids: Optional[list[str]] = Field(default=None, max_length=MAX_PAGE_SIZE)
|
|
44
43
|
created_before: Optional[dt.datetime] = None
|
|
45
44
|
created_after: Optional[dt.datetime] = None
|
|
46
45
|
related_transaction: Optional[str] = None
|
|
@@ -158,7 +157,6 @@ class UserQuery(QueryParams):
|
|
|
158
157
|
phone_number: Optional[str] = None
|
|
159
158
|
email_address: Optional[EmailStr] = None
|
|
160
159
|
status: Optional[UserStatus] = None
|
|
161
|
-
is_blocked: Optional[bool] = None
|
|
162
160
|
identity_uri: Optional[str] = None
|
|
163
161
|
has_curp_document: Optional[bool] = None
|
|
164
162
|
clabe: Optional[Clabe] = None
|
|
@@ -29,6 +29,7 @@ from ..types.enums import (
|
|
|
29
29
|
Country,
|
|
30
30
|
EcommerceIndicator,
|
|
31
31
|
FileExtension,
|
|
32
|
+
FraudFundsTransferReasonCode,
|
|
32
33
|
Gender,
|
|
33
34
|
IncomeType,
|
|
34
35
|
IssuerNetwork,
|
|
@@ -324,6 +325,25 @@ class WalletTransactionRequest(BaseRequest):
|
|
|
324
325
|
amount: StrictPositiveInt
|
|
325
326
|
|
|
326
327
|
|
|
328
|
+
class FraudFundsTransferRequest(BaseRequest):
|
|
329
|
+
request_id: NonEmptyStr
|
|
330
|
+
user_id: NonEmptyStr
|
|
331
|
+
clabe: Clabe
|
|
332
|
+
amount: Optional[StrictPositiveInt] = None
|
|
333
|
+
concepto: Optional[NonEmptyStr] = None
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
class FraudFundsTransferSuccessResponse(BaseRequest):
|
|
337
|
+
transaction_id: NonEmptyStr
|
|
338
|
+
amount: StrictPositiveInt
|
|
339
|
+
clave_rastreo: NonEmptyStr
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
class FraudFundsTransferErrorResponse(BaseRequest):
|
|
343
|
+
reason_code: FraudFundsTransferReasonCode
|
|
344
|
+
message: NonEmptyStr
|
|
345
|
+
|
|
346
|
+
|
|
327
347
|
class FraudValidationRequest(BaseModel):
|
|
328
348
|
amount: StrictPositiveInt
|
|
329
349
|
merchant_name: str
|
cuenca_validations/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '2.1.
|
|
1
|
+
__version__ = '2.1.36.dev1'
|
{cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/RECORD
RENAMED
|
@@ -4,27 +4,27 @@ cuenca_validations/errors.py,sha256=OtM8EgiKqYdz9Hn66AbBO96orL1or7efkyt0vh0Zxbs,
|
|
|
4
4
|
cuenca_validations/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
cuenca_validations/typing.py,sha256=1QCu81IbVZZpyInjyeAuO-nF36gpT5Gi4o6V9PozuOU,204
|
|
6
6
|
cuenca_validations/validators.py,sha256=zXSnU5-EMbQZBD-PfFXgP4Z6G7cm7KFDWXB7Nie6WUk,2682
|
|
7
|
-
cuenca_validations/version.py,sha256=
|
|
8
|
-
cuenca_validations/types/__init__.py,sha256=
|
|
7
|
+
cuenca_validations/version.py,sha256=FJNg7KGE0elXqQ1OIRtnCHRjehKbkbLbjTnQfBBXmqk,28
|
|
8
|
+
cuenca_validations/types/__init__.py,sha256=0PdtQeVI1_LpXHru7yha9ATlzQ9IXUf96SPC3OClfNs,5865
|
|
9
9
|
cuenca_validations/types/card.py,sha256=UGzz8NTFAverUmdUKAK1oGHnOnjSNTpIRUm93vKSSGY,1295
|
|
10
|
-
cuenca_validations/types/enums.py,sha256=
|
|
10
|
+
cuenca_validations/types/enums.py,sha256=we9to83E3QGcx29rKXVGCPkAmB7T9r1YcGu58dvkamQ,20847
|
|
11
11
|
cuenca_validations/types/files.py,sha256=2CszbwF9ytXV9suFFwyDjYG4XxY8UhCjRw3HttVXXNw,269
|
|
12
12
|
cuenca_validations/types/general.py,sha256=eYFYwyx_a4_J480GYpqW3DFbZabDFcUjvLRMQbShIUc,5622
|
|
13
13
|
cuenca_validations/types/helpers.py,sha256=4veeLZbugHHqZk0ezSim978VhH6Vq8XTrEhe1eE_r3A,1531
|
|
14
14
|
cuenca_validations/types/identities.py,sha256=j2xxh3UYHJe6IbAwr9yNXJkebTth_-g3SUmHeiPez8M,5513
|
|
15
15
|
cuenca_validations/types/morals.py,sha256=davabh5hAnFVQyM7-yCyDaT5ewXnm0cr1BtqDIwzkX8,1833
|
|
16
|
-
cuenca_validations/types/queries.py,sha256=
|
|
17
|
-
cuenca_validations/types/requests.py,sha256=
|
|
18
|
-
cuenca_validations-2.1.
|
|
16
|
+
cuenca_validations/types/queries.py,sha256=iVr6Z8ahXon0rlqQLu7aqRY6WtRxkN-1C7A2zeVt2-4,5314
|
|
17
|
+
cuenca_validations/types/requests.py,sha256=7WgJsiWOXwtqhWk0mkYRgyR_g02ihO0Y0rrUs4BQDQE,24974
|
|
18
|
+
cuenca_validations-2.1.36.dev1.dist-info/licenses/LICENSE,sha256=wR76FmxBbfnQpwELkkE5iMF8sFIafEMgXLTE4N4WPTc,1063
|
|
19
19
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
20
|
tests/test_card.py,sha256=QAfRz7e11gWICPnFJZ2tiYgUsFV3C9TwzJXrDnDNXFw,1202
|
|
21
21
|
tests/test_errors.py,sha256=ixiIgEuBuzfsL5p4uCFdF32XqFRtTPF6EVhGJ0keOrI,930
|
|
22
22
|
tests/test_helpers.py,sha256=fx2R7y6oQO8XeQzevJe826NuHkBgvtznZicomchB3Gg,899
|
|
23
23
|
tests/test_requests.py,sha256=3XMx2A-BK21g1Exm4RTVm6eKTOzeZH-8FzKJXQmmMmA,4141
|
|
24
24
|
tests/test_statement.py,sha256=IOE0rRRBgBZSJv_FLaETEyn5NzzXKMNTqgjv99GX-68,1436
|
|
25
|
-
tests/test_types.py,sha256=
|
|
25
|
+
tests/test_types.py,sha256=xPBOWsz-VFT8CxfwCAulLshkZKZkIJTjZP40GxwsLgI,23019
|
|
26
26
|
tests/test_validators.py,sha256=Jjr9gWTT4cRntGiKvQK4fncqx3JkEuTWkKm1VqpRHTs,1829
|
|
27
|
-
cuenca_validations-2.1.
|
|
28
|
-
cuenca_validations-2.1.
|
|
29
|
-
cuenca_validations-2.1.
|
|
30
|
-
cuenca_validations-2.1.
|
|
27
|
+
cuenca_validations-2.1.36.dev1.dist-info/METADATA,sha256=NLe8HOsIMid6XYXFJX7UDfPPTkveBkJXAIK3x_4eD60,1600
|
|
28
|
+
cuenca_validations-2.1.36.dev1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
29
|
+
cuenca_validations-2.1.36.dev1.dist-info/top_level.txt,sha256=4233xdOs2HtuT-GFRjcDcwK0IwdwvWdczOtk0fPB6Gw,25
|
|
30
|
+
cuenca_validations-2.1.36.dev1.dist-info/RECORD,,
|
tests/test_types.py
CHANGED
|
@@ -12,6 +12,10 @@ from pydantic.fields import FieldInfo
|
|
|
12
12
|
|
|
13
13
|
from cuenca_validations.types import (
|
|
14
14
|
CardQuery,
|
|
15
|
+
FraudFundsTransferErrorResponse,
|
|
16
|
+
FraudFundsTransferReasonCode,
|
|
17
|
+
FraudFundsTransferRequest,
|
|
18
|
+
FraudFundsTransferSuccessResponse,
|
|
15
19
|
JSONEncoder,
|
|
16
20
|
QueryParams,
|
|
17
21
|
SantizedDict,
|
|
@@ -247,39 +251,6 @@ def test_user_query_rejects_invalid(field, value):
|
|
|
247
251
|
UserQuery(**{field: value})
|
|
248
252
|
|
|
249
253
|
|
|
250
|
-
def test_user_query_accepts_ids_and_is_blocked():
|
|
251
|
-
query = UserQuery(ids=['US1', 'US2'], is_blocked=True)
|
|
252
|
-
assert query.ids == ['US1', 'US2']
|
|
253
|
-
assert query.is_blocked is True
|
|
254
|
-
dumped = query.model_dump(exclude_none=True)
|
|
255
|
-
assert dumped['ids'] == ['US1', 'US2']
|
|
256
|
-
assert dumped['is_blocked'] is True
|
|
257
|
-
assert isinstance(dumped['ids'], list)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
def test_query_params_accepts_ids():
|
|
261
|
-
query = QueryParams(ids=['US1', 'US2'])
|
|
262
|
-
assert query.ids == ['US1', 'US2']
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
def test_user_query_rejects_ids_over_limit():
|
|
266
|
-
with pytest.raises(ValidationError):
|
|
267
|
-
UserQuery(ids=[f'US{i}' for i in range(101)])
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
def test_user_query_ids_empty_list_ok():
|
|
271
|
-
query = UserQuery(ids=[])
|
|
272
|
-
assert query.ids == []
|
|
273
|
-
assert 'ids' in query.model_dump(exclude_none=True)
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
def test_user_query_ids_none_excluded_from_dump():
|
|
277
|
-
query = UserQuery()
|
|
278
|
-
dumped = query.model_dump(exclude_none=True)
|
|
279
|
-
assert 'ids' not in dumped
|
|
280
|
-
assert 'is_blocked' not in dumped
|
|
281
|
-
|
|
282
|
-
|
|
283
254
|
def test_exclude_none_in_dict():
|
|
284
255
|
request = ApiKeyUpdateRequest(user_id='US123')
|
|
285
256
|
assert request.model_dump() == dict(user_id='US123')
|
|
@@ -669,6 +640,59 @@ def test_bank_account_validation_clabe_request():
|
|
|
669
640
|
assert BankAccountValidationRequest(account_number='646180157098510917')
|
|
670
641
|
|
|
671
642
|
|
|
643
|
+
def test_fraud_funds_transfer_models():
|
|
644
|
+
request = FraudFundsTransferRequest(
|
|
645
|
+
request_id='f0a2b3-request-hash',
|
|
646
|
+
user_id='US123',
|
|
647
|
+
clabe='646180157098510917',
|
|
648
|
+
amount=10000,
|
|
649
|
+
concepto=' Devolución fraude ',
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
assert request.concepto == 'Devolución fraude'
|
|
653
|
+
assert request.model_dump() == {
|
|
654
|
+
'request_id': 'f0a2b3-request-hash',
|
|
655
|
+
'user_id': 'US123',
|
|
656
|
+
'clabe': '646180157098510917',
|
|
657
|
+
'amount': 10000,
|
|
658
|
+
'concepto': 'Devolución fraude',
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
request_full_balance = FraudFundsTransferRequest(
|
|
662
|
+
request_id='f0a2b3-request-hash',
|
|
663
|
+
user_id='US123',
|
|
664
|
+
clabe='646180157098510917',
|
|
665
|
+
)
|
|
666
|
+
|
|
667
|
+
assert request_full_balance.model_dump() == {
|
|
668
|
+
'request_id': 'f0a2b3-request-hash',
|
|
669
|
+
'user_id': 'US123',
|
|
670
|
+
'clabe': '646180157098510917',
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
success = FraudFundsTransferSuccessResponse(
|
|
674
|
+
transaction_id='SP123',
|
|
675
|
+
amount=10000,
|
|
676
|
+
clave_rastreo='CUENCA123',
|
|
677
|
+
)
|
|
678
|
+
|
|
679
|
+
assert success.model_dump() == {
|
|
680
|
+
'transaction_id': 'SP123',
|
|
681
|
+
'amount': 10000,
|
|
682
|
+
'clave_rastreo': 'CUENCA123',
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
error = FraudFundsTransferErrorResponse(
|
|
686
|
+
reason_code=FraudFundsTransferReasonCode.insufficient_funds,
|
|
687
|
+
message='Fondos insuficientes',
|
|
688
|
+
)
|
|
689
|
+
|
|
690
|
+
assert error.model_dump() == {
|
|
691
|
+
'reason_code': 'INSUFFICIENT_FUNDS',
|
|
692
|
+
'message': 'Fondos insuficientes',
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
|
|
672
696
|
@pytest.mark.parametrize(
|
|
673
697
|
'input_data',
|
|
674
698
|
[
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.35.dev2.dist-info → cuenca_validations-2.1.36.dev1.dist-info}/top_level.txt
RENAMED
|
File without changes
|