cuenca-validations 2.1.9.dev1__tar.gz → 2.1.9.dev2__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.
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/PKG-INFO +1 -1
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/__init__.py +4 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/enums.py +16 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/identities.py +29 -21
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/morals.py +3 -2
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/queries.py +13 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/requests.py +23 -50
- cuenca_validations-2.1.9.dev2/cuenca_validations/version.py +1 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations.egg-info/PKG-INFO +1 -1
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/tests/test_types.py +33 -51
- cuenca_validations-2.1.9.dev1/cuenca_validations/version.py +0 -1
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/LICENSE +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/README.md +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/__init__.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/card_bins.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/errors.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/py.typed +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/card.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/files.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/general.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/helpers.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/typing.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/validators.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations.egg-info/SOURCES.txt +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations.egg-info/dependency_links.txt +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations.egg-info/requires.txt +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations.egg-info/top_level.txt +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/setup.cfg +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/setup.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/tests/__init__.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/tests/test_card.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/tests/test_errors.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/tests/test_helpers.py +0 -0
- {cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/tests/test_statement.py +0 -0
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/__init__.py
RENAMED
|
@@ -7,6 +7,7 @@ __all__ = [
|
|
|
7
7
|
'BalanceEntryQuery',
|
|
8
8
|
'BankAccountValidationQuery',
|
|
9
9
|
'BankAccountValidationRequest',
|
|
10
|
+
'PostalCodeQuery',
|
|
10
11
|
'BankAccountStatus',
|
|
11
12
|
'BatchFileMetadata',
|
|
12
13
|
'Beneficiary',
|
|
@@ -55,6 +56,7 @@ __all__ = [
|
|
|
55
56
|
'PlatformRequest',
|
|
56
57
|
'PlatformType',
|
|
57
58
|
'PosCapability',
|
|
59
|
+
'Profession',
|
|
58
60
|
'QueryParams',
|
|
59
61
|
'Rfc',
|
|
60
62
|
'QuestionnairesRequest',
|
|
@@ -134,6 +136,7 @@ from .enums import (
|
|
|
134
136
|
Language,
|
|
135
137
|
PlatformType,
|
|
136
138
|
PosCapability,
|
|
139
|
+
Profession,
|
|
137
140
|
SATRegimeCode,
|
|
138
141
|
SavingCategory,
|
|
139
142
|
ServiceProviderCategory,
|
|
@@ -183,6 +186,7 @@ from .queries import (
|
|
|
183
186
|
EventQuery,
|
|
184
187
|
FileQuery,
|
|
185
188
|
IdentityQuery,
|
|
189
|
+
PostalCodeQuery,
|
|
186
190
|
QueryParams,
|
|
187
191
|
SessionQuery,
|
|
188
192
|
StatementQuery,
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/enums.py
RENAMED
|
@@ -688,3 +688,19 @@ class SATRegimeCode(str, Enum):
|
|
|
688
688
|
ING_PREM = "615" # Régimen de los ingresos por obtención de premios
|
|
689
689
|
AE_PLAT_TEC = "625" # Régimen de las Actividades Empresariales con ingresos a través de Plataformas Tecnológicas # noqa: E501
|
|
690
690
|
RS_CONF = "626" # Régimen Simplificado de Confianza
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
class Profession(str, Enum):
|
|
694
|
+
artisticas = 'Actividades Artísticas'
|
|
695
|
+
agropecuario = 'Agricultura, Ganadería o Pesca'
|
|
696
|
+
comercio = 'Comercio'
|
|
697
|
+
estudiante = 'Estudiante'
|
|
698
|
+
empleado = 'Empleado(a/e)'
|
|
699
|
+
emprendimiento = 'Emprendimiento'
|
|
700
|
+
hogar = 'Hogar'
|
|
701
|
+
profesor = 'Profesor(a/e)'
|
|
702
|
+
profesionista = 'Profesionista'
|
|
703
|
+
servidor_publico = 'Servidor(a/e) Público'
|
|
704
|
+
sistemas = 'Sistemas y Comunicaciones'
|
|
705
|
+
independiente = 'Trabajador(a/e) Independiente'
|
|
706
|
+
oficios = 'Oficios Varios'
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import Annotated,
|
|
2
|
+
from typing import Annotated, Optional
|
|
3
3
|
|
|
4
|
-
from pydantic import
|
|
5
|
-
BaseModel,
|
|
6
|
-
ConfigDict,
|
|
7
|
-
Field,
|
|
8
|
-
SecretStr,
|
|
9
|
-
StringConstraints,
|
|
10
|
-
model_validator,
|
|
11
|
-
)
|
|
4
|
+
from pydantic import BaseModel, ConfigDict, Field, SecretStr, StringConstraints
|
|
12
5
|
from pydantic_extra_types.phone_numbers import PhoneNumber
|
|
13
6
|
|
|
14
7
|
from .enums import Country, KYCFileType, State, VerificationStatus
|
|
15
|
-
from .general import SerializableIPvAnyAddress
|
|
8
|
+
from .general import NonEmptyStr, SerializableIPvAnyAddress
|
|
16
9
|
|
|
17
10
|
Password = Annotated[
|
|
18
11
|
SecretStr,
|
|
@@ -43,6 +36,13 @@ Rfc = Annotated[
|
|
|
43
36
|
),
|
|
44
37
|
]
|
|
45
38
|
|
|
39
|
+
# NOTE:
|
|
40
|
+
# The Address model is kept for compatibility with legacy models and data
|
|
41
|
+
# that expect all address fields to be optional. This allows older systems
|
|
42
|
+
# or stored data using Address to continue working without breaking changes.
|
|
43
|
+
# For new request validation, use AddressRequest, which enforces required
|
|
44
|
+
# fields and is intended for validating incoming data.
|
|
45
|
+
|
|
46
46
|
|
|
47
47
|
class Address(BaseModel):
|
|
48
48
|
street: Optional[str] = None
|
|
@@ -69,16 +69,24 @@ class Address(BaseModel):
|
|
|
69
69
|
}
|
|
70
70
|
)
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
72
|
+
|
|
73
|
+
class AddressRequest(BaseModel):
|
|
74
|
+
# This model is mainly for request validation, enforcing required fields.
|
|
75
|
+
street: NonEmptyStr
|
|
76
|
+
ext_number: NonEmptyStr
|
|
77
|
+
int_number: Optional[NonEmptyStr] = None
|
|
78
|
+
postal_code_id: NonEmptyStr
|
|
79
|
+
|
|
80
|
+
model_config = ConfigDict(
|
|
81
|
+
json_schema_extra={
|
|
82
|
+
"example": {
|
|
83
|
+
"street": "Reforma",
|
|
84
|
+
"ext_number": "265",
|
|
85
|
+
"int_number": "5",
|
|
86
|
+
"postal_code_id": "PC2ygq9j2bS9-9tsuVawzErA",
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
)
|
|
82
90
|
|
|
83
91
|
|
|
84
92
|
class Beneficiary(BaseModel):
|
|
@@ -86,7 +94,7 @@ class Beneficiary(BaseModel):
|
|
|
86
94
|
birth_date: dt.date
|
|
87
95
|
phone_number: PhoneNumber
|
|
88
96
|
user_relationship: str
|
|
89
|
-
percentage: int
|
|
97
|
+
percentage: Annotated[int, Field(ge=1, le=100)]
|
|
90
98
|
model_config = ConfigDict(
|
|
91
99
|
json_schema_extra={
|
|
92
100
|
"example": {
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/morals.py
RENAMED
|
@@ -3,7 +3,8 @@ from typing import Optional
|
|
|
3
3
|
|
|
4
4
|
from pydantic import BaseModel, EmailStr
|
|
5
5
|
|
|
6
|
-
from
|
|
6
|
+
from ..types import Curp, PhoneNumber, Rfc
|
|
7
|
+
from .identities import AddressRequest
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class BusinessDetails(BaseModel):
|
|
@@ -60,7 +61,7 @@ class LegalRepresentative(PhysicalPerson):
|
|
|
60
61
|
job: str
|
|
61
62
|
phone_number: PhoneNumber
|
|
62
63
|
email_address: EmailStr
|
|
63
|
-
address:
|
|
64
|
+
address: AddressRequest
|
|
64
65
|
|
|
65
66
|
|
|
66
67
|
class ShareholderPhysical(PhysicalPerson):
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/queries.py
RENAMED
|
@@ -7,6 +7,7 @@ from pydantic import (
|
|
|
7
7
|
EmailStr,
|
|
8
8
|
Field,
|
|
9
9
|
PositiveInt,
|
|
10
|
+
StringConstraints,
|
|
10
11
|
field_validator,
|
|
11
12
|
)
|
|
12
13
|
|
|
@@ -179,3 +180,15 @@ class FileQuery(QueryParams):
|
|
|
179
180
|
class BankAccountValidationQuery(QueryParams):
|
|
180
181
|
account_number: Optional[str] = None
|
|
181
182
|
status: Optional[BankAccountStatus] = None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class PostalCodeQuery(QueryParams):
|
|
186
|
+
postal_code: Annotated[
|
|
187
|
+
str,
|
|
188
|
+
StringConstraints(
|
|
189
|
+
strip_whitespace=True,
|
|
190
|
+
min_length=5,
|
|
191
|
+
max_length=5,
|
|
192
|
+
pattern=r'^\d+$',
|
|
193
|
+
),
|
|
194
|
+
]
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/requests.py
RENAMED
|
@@ -32,6 +32,7 @@ from ..types.enums import (
|
|
|
32
32
|
KYCValidationSource,
|
|
33
33
|
PlatformType,
|
|
34
34
|
PosCapability,
|
|
35
|
+
Profession,
|
|
35
36
|
SavingCategory,
|
|
36
37
|
SessionType,
|
|
37
38
|
State,
|
|
@@ -39,7 +40,6 @@ from ..types.enums import (
|
|
|
39
40
|
TrackDataMethod,
|
|
40
41
|
TransactionTokenValidationStatus,
|
|
41
42
|
UserCardNotification,
|
|
42
|
-
UserStatus,
|
|
43
43
|
VerificationType,
|
|
44
44
|
WalletTransactionType,
|
|
45
45
|
WebhookEvent,
|
|
@@ -64,14 +64,13 @@ from .general import (
|
|
|
64
64
|
StrictPositiveInt,
|
|
65
65
|
)
|
|
66
66
|
from .identities import (
|
|
67
|
-
|
|
67
|
+
AddressRequest,
|
|
68
68
|
Beneficiary,
|
|
69
69
|
Curp,
|
|
70
70
|
KYCFile,
|
|
71
71
|
Password,
|
|
72
72
|
PhoneNumber,
|
|
73
73
|
Rfc,
|
|
74
|
-
TOSAgreement,
|
|
75
74
|
)
|
|
76
75
|
from .morals import (
|
|
77
76
|
AuditDetails,
|
|
@@ -407,47 +406,28 @@ class TOSRequest(BaseModel):
|
|
|
407
406
|
class UserTOSAgreementRequest(BaseModel):
|
|
408
407
|
tos_id: str
|
|
409
408
|
location: Coordinate
|
|
410
|
-
signature: SerializableHttpUrl | None = None
|
|
411
409
|
|
|
412
410
|
|
|
413
411
|
class UserRequest(BaseModel):
|
|
414
|
-
id: Optional[str] = Field(
|
|
415
|
-
None, description='if you want to create with specific `id`'
|
|
416
|
-
)
|
|
417
412
|
curp: Curp = Field(
|
|
418
|
-
description=
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
None, description='Only if you validated previously on your side'
|
|
422
|
-
)
|
|
423
|
-
email_address: Optional[EmailStr] = Field(
|
|
424
|
-
None, description='Only if you validated previously on your side'
|
|
425
|
-
)
|
|
426
|
-
profession: Optional[str] = None
|
|
427
|
-
address: Optional[Address] = None
|
|
428
|
-
status: Optional[UserStatus] = Field(
|
|
429
|
-
None,
|
|
430
|
-
description='Status that the user will have when created. '
|
|
431
|
-
'Defined by platform',
|
|
413
|
+
description=(
|
|
414
|
+
'Mexican government ID (18 characters). ' 'Must be pre-validated.'
|
|
415
|
+
)
|
|
432
416
|
)
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
description='Maximum level a User can reach. Defined by platform',
|
|
417
|
+
|
|
418
|
+
profession: Profession = Field(description='User profession or occupation')
|
|
419
|
+
address: AddressRequest = Field(
|
|
420
|
+
description='User residential address information'
|
|
438
421
|
)
|
|
439
|
-
phone_verification_id:
|
|
440
|
-
|
|
441
|
-
description='
|
|
442
|
-
'resource `verifications`',
|
|
422
|
+
phone_verification_id: str = Field(
|
|
423
|
+
...,
|
|
424
|
+
description='ID of previously validated phone verification',
|
|
443
425
|
)
|
|
444
|
-
email_verification_id:
|
|
445
|
-
|
|
446
|
-
description='
|
|
447
|
-
'resource `verifications`',
|
|
426
|
+
email_verification_id: str = Field(
|
|
427
|
+
...,
|
|
428
|
+
description='ID of previously validated email verification',
|
|
448
429
|
)
|
|
449
|
-
|
|
450
|
-
signature: Optional[KYCFile] = None
|
|
430
|
+
|
|
451
431
|
model_config = ConfigDict(
|
|
452
432
|
json_schema_extra={
|
|
453
433
|
'example': {
|
|
@@ -455,7 +435,7 @@ class UserRequest(BaseModel):
|
|
|
455
435
|
'phone_number': '+525511223344',
|
|
456
436
|
'email_address': 'user@example.com',
|
|
457
437
|
'profession': 'engineer',
|
|
458
|
-
'address':
|
|
438
|
+
'address': AddressRequest.model_json_schema().get('example'),
|
|
459
439
|
}
|
|
460
440
|
},
|
|
461
441
|
)
|
|
@@ -480,21 +460,16 @@ class UserRequest(BaseModel):
|
|
|
480
460
|
|
|
481
461
|
|
|
482
462
|
class UserUpdateRequest(BaseModel):
|
|
483
|
-
|
|
484
|
-
email_address: Optional[EmailStr] = None
|
|
485
|
-
profession: Optional[str] = None
|
|
463
|
+
profession: Optional[Profession] = None
|
|
486
464
|
verification_id: Optional[str] = None
|
|
487
465
|
email_verification_id: Optional[str] = None
|
|
488
466
|
phone_verification_id: Optional[str] = None
|
|
489
|
-
address: Optional[
|
|
467
|
+
address: Optional[AddressRequest] = None
|
|
490
468
|
beneficiaries: Optional[list[Beneficiary]] = None
|
|
491
469
|
govt_id: Optional[KYCFile] = None
|
|
492
470
|
proof_of_address: Optional[KYCFile] = None
|
|
493
471
|
proof_of_life: Optional[KYCFile] = None
|
|
494
472
|
signature: Optional[KYCFile] = None
|
|
495
|
-
status: Optional[UserStatus] = None
|
|
496
|
-
terms_of_service: Optional[TOSRequest] = None
|
|
497
|
-
platform_terms_of_service: Optional[TOSAgreement] = None
|
|
498
473
|
curp_document_uri: Optional[SerializableHttpUrl] = None
|
|
499
474
|
|
|
500
475
|
@field_validator('beneficiaries')
|
|
@@ -502,8 +477,8 @@ class UserUpdateRequest(BaseModel):
|
|
|
502
477
|
def beneficiary_percentage(
|
|
503
478
|
cls, beneficiaries: Optional[list[Beneficiary]] = None
|
|
504
479
|
):
|
|
505
|
-
if beneficiaries and sum(b.percentage for b in beneficiaries)
|
|
506
|
-
raise ValueError('The total percentage
|
|
480
|
+
if beneficiaries and sum(b.percentage for b in beneficiaries) != 100:
|
|
481
|
+
raise ValueError('The total percentage should be 100%')
|
|
507
482
|
return beneficiaries
|
|
508
483
|
|
|
509
484
|
|
|
@@ -570,14 +545,12 @@ class VerificationRequest(BaseModel):
|
|
|
570
545
|
recipient: Union[EmailStr, PhoneNumber] = Field(
|
|
571
546
|
description='Phone or email to validate'
|
|
572
547
|
)
|
|
573
|
-
platform_id: str
|
|
574
548
|
model_config = ConfigDict(
|
|
575
549
|
str_strip_whitespace=True,
|
|
576
550
|
json_schema_extra={
|
|
577
551
|
'example': {
|
|
578
552
|
'type': 'email',
|
|
579
553
|
'recipient': 'user@example.com',
|
|
580
|
-
'platform_id': 'PT8UEv02zBTcymd4Kd3MO6pg',
|
|
581
554
|
}
|
|
582
555
|
},
|
|
583
556
|
)
|
|
@@ -710,7 +683,7 @@ class PartnerRequest(BaseRequest):
|
|
|
710
683
|
web_site: str
|
|
711
684
|
phone_number: PhoneNumber
|
|
712
685
|
email_address: EmailStr
|
|
713
|
-
address:
|
|
686
|
+
address: AddressRequest
|
|
714
687
|
|
|
715
688
|
|
|
716
689
|
class PartnerUpdateRequest(BaseRequest):
|
|
@@ -724,7 +697,7 @@ class PartnerUpdateRequest(BaseRequest):
|
|
|
724
697
|
web_site: Optional[str] = None
|
|
725
698
|
phone_number: Optional[PhoneNumber] = None
|
|
726
699
|
email_address: Optional[EmailStr] = None
|
|
727
|
-
address: Optional[
|
|
700
|
+
address: Optional[AddressRequest] = None
|
|
728
701
|
business_details: Optional[BusinessDetails] = None
|
|
729
702
|
transactional_profile: Optional[TransactionalProfile] = None
|
|
730
703
|
external_account: Optional[Clabe] = None
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.1.9.dev2'
|
|
@@ -10,7 +10,6 @@ from pydantic import AfterValidator, BaseModel, SecretStr, ValidationError
|
|
|
10
10
|
from pydantic.fields import FieldInfo
|
|
11
11
|
|
|
12
12
|
from cuenca_validations.types import (
|
|
13
|
-
Address,
|
|
14
13
|
CardQuery,
|
|
15
14
|
JSONEncoder,
|
|
16
15
|
QueryParams,
|
|
@@ -21,8 +20,8 @@ from cuenca_validations.types import (
|
|
|
21
20
|
get_state_name,
|
|
22
21
|
)
|
|
23
22
|
from cuenca_validations.types.enums import (
|
|
24
|
-
Country,
|
|
25
23
|
EcommerceIndicator,
|
|
24
|
+
Profession,
|
|
26
25
|
SessionType,
|
|
27
26
|
State,
|
|
28
27
|
)
|
|
@@ -303,60 +302,42 @@ def test_saving_update_request():
|
|
|
303
302
|
SavingUpdateRequest(**data)
|
|
304
303
|
|
|
305
304
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
street='varsovia',
|
|
320
|
-
ext_number='36',
|
|
321
|
-
state=State.DF,
|
|
322
|
-
country=Country.MX,
|
|
305
|
+
@freeze_time('2022-01-01')
|
|
306
|
+
def test_user_request():
|
|
307
|
+
request = dict(
|
|
308
|
+
curp='ABCD920604HDFSRN03',
|
|
309
|
+
profession=Profession.empleado,
|
|
310
|
+
address=dict(
|
|
311
|
+
street='calle 1',
|
|
312
|
+
ext_number='2',
|
|
313
|
+
int_number='3',
|
|
314
|
+
postal_code_id='PC2ygq9j2bS9-9tsuVawzErA',
|
|
315
|
+
),
|
|
316
|
+
phone_verification_id='VE12345678',
|
|
317
|
+
email_verification_id='VE0987654321',
|
|
323
318
|
)
|
|
324
|
-
assert
|
|
319
|
+
assert UserRequest(**request).model_dump() == request
|
|
325
320
|
|
|
326
321
|
|
|
327
322
|
@freeze_time('2022-01-01')
|
|
328
|
-
def
|
|
323
|
+
def test_user_request_underage():
|
|
329
324
|
request = dict(
|
|
330
|
-
|
|
331
|
-
curp='ABCD920604HDFSRN03',
|
|
332
|
-
phone_number='+525555555555',
|
|
333
|
-
email_address='email@email.com',
|
|
325
|
+
curp='ABCD060604HDFSRN03', # underage CURP
|
|
334
326
|
profession='worker',
|
|
335
|
-
status='active',
|
|
336
327
|
address=dict(
|
|
337
328
|
street='calle 1',
|
|
338
329
|
ext_number='2',
|
|
339
330
|
int_number='3',
|
|
340
|
-
|
|
341
|
-
postal_code='09900',
|
|
342
|
-
state=State.DF.value,
|
|
343
|
-
country=Country.MX,
|
|
344
|
-
city='Obrera',
|
|
345
|
-
full_name=None,
|
|
331
|
+
postal_code_id='PC2ygq9j2bS9-9tsuVawzErA',
|
|
346
332
|
),
|
|
347
333
|
phone_verification_id='VE12345678',
|
|
348
334
|
email_verification_id='VE0987654321',
|
|
349
|
-
required_level=3,
|
|
350
|
-
terms_of_service=None,
|
|
351
|
-
signature=None,
|
|
352
335
|
)
|
|
353
|
-
assert UserRequest(**request).model_dump() == request
|
|
354
336
|
|
|
355
|
-
# changing curp so user is underage
|
|
356
|
-
request['curp'] = 'ABCD060604HDFSRN03'
|
|
357
337
|
with pytest.raises(ValueError) as v:
|
|
358
338
|
UserRequest(**request)
|
|
359
|
-
|
|
339
|
+
|
|
340
|
+
assert 'User does not meet age requirement.' in str(v)
|
|
360
341
|
|
|
361
342
|
|
|
362
343
|
@freeze_time('2022-01-01')
|
|
@@ -438,7 +419,7 @@ def test_user_update_request():
|
|
|
438
419
|
birth_date=dt.date(2020, 1, 1).isoformat(),
|
|
439
420
|
phone_number='+525555555555',
|
|
440
421
|
user_relationship='brother',
|
|
441
|
-
percentage=
|
|
422
|
+
percentage=100,
|
|
442
423
|
),
|
|
443
424
|
]
|
|
444
425
|
assert UserUpdateRequest(**request)
|
|
@@ -449,12 +430,21 @@ def test_user_update_request():
|
|
|
449
430
|
birth_date=dt.date(2020, 1, 1).isoformat(),
|
|
450
431
|
phone_number='+525555555555',
|
|
451
432
|
user_relationship='brother',
|
|
452
|
-
percentage=
|
|
433
|
+
percentage=50,
|
|
434
|
+
),
|
|
435
|
+
dict(
|
|
436
|
+
name='José Pérez',
|
|
437
|
+
birth_date=dt.date(2020, 1, 2).isoformat(),
|
|
438
|
+
phone_number='+525544444444',
|
|
439
|
+
user_relationship='brother',
|
|
440
|
+
percentage=51,
|
|
453
441
|
),
|
|
454
442
|
]
|
|
455
|
-
with pytest.raises(
|
|
443
|
+
with pytest.raises(ValidationError) as v:
|
|
456
444
|
UserUpdateRequest(**request)
|
|
457
|
-
|
|
445
|
+
|
|
446
|
+
assert 'The total percentage should be 100%' in str(v)
|
|
447
|
+
request.pop('beneficiaries')
|
|
458
448
|
|
|
459
449
|
tos_request = dict(
|
|
460
450
|
terms_of_service=dict(
|
|
@@ -485,12 +475,6 @@ def test_user_update_request():
|
|
|
485
475
|
)
|
|
486
476
|
UserUpdateRequest(**kyc_request)
|
|
487
477
|
|
|
488
|
-
# chagning to invalid request
|
|
489
|
-
tos_request['terms_of_service']['ip'] = 'not valid ip'
|
|
490
|
-
with pytest.raises(ValueError) as v:
|
|
491
|
-
UserUpdateRequest(**tos_request)
|
|
492
|
-
assert 'not valid ip' in str(v.value)
|
|
493
|
-
|
|
494
478
|
|
|
495
479
|
def test_session_request():
|
|
496
480
|
data = dict(
|
|
@@ -522,7 +506,6 @@ def test_email_verification_request():
|
|
|
522
506
|
data = dict(
|
|
523
507
|
recipient='mail@cuenca.com',
|
|
524
508
|
type='email_verification',
|
|
525
|
-
platform_id='PL01',
|
|
526
509
|
)
|
|
527
510
|
with pytest.raises(ValidationError):
|
|
528
511
|
VerificationRequest(**data)
|
|
@@ -534,7 +517,6 @@ def test_phone_verification_request():
|
|
|
534
517
|
data = dict(
|
|
535
518
|
recipient='+525555555555',
|
|
536
519
|
type='phone_verification',
|
|
537
|
-
platform_id='PL01',
|
|
538
520
|
)
|
|
539
521
|
with pytest.raises(ValidationError):
|
|
540
522
|
VerificationRequest(**data)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '2.1.9.dev1'
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/__init__.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/card_bins.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/errors.py
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/card.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/files.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/general.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/types/helpers.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/typing.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.9.dev1 → cuenca_validations-2.1.9.dev2}/cuenca_validations/validators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|