diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index 4fbd542b..d9efe5cb 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -91,6 +91,7 @@ 'TransferNetwork', 'TransferQuery', 'TransferRequest', + 'UpdateTransferRequest', 'UserCardNotification', 'UserCredentialRequest', 'UserCredentialUpdateRequest', @@ -243,6 +244,7 @@ StrictTransferRequest, TOSRequest, TransferRequest, + UpdateTransferRequest, UserCredentialRequest, UserCredentialUpdateRequest, UserListsRequest, diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 93c215b6..67f0cf84 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -45,6 +45,7 @@ State, TermsOfService, TrackDataMethod, + TransactionStatus, TransactionTokenValidationStatus, UserCardNotification, UserStatus, @@ -154,6 +155,20 @@ class StrictTransferRequest(BaseTransferRequest): ) +class UpdateTransferRequest(BaseRequest): + status: TransactionStatus + + @field_validator('status') + @classmethod + def validate_status(cls, status: TransactionStatus) -> TransactionStatus: + if status not in ( + TransactionStatus.succeeded, + TransactionStatus.failed, + ): + raise ValueError('status must be succeeded or failed') + return status + + class CardUpdateRequest(BaseRequest): status: Optional[CardStatus] = None pin_block: Optional[str] = None diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 2d93b16b..0433f6dd 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.32' +__version__ = '2.1.35' diff --git a/tests/test_requests.py b/tests/test_requests.py index cd6a950b..aba93592 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -5,6 +5,7 @@ from cuenca_validations.types.enums import VerificationType from cuenca_validations.types.requests import ( PasswordResetRequest, + UpdateTransferRequest, UserTOSAgreementRequest, UserUpdateRequest, VerificationRequest, @@ -94,3 +95,31 @@ def test_user_update_request_normalizes_email() -> None: def test_user_update_request_normalizes_phone() -> None: req = UserUpdateRequest(phone_number=PhoneNumber('+116504401222')) assert req.phone_number == '+16504401222' + + +@pytest.mark.parametrize('status', ['succeeded', 'failed']) +def test_update_transfer_request_valid_status(status: str) -> None: + req = UpdateTransferRequest.model_validate({'status': status}) + assert req.status == status + assert req.model_dump() == {'status': status} + + +@pytest.mark.parametrize('status', ['created', 'submitted', 'in_review']) +def test_update_transfer_request_invalid_status(status: str) -> None: + with pytest.raises(ValidationError) as ex: + UpdateTransferRequest.model_validate({'status': status}) + assert 'status' in str(ex.value) + + +def test_update_transfer_request_missing_status() -> None: + with pytest.raises(ValidationError) as ex: + UpdateTransferRequest.model_validate({}) + assert 'status' in str(ex.value) + + +def test_update_transfer_request_forbids_extra() -> None: + with pytest.raises(ValidationError) as ex: + UpdateTransferRequest.model_validate( + {'status': 'succeeded', 'foo': 'bar'} + ) + assert 'Extra inputs are not permitted' in str(ex.value)