Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cuenca_validations/types/general.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
IPvAnyAddress, PlainSerializer(str, return_type=str)
]

NonEmptyStr = Annotated[
str, StringConstraints(strip_whitespace=True, min_length=1)
]


class SantizedDict(dict):
def __init__(self, *args, **kwargs):
Expand Down
34 changes: 27 additions & 7 deletions cuenca_validations/types/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
)
from .general import (
LogConfig,
NonEmptyStr,
SerializableAnyUrl,
SerializableHttpUrl,
SerializableIPvAnyAddress,
Expand Down Expand Up @@ -631,25 +632,43 @@ class BankAccountValidationRequest(BaseModel):

class UserListsRequest(BaseModel):
curp: Optional[Curp] = Field(None, description='Curp to review on lists')
rfc: Optional[Rfc] = Field(None, description='Rfc to review on lists')
account_number: Optional[Union[Clabe, PaymentCardNumber]] = Field(
None, description='Account to review on lists'
)
names: Optional[str] = Field(
names: Optional[NonEmptyStr] = Field(
None, description='Names of the user to review on lists'
)
first_surname: Optional[str] = Field(
None, description='first_surname of the user to review on lists'
first_surname: Optional[NonEmptyStr] = Field(
None, description='First surname of the user to review on lists'
)
second_surname: Optional[str] = Field(
None, description='second_surname of the user to review on lists'
second_surname: Optional[NonEmptyStr] = Field(
None, description='Second surname of the user to review on lists'
)

@model_validator(mode='before')
@classmethod
def check_request(cls, values):
if (
values.get('first_surname') or values.get('second_surname')
) and not values.get('names'):
raise ValueError(
'names is required when first_surname or second_surname '
'is provided'
)

if values.get('names') and not values.get('first_surname'):
raise ValueError(
'first_surname is required when names is provided'
)

has_name = all(values.get(f) for f in ['names', 'first_surname'])
curp, account = values.get('curp'), values.get('account_number')
if not any([curp, account, has_name]):
curp, account, rfc = (
values.get('curp'),
values.get('account_number'),
values.get('rfc'),
)
if not any([curp, account, rfc, has_name]):
raise ValueError("At least 1 param is required")
return values

Expand All @@ -658,6 +677,7 @@ def check_request(cls, values):
json_schema_extra={
'example': {
'curp': 'GOCG650418HVZNML08',
'rfc': 'GOCG650418TJ1',
'account_number': '9203929392939292392',
'names': 'Pedrito',
'first_surname': 'Sola',
Expand Down
2 changes: 1 addition & 1 deletion cuenca_validations/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '2.1.2'
__version__ = '2.1.3'
64 changes: 60 additions & 4 deletions tests/test_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -564,10 +564,66 @@ def test_bank_account_validation_clabe_request():
assert BankAccountValidationRequest(account_number='646180157098510917')


def test_user_lists_request():
UserListsRequest(names='Pedro', first_surname='Paramo')
with pytest.raises(ValueError):
UserListsRequest()
@pytest.mark.parametrize(
'input_data',
[
{'names': 'Pedro', 'first_surname': 'Paramo'},
{'curp': 'GOCG650418HVZNML08'},
{'rfc': 'GOCG650418TJ1'},
{'account_number': '646180157034181180'},
{
'curp': 'GOCG650418HVZNML08',
'rfc': 'GOCG650418TJ1',
'names': 'Pedro',
'first_surname': 'Paramo',
},
],
)
def test_user_lists_request_valid_params(input_data):
UserListsRequest(**input_data)


@pytest.mark.parametrize(
'input_data,expected_error',
[
(
{'first_surname': 'Paramo'},
(
'names is required when first_surname or second_surname '
'is provided'
),
),
(
{'second_surname': 'Paramo'},
(
'names is required when first_surname or second_surname '
'is provided'
),
),
(
{'first_surname': 'Paramo', 'second_surname': 'Paramo'},
(
'names is required when first_surname or second_surname '
'is provided'
),
),
(
{'names': 'Juan'},
'first_surname is required when names is provided',
),
(
{'first_surname': 'Paramo', 'curp': 'GOCG650418HVZNML08'},
(
'names is required when first_surname or second_surname '
'is provided'
),
),
({}, 'At least 1 param is required'),
],
)
def test_user_lists_request_invalid_params(input_data, expected_error):
with pytest.raises(ValueError, match=expected_error):
UserListsRequest(**input_data)


class IntModel(BaseModel):
Expand Down
Loading