Skip to content

Commit 22207bb

Browse files
gmorales96gabino
andauthored
Feature/userlistsrequest add optional rfc (#369)
* Add RFC support to UserListsRequest validation * Release version 2.1.3 * Add validation for names and surnames in UserListsRequest * Add string constraints to UserListsRequest names and surnames * Refactor UserListsRequest with NonEmptyStr type --------- Co-authored-by: gabino <gabino@cuenca.com>
1 parent 70f4fcb commit 22207bb

4 files changed

Lines changed: 92 additions & 12 deletions

File tree

cuenca_validations/types/general.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
IPvAnyAddress, PlainSerializer(str, return_type=str)
2323
]
2424

25+
NonEmptyStr = Annotated[
26+
str, StringConstraints(strip_whitespace=True, min_length=1)
27+
]
28+
2529

2630
class SantizedDict(dict):
2731
def __init__(self, *args, **kwargs):

cuenca_validations/types/requests.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
)
5656
from .general import (
5757
LogConfig,
58+
NonEmptyStr,
5859
SerializableAnyUrl,
5960
SerializableHttpUrl,
6061
SerializableIPvAnyAddress,
@@ -631,25 +632,43 @@ class BankAccountValidationRequest(BaseModel):
631632

632633
class UserListsRequest(BaseModel):
633634
curp: Optional[Curp] = Field(None, description='Curp to review on lists')
635+
rfc: Optional[Rfc] = Field(None, description='Rfc to review on lists')
634636
account_number: Optional[Union[Clabe, PaymentCardNumber]] = Field(
635637
None, description='Account to review on lists'
636638
)
637-
names: Optional[str] = Field(
639+
names: Optional[NonEmptyStr] = Field(
638640
None, description='Names of the user to review on lists'
639641
)
640-
first_surname: Optional[str] = Field(
641-
None, description='first_surname of the user to review on lists'
642+
first_surname: Optional[NonEmptyStr] = Field(
643+
None, description='First surname of the user to review on lists'
642644
)
643-
second_surname: Optional[str] = Field(
644-
None, description='second_surname of the user to review on lists'
645+
second_surname: Optional[NonEmptyStr] = Field(
646+
None, description='Second surname of the user to review on lists'
645647
)
646648

647649
@model_validator(mode='before')
648650
@classmethod
649651
def check_request(cls, values):
652+
if (
653+
values.get('first_surname') or values.get('second_surname')
654+
) and not values.get('names'):
655+
raise ValueError(
656+
'names is required when first_surname or second_surname '
657+
'is provided'
658+
)
659+
660+
if values.get('names') and not values.get('first_surname'):
661+
raise ValueError(
662+
'first_surname is required when names is provided'
663+
)
664+
650665
has_name = all(values.get(f) for f in ['names', 'first_surname'])
651-
curp, account = values.get('curp'), values.get('account_number')
652-
if not any([curp, account, has_name]):
666+
curp, account, rfc = (
667+
values.get('curp'),
668+
values.get('account_number'),
669+
values.get('rfc'),
670+
)
671+
if not any([curp, account, rfc, has_name]):
653672
raise ValueError("At least 1 param is required")
654673
return values
655674

@@ -658,6 +677,7 @@ def check_request(cls, values):
658677
json_schema_extra={
659678
'example': {
660679
'curp': 'GOCG650418HVZNML08',
680+
'rfc': 'GOCG650418TJ1',
661681
'account_number': '9203929392939292392',
662682
'names': 'Pedrito',
663683
'first_surname': 'Sola',

cuenca_validations/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.1.2'
1+
__version__ = '2.1.3'

tests/test_types.py

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,10 +564,66 @@ def test_bank_account_validation_clabe_request():
564564
assert BankAccountValidationRequest(account_number='646180157098510917')
565565

566566

567-
def test_user_lists_request():
568-
UserListsRequest(names='Pedro', first_surname='Paramo')
569-
with pytest.raises(ValueError):
570-
UserListsRequest()
567+
@pytest.mark.parametrize(
568+
'input_data',
569+
[
570+
{'names': 'Pedro', 'first_surname': 'Paramo'},
571+
{'curp': 'GOCG650418HVZNML08'},
572+
{'rfc': 'GOCG650418TJ1'},
573+
{'account_number': '646180157034181180'},
574+
{
575+
'curp': 'GOCG650418HVZNML08',
576+
'rfc': 'GOCG650418TJ1',
577+
'names': 'Pedro',
578+
'first_surname': 'Paramo',
579+
},
580+
],
581+
)
582+
def test_user_lists_request_valid_params(input_data):
583+
UserListsRequest(**input_data)
584+
585+
586+
@pytest.mark.parametrize(
587+
'input_data,expected_error',
588+
[
589+
(
590+
{'first_surname': 'Paramo'},
591+
(
592+
'names is required when first_surname or second_surname '
593+
'is provided'
594+
),
595+
),
596+
(
597+
{'second_surname': 'Paramo'},
598+
(
599+
'names is required when first_surname or second_surname '
600+
'is provided'
601+
),
602+
),
603+
(
604+
{'first_surname': 'Paramo', 'second_surname': 'Paramo'},
605+
(
606+
'names is required when first_surname or second_surname '
607+
'is provided'
608+
),
609+
),
610+
(
611+
{'names': 'Juan'},
612+
'first_surname is required when names is provided',
613+
),
614+
(
615+
{'first_surname': 'Paramo', 'curp': 'GOCG650418HVZNML08'},
616+
(
617+
'names is required when first_surname or second_surname '
618+
'is provided'
619+
),
620+
),
621+
({}, 'At least 1 param is required'),
622+
],
623+
)
624+
def test_user_lists_request_invalid_params(input_data, expected_error):
625+
with pytest.raises(ValueError, match=expected_error):
626+
UserListsRequest(**input_data)
571627

572628

573629
class IntModel(BaseModel):

0 commit comments

Comments
 (0)