cuenca-validations 2.1.33.dev0__tar.gz → 2.1.35__tar.gz

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.
Files changed (36) hide show
  1. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/PKG-INFO +1 -1
  2. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/__init__.py +2 -8
  3. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/queries.py +0 -6
  4. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/requests.py +16 -56
  5. cuenca_validations-2.1.35/cuenca_validations/version.py +1 -0
  6. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/PKG-INFO +1 -1
  7. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_requests.py +29 -0
  8. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_types.py +0 -84
  9. cuenca_validations-2.1.33.dev0/cuenca_validations/version.py +0 -1
  10. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/LICENSE +0 -0
  11. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/README.md +0 -0
  12. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/__init__.py +0 -0
  13. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/card_bins.py +0 -0
  14. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/errors.py +0 -0
  15. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/py.typed +0 -0
  16. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/card.py +0 -0
  17. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/enums.py +0 -0
  18. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/files.py +0 -0
  19. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/general.py +0 -0
  20. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/helpers.py +0 -0
  21. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/identities.py +0 -0
  22. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/morals.py +0 -0
  23. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/typing.py +0 -0
  24. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/validators.py +0 -0
  25. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/SOURCES.txt +0 -0
  26. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/dependency_links.txt +0 -0
  27. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/requires.txt +0 -0
  28. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/top_level.txt +0 -0
  29. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/setup.cfg +0 -0
  30. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/setup.py +0 -0
  31. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/__init__.py +0 -0
  32. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_card.py +0 -0
  33. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_errors.py +0 -0
  34. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_helpers.py +0 -0
  35. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_statement.py +0 -0
  36. {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_validators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.33.dev0
3
+ Version: 2.1.35
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -44,10 +44,6 @@ __all__ = [
44
44
  'FileBatchUploadRequest',
45
45
  'FileRequest',
46
46
  'FileUploadRequest',
47
- 'FraudFundsTransferAcceptedResponse',
48
- 'FraudFundsTransferQuery',
49
- 'FraudFundsTransferRequest',
50
- 'FraudFundsTransferResultEvent',
51
47
  'Gender',
52
48
  'IncomeType',
53
49
  'IssuerNetwork',
@@ -95,6 +91,7 @@ __all__ = [
95
91
  'TransferNetwork',
96
92
  'TransferQuery',
97
93
  'TransferRequest',
94
+ 'UpdateTransferRequest',
98
95
  'UserCardNotification',
99
96
  'UserCredentialRequest',
100
97
  'UserCredentialUpdateRequest',
@@ -211,7 +208,6 @@ from .queries import (
211
208
  DepositQuery,
212
209
  EventQuery,
213
210
  FileQuery,
214
- FraudFundsTransferQuery,
215
211
  IdentityQuery,
216
212
  PostalCodeQuery,
217
213
  QueryParams,
@@ -235,9 +231,6 @@ from .requests import (
235
231
  FileBatchUploadRequest,
236
232
  FileRequest,
237
233
  FileUploadRequest,
238
- FraudFundsTransferAcceptedResponse,
239
- FraudFundsTransferRequest,
240
- FraudFundsTransferResultEvent,
241
234
  KYCValidationRequest,
242
235
  LimitedWalletRequest,
243
236
  PartnerRequest,
@@ -251,6 +244,7 @@ from .requests import (
251
244
  StrictTransferRequest,
252
245
  TOSRequest,
253
246
  TransferRequest,
247
+ UpdateTransferRequest,
254
248
  UserCredentialRequest,
255
249
  UserCredentialUpdateRequest,
256
250
  UserListsRequest,
@@ -24,7 +24,6 @@ from .enums import (
24
24
  KYCFileType,
25
25
  SessionType,
26
26
  TermsOfService,
27
- TransactionStatus,
28
27
  TransferNetwork,
29
28
  UserStatus,
30
29
  )
@@ -154,11 +153,6 @@ class WalletTransactionQuery(QueryParams):
154
153
  wallet_uri: Optional[str] = None
155
154
 
156
155
 
157
- class FraudFundsTransferQuery(QueryParams):
158
- request_id: Optional[str] = None
159
- status: Optional[TransactionStatus] = None
160
-
161
-
162
156
  class UserQuery(QueryParams):
163
157
  phone_number: Optional[str] = None
164
158
  email_address: Optional[EmailStr] = None
@@ -1,5 +1,5 @@
1
1
  import datetime as dt
2
- from typing import Annotated, Any, Literal, Optional, Union
2
+ from typing import Annotated, Any, Optional, Union
3
3
 
4
4
  from clabe import Clabe
5
5
  from pydantic import (
@@ -45,6 +45,7 @@ from ..types.enums import (
45
45
  State,
46
46
  TermsOfService,
47
47
  TrackDataMethod,
48
+ TransactionStatus,
48
49
  TransactionTokenValidationStatus,
49
50
  UserCardNotification,
50
51
  UserStatus,
@@ -154,6 +155,20 @@ class StrictTransferRequest(BaseTransferRequest):
154
155
  )
155
156
 
156
157
 
158
+ class UpdateTransferRequest(BaseRequest):
159
+ status: TransactionStatus
160
+
161
+ @field_validator('status')
162
+ @classmethod
163
+ def validate_status(cls, status: TransactionStatus) -> TransactionStatus:
164
+ if status not in (
165
+ TransactionStatus.succeeded,
166
+ TransactionStatus.failed,
167
+ ):
168
+ raise ValueError('status must be succeeded or failed')
169
+ return status
170
+
171
+
157
172
  class CardUpdateRequest(BaseRequest):
158
173
  status: Optional[CardStatus] = None
159
174
  pin_block: Optional[str] = None
@@ -309,61 +324,6 @@ class WalletTransactionRequest(BaseRequest):
309
324
  amount: StrictPositiveInt
310
325
 
311
326
 
312
- class FraudFundsTransferRequest(BaseRequest):
313
- user_id: NonEmptyStr
314
- clabe: Clabe
315
- concepto: NonEmptyStr
316
- amount: Optional[StrictPositiveInt] = None
317
- reason: NonEmptyStr
318
- request_id: NonEmptyStr
319
-
320
-
321
- class FraudFundsTransferAcceptedResponse(BaseRequest):
322
- request_id: NonEmptyStr
323
- status: Literal['queued']
324
-
325
-
326
- class FraudFundsTransferResultEvent(BaseRequest):
327
- schema_version: NonEmptyStr
328
- event_type: Literal[
329
- 'fraud_funds_transfer.succeeded',
330
- 'fraud_funds_transfer.failed',
331
- ]
332
- request_id: NonEmptyStr
333
- user_id: NonEmptyStr
334
- transaction_id: Optional[NonEmptyStr] = None
335
- amount: Optional[StrictPositiveInt] = None
336
- clave_rastreo: Optional[NonEmptyStr] = None
337
- reason_code: Optional[NonEmptyStr] = None
338
- message: Optional[NonEmptyStr] = None
339
- completed_at: dt.datetime
340
-
341
- @model_validator(mode='after')
342
- def validate_payload(self) -> 'FraudFundsTransferResultEvent':
343
- if self.event_type == 'fraud_funds_transfer.succeeded':
344
- required = {
345
- 'transaction_id': self.transaction_id,
346
- 'amount': self.amount,
347
- }
348
- missing = [
349
- field for field, value in required.items() if value is None
350
- ]
351
- if missing:
352
- raise ValueError(
353
- f'{", ".join(missing)} required for succeeded event'
354
- )
355
- return self
356
-
357
- required = {
358
- 'reason_code': self.reason_code,
359
- 'message': self.message,
360
- }
361
- missing = [field for field, value in required.items() if value is None]
362
- if missing:
363
- raise ValueError(f'{", ".join(missing)} required for failed event')
364
- return self
365
-
366
-
367
327
  class FraudValidationRequest(BaseModel):
368
328
  amount: StrictPositiveInt
369
329
  merchant_name: str
@@ -0,0 +1 @@
1
+ __version__ = '2.1.35'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.33.dev0
3
+ Version: 2.1.35
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -5,6 +5,7 @@ from pydantic_extra_types.phone_numbers import PhoneNumber
5
5
  from cuenca_validations.types.enums import VerificationType
6
6
  from cuenca_validations.types.requests import (
7
7
  PasswordResetRequest,
8
+ UpdateTransferRequest,
8
9
  UserTOSAgreementRequest,
9
10
  UserUpdateRequest,
10
11
  VerificationRequest,
@@ -94,3 +95,31 @@ def test_user_update_request_normalizes_email() -> None:
94
95
  def test_user_update_request_normalizes_phone() -> None:
95
96
  req = UserUpdateRequest(phone_number=PhoneNumber('+116504401222'))
96
97
  assert req.phone_number == '+16504401222'
98
+
99
+
100
+ @pytest.mark.parametrize('status', ['succeeded', 'failed'])
101
+ def test_update_transfer_request_valid_status(status: str) -> None:
102
+ req = UpdateTransferRequest.model_validate({'status': status})
103
+ assert req.status == status
104
+ assert req.model_dump() == {'status': status}
105
+
106
+
107
+ @pytest.mark.parametrize('status', ['created', 'submitted', 'in_review'])
108
+ def test_update_transfer_request_invalid_status(status: str) -> None:
109
+ with pytest.raises(ValidationError) as ex:
110
+ UpdateTransferRequest.model_validate({'status': status})
111
+ assert 'status' in str(ex.value)
112
+
113
+
114
+ def test_update_transfer_request_missing_status() -> None:
115
+ with pytest.raises(ValidationError) as ex:
116
+ UpdateTransferRequest.model_validate({})
117
+ assert 'status' in str(ex.value)
118
+
119
+
120
+ def test_update_transfer_request_forbids_extra() -> None:
121
+ with pytest.raises(ValidationError) as ex:
122
+ UpdateTransferRequest.model_validate(
123
+ {'status': 'succeeded', 'foo': 'bar'}
124
+ )
125
+ assert 'Extra inputs are not permitted' in str(ex.value)
@@ -12,9 +12,6 @@ from pydantic.fields import FieldInfo
12
12
 
13
13
  from cuenca_validations.types import (
14
14
  CardQuery,
15
- FraudFundsTransferAcceptedResponse,
16
- FraudFundsTransferRequest,
17
- FraudFundsTransferResultEvent,
18
15
  JSONEncoder,
19
16
  QueryParams,
20
17
  SantizedDict,
@@ -639,87 +636,6 @@ def test_bank_account_validation_clabe_request():
639
636
  assert BankAccountValidationRequest(account_number='646180157098510917')
640
637
 
641
638
 
642
- def test_fraud_funds_transfer_models():
643
- request = FraudFundsTransferRequest(
644
- user_id='US123',
645
- clabe='646180157098510917',
646
- concepto=' fondos fraude ',
647
- amount=100,
648
- reason='fraud_report',
649
- request_id='REQ123',
650
- )
651
-
652
- assert request.concepto == 'fondos fraude'
653
- assert request.model_dump() == {
654
- 'user_id': 'US123',
655
- 'clabe': '646180157098510917',
656
- 'concepto': 'fondos fraude',
657
- 'amount': 100,
658
- 'reason': 'fraud_report',
659
- 'request_id': 'REQ123',
660
- }
661
-
662
- response = FraudFundsTransferAcceptedResponse(
663
- request_id='REQ123',
664
- status='queued',
665
- )
666
-
667
- assert response.status == 'queued'
668
-
669
- succeeded_event = FraudFundsTransferResultEvent(
670
- schema_version='1.0',
671
- event_type='fraud_funds_transfer.succeeded',
672
- request_id='REQ123',
673
- user_id='US123',
674
- transaction_id='TR123',
675
- amount=100,
676
- clave_rastreo='RASTREO123',
677
- completed_at=now,
678
- )
679
-
680
- assert succeeded_event.transaction_id == 'TR123'
681
-
682
- failed_event = FraudFundsTransferResultEvent(
683
- schema_version='1.0',
684
- event_type='fraud_funds_transfer.failed',
685
- request_id='REQ123',
686
- user_id='US123',
687
- reason_code='insufficient_funds',
688
- message='Insufficient funds',
689
- completed_at=now,
690
- )
691
-
692
- assert failed_event.reason_code == 'insufficient_funds'
693
-
694
-
695
- @pytest.mark.parametrize(
696
- 'event_type,expected_error',
697
- [
698
- (
699
- 'fraud_funds_transfer.succeeded',
700
- 'transaction_id, amount required for succeeded event',
701
- ),
702
- (
703
- 'fraud_funds_transfer.failed',
704
- 'reason_code, message required for failed event',
705
- ),
706
- ],
707
- )
708
- def test_fraud_funds_transfer_result_event_requires_payload(
709
- event_type, expected_error
710
- ):
711
- with pytest.raises(ValidationError) as ex:
712
- FraudFundsTransferResultEvent(
713
- schema_version='1.0',
714
- event_type=event_type,
715
- request_id='REQ123',
716
- user_id='US123',
717
- completed_at=now,
718
- )
719
-
720
- assert expected_error in str(ex.value)
721
-
722
-
723
639
  @pytest.mark.parametrize(
724
640
  'input_data',
725
641
  [
@@ -1 +0,0 @@
1
- __version__ = '2.1.33.dev0'