diff --git a/cuenca_validations/types/general.py b/cuenca_validations/types/general.py index 17b1f1e8..aff7af58 100644 --- a/cuenca_validations/types/general.py +++ b/cuenca_validations/types/general.py @@ -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): diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 7141876c..f1638c5b 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -55,6 +55,7 @@ ) from .general import ( LogConfig, + NonEmptyStr, SerializableAnyUrl, SerializableHttpUrl, SerializableIPvAnyAddress, @@ -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 @@ -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', diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index f8115612..2d31b1c3 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.2' +__version__ = '2.1.3' diff --git a/tests/test_types.py b/tests/test_types.py index 64d6f36a..37922f44 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -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):