From bb0db4569f55f728a771bb6e46a6cafadec6cc50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Wed, 6 Oct 2021 18:24:04 -0500 Subject: [PATCH 01/15] New models for fraud_validations --- cuenca/resources/fraud_validations.py | 28 ++++++++++++++++ .../transaction_token_validations.py | 33 +++++++++++++++++++ cuenca/resources/user_pld_risk_levels.py | 28 ++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 cuenca/resources/fraud_validations.py create mode 100644 cuenca/resources/transaction_token_validations.py create mode 100644 cuenca/resources/user_pld_risk_levels.py diff --git a/cuenca/resources/fraud_validations.py b/cuenca/resources/fraud_validations.py new file mode 100644 index 00000000..2ae58e0e --- /dev/null +++ b/cuenca/resources/fraud_validations.py @@ -0,0 +1,28 @@ +import datetime as dt +from typing import ClassVar, Optional, cast + +from cuenca_validations.types.enums import CardFraudType +from cuenca_validations.types.requests import ChargeRequest +from pydantic.dataclasses import dataclass + +from cuenca.resources.base import Creatable, Retrievable + +from ..http import Session, session as global_session + + +@dataclass +class FraudValidation(Retrievable, Creatable): + _resource: ClassVar = 'fraud_validations' + + created_at: dt.datetime + updated_at: dt.datetime + request: ChargeRequest + result: Optional[CardFraudType] + + @classmethod + def create( + cls, request: ChargeRequest, *, session: Session = global_session + ) -> 'FraudValidation': + return cast( + 'FraudValidation', cls._create(session=session, **request.dict()) + ) diff --git a/cuenca/resources/transaction_token_validations.py b/cuenca/resources/transaction_token_validations.py new file mode 100644 index 00000000..3a9c1ad4 --- /dev/null +++ b/cuenca/resources/transaction_token_validations.py @@ -0,0 +1,33 @@ +import datetime as dt +from typing import ClassVar, cast + +from cuenca_validations.types.enums import TransactionTokenValidationStatus +from cuenca_validations.types.requests import ( + TransactionTokenValidationUpdateRequest, +) +from pydantic.dataclasses import dataclass + +from cuenca.resources.base import Retrievable, Updateable + +from ..http import Session, session as global_session + + +@dataclass +class TransactionTokenValidation(Retrievable, Updateable): + _resource: ClassVar = 'transaction_token_validations' + + created_at: dt.datetime + deactivated_at: dt.datetime + status: TransactionTokenValidationStatus + + @classmethod + def update( + cls, + id: str, + status: TransactionTokenValidationStatus, + *, + session: Session = global_session, + ) -> 'TransactionTokenValidation': + req = TransactionTokenValidationUpdateRequest(status=status) + resp = cls._update(id, session=session, **req.dict()) + return cast('TransactionTokenValidation', resp) diff --git a/cuenca/resources/user_pld_risk_levels.py b/cuenca/resources/user_pld_risk_levels.py new file mode 100644 index 00000000..a7f6b80c --- /dev/null +++ b/cuenca/resources/user_pld_risk_levels.py @@ -0,0 +1,28 @@ +import datetime as dt +from typing import ClassVar, cast + +from cuenca_validations.types.requests import UserPldRiskLevelRequest +from pydantic.dataclasses import dataclass + +from cuenca.resources.base import Creatable, Retrievable + +from ..http import Session, session as global_session + + +@dataclass +class UserPldRiskLevel(Retrievable, Creatable): + _resource: ClassVar = 'user_pld_risk_levels' + + created_at: dt.datetime + updated_at: dt.datetime + level: float + is_user_defined: bool + + @classmethod + def create( + cls, user_id: str, level: float, *, session: Session = global_session + ) -> 'UserPldRiskLevel': + req = UserPldRiskLevelRequest(user_id=user_id, level=level) + return cast( + 'UserPldRiskLevel', cls._create(session=session, **req.dict()) + ) From 4dd64433838e9b1af7140310d313ac128bc29dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Thu, 21 Oct 2021 17:39:47 -0500 Subject: [PATCH 02/15] test --- cuenca/resources/__init__.py | 9 ++ cuenca/resources/fraud_validations.py | 37 ++++++- .../test_create_fraud_validation.yaml | 61 ++++++++++ .../test_create_user_pld_risk_level.yaml | 52 +++++++++ .../test_retrieve_fraud_validation.yaml | 50 +++++++++ ...retrieve_transaction_token_validation.yaml | 100 +++++++++++++++++ ...t_update_transaction_token_validation.yaml | 104 ++++++++++++++++++ tests/resources/test_fraud_validations.py | 63 +++++++++++ .../test_transaction_token_validations.py | 22 ++++ tests/resources/test_user_pld_risk_levels.py | 10 ++ 10 files changed, 506 insertions(+), 2 deletions(-) create mode 100644 tests/resources/cassettes/test_create_fraud_validation.yaml create mode 100644 tests/resources/cassettes/test_create_user_pld_risk_level.yaml create mode 100644 tests/resources/cassettes/test_retrieve_fraud_validation.yaml create mode 100644 tests/resources/cassettes/test_retrieve_transaction_token_validation.yaml create mode 100644 tests/resources/cassettes/test_update_transaction_token_validation.yaml create mode 100644 tests/resources/test_fraud_validations.py create mode 100644 tests/resources/test_transaction_token_validations.py create mode 100644 tests/resources/test_user_pld_risk_levels.py diff --git a/cuenca/resources/__init__.py b/cuenca/resources/__init__.py index 1f4fb481..f29b6806 100644 --- a/cuenca/resources/__init__.py +++ b/cuenca/resources/__init__.py @@ -10,12 +10,15 @@ 'CardValidation', 'Commission', 'Deposit', + 'FraudValidation', 'LoginToken', 'Saving', 'ServiceProvider', 'Statement', + 'TransactionTokenValidation', 'Transfer', 'UserLogin', + 'UserPldRiskLevel', 'WalletTransaction', 'WhatsappTransfer', ] @@ -31,14 +34,17 @@ from .cards import Card from .commissions import Commission from .deposits import Deposit +from .fraud_validations import FraudValidation from .login_tokens import LoginToken from .resources import RESOURCES from .savings import Saving from .service_providers import ServiceProvider from .statements import Statement +from .transaction_token_validations import TransactionTokenValidation from .transfers import Transfer from .user_credentials import UserCredential from .user_logins import UserLogin +from .user_pld_risk_levels import UserPldRiskLevel from .wallet_transactions import WalletTransaction from .whatsapp_transfers import WhatsappTransfer @@ -55,13 +61,16 @@ CardValidation, Commission, Deposit, + FraudValidation, LoginToken, Saving, ServiceProvider, Statement, + TransactionTokenValidation, Transfer, UserCredential, UserLogin, + UserPldRiskLevel, WalletTransaction, WhatsappTransfer, ] diff --git a/cuenca/resources/fraud_validations.py b/cuenca/resources/fraud_validations.py index 2ae58e0e..6d1d224f 100644 --- a/cuenca/resources/fraud_validations.py +++ b/cuenca/resources/fraud_validations.py @@ -1,7 +1,17 @@ import datetime as dt from typing import ClassVar, Optional, cast -from cuenca_validations.types.enums import CardFraudType +from cuenca_validations.types.enums import ( + AuthorizerTransaction, + CardFraudType, + CardholderVerificationMethod, + CardStatus, + CardType, + EcommerceIndicator, + IssuerNetwork, + PosCapability, + TrackDataMethod, +) from cuenca_validations.types.requests import ChargeRequest from pydantic.dataclasses import dataclass @@ -14,10 +24,33 @@ class FraudValidation(Retrievable, Creatable): _resource: ClassVar = 'fraud_validations' + id: str created_at: dt.datetime updated_at: dt.datetime - request: ChargeRequest + card_id: str + user_id: str + amount: int + merchant_name: str + merchant_type: str + merchant_data: str + currency_code: str + prosa_transaction_id: str + retrieval_reference: str + card_type: CardType + card_status: CardStatus + transaction_type: AuthorizerTransaction + authorizer_number: Optional[str] + track_data_method: TrackDataMethod + pos_capability: PosCapability + logical_network: Optional[str] + atm_fee: Optional[int] + issuer: IssuerNetwork + cardholder_verification_method: CardholderVerificationMethod + ecommerce_indicator: EcommerceIndicator + token_validation_id: Optional[str] result: Optional[CardFraudType] + is_cvv: bool = False + get_balance: bool = False @classmethod def create( diff --git a/tests/resources/cassettes/test_create_fraud_validation.yaml b/tests/resources/cassettes/test_create_fraud_validation.yaml new file mode 100644 index 00000000..37144657 --- /dev/null +++ b/tests/resources/cassettes/test_create_fraud_validation.yaml @@ -0,0 +1,61 @@ +interactions: +- request: + body: '{"card_id": "CA1234567890", "user_id": "US1234", "amount": 123, "merchant_name": + "AMAZON MX MARKETPLACE MEXICO DF 000MX", "merchant_type": "wtype", "merchant_data": + "0279288357 00012558", "currency_code": "458", "prosa_transaction_id": + "12345", "retrieval_reference": "who ks", "card_type": "virtual", "card_status": + "active", "transaction_type": "normal_purchase", "authorizer_number": "1231223123", + "track_data_method": "terminal", "pos_capability": "pin_accepted", "logical_network": + null, "is_cvv": true, "get_balance": false, "atm_fee": null, "issuer": "Mastercard", + "cardholder_verification_method": "signature", "ecommerce_indicator": "0"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + Content-Length: + - '657' + Content-Type: + - application/json + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + method: POST + uri: https://sandbox.cuenca.com/fraud_validations + response: + body: + string: '{"id":"FVDnqqjjbXQ92OvY6g0Jf9nQ","created_at":"2021-10-21T20:20:58.240300","updated_at":"2021-10-21T20:20:58.240307","card_id":"CA1234567890","user_id":"US1234","amount":123,"merchant_name":"AMAZON + MX MARKETPLACE MEXICO DF 000MX","merchant_type":"wtype","merchant_data":"0279288357 00012558","currency_code":"458","prosa_transaction_id":"12345","retrieval_reference":"who + ks","card_type":"virtual","card_status":"active","transaction_type":"normal_purchase","authorizer_number":"1231223123","track_data_method":"terminal","pos_capability":"pin_accepted","logical_network":null,"is_cvv":true,"get_balance":false,"atm_fee":null,"issuer":"Mastercard","cardholder_verification_method":"signature","ecommerce_indicator":"0","token_validation_id":null,"result":null}' + headers: + Connection: + - keep-alive + Content-Length: + - '771' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 20:20:58 GMT + X-Request-Time: + - 'value: 0.563' + x-amz-apigw-id: + - HkzCkG_uCYcF2yg= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '771' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 20:20:58 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - 9a30606c-f5e3-4406-aa00-ddac3137c3bf + status: + code: 201 + message: Created +version: 1 diff --git a/tests/resources/cassettes/test_create_user_pld_risk_level.yaml b/tests/resources/cassettes/test_create_user_pld_risk_level.yaml new file mode 100644 index 00000000..9cd7a37e --- /dev/null +++ b/tests/resources/cassettes/test_create_user_pld_risk_level.yaml @@ -0,0 +1,52 @@ +interactions: +- request: + body: '{"user_id": "US6D1wbTEdLuTjf227iF05js", "level": 0.7}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + Content-Length: + - '53' + Content-Type: + - application/json + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + method: POST + uri: https://sandbox.cuenca.com/user_pld_risk_levels + response: + body: + string: '{"id":"US6D1wbTEdLuTjf227iF05js","created_at":"2021-10-21T22:20:30.516179","updated_at":"2021-10-21T22:20:30.516191","level":"0.7","is_user_defined":true}' + headers: + Connection: + - keep-alive + Content-Length: + - '154' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 22:20:30 GMT + X-Request-Time: + - 'value: 0.450' + x-amz-apigw-id: + - HlEjOFkZiYcF2iw= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '154' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 22:20:30 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - 0a21550f-54d1-4608-b4e6-7e5a32e10754 + status: + code: 201 + message: Created +version: 1 diff --git a/tests/resources/cassettes/test_retrieve_fraud_validation.yaml b/tests/resources/cassettes/test_retrieve_fraud_validation.yaml new file mode 100644 index 00000000..87321956 --- /dev/null +++ b/tests/resources/cassettes/test_retrieve_fraud_validation.yaml @@ -0,0 +1,50 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + method: GET + uri: https://sandbox.cuenca.com/fraud_validations/FVDnqqjjbXQ92OvY6g0Jf9nQ + response: + body: + string: '{"id":"FVDnqqjjbXQ92OvY6g0Jf9nQ","created_at":"2021-10-21T20:20:58.240000","updated_at":"2021-10-21T20:20:58.240000","card_id":"CA1234567890","user_id":"US1234","amount":123,"merchant_name":"AMAZON + MX MARKETPLACE MEXICO DF 000MX","merchant_type":"wtype","merchant_data":"0279288357 00012558","currency_code":"458","prosa_transaction_id":"12345","retrieval_reference":"who + ks","card_type":"virtual","card_status":"active","transaction_type":"normal_purchase","authorizer_number":"1231223123","track_data_method":"terminal","pos_capability":"pin_accepted","logical_network":null,"is_cvv":true,"get_balance":false,"atm_fee":null,"issuer":"Mastercard","cardholder_verification_method":"signature","ecommerce_indicator":"0","token_validation_id":null,"result":"authorize"}' + headers: + Connection: + - keep-alive + Content-Length: + - '778' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 21:45:35 GMT + X-Request-Time: + - 'value: 0.245' + x-amz-apigw-id: + - Hk_b2Fe6CYcFbhg= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '778' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 21:45:35 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - 632daa8a-074e-48ed-9bb0-a7de3e553a90 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/resources/cassettes/test_retrieve_transaction_token_validation.yaml b/tests/resources/cassettes/test_retrieve_transaction_token_validation.yaml new file mode 100644 index 00000000..5c9ac37f --- /dev/null +++ b/tests/resources/cassettes/test_retrieve_transaction_token_validation.yaml @@ -0,0 +1,100 @@ +interactions: +- request: + body: '{"password": "111111"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + Content-Length: + - '22' + Content-Type: + - application/json + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + method: POST + uri: https://sandbox.cuenca.com/user_logins + response: + body: + string: '{"success":true,"id":"ULI3ZmawLoSxKDaD-fRIeHQg","last_login_at":"2021-10-21T22:04:06.612000Z"}' + headers: + Connection: + - keep-alive + Content-Length: + - '94' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 22:17:33 GMT + X-Request-Time: + - 'value: 0.388' + x-amz-apigw-id: + - HlEHhGFrCYcF-VQ= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '94' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 22:17:33 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - 862cefa9-a206-4e0d-9767-15b55f48632a + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + X-Cuenca-LoginId: + - ULI3ZmawLoSxKDaD-fRIeHQg + method: GET + uri: https://sandbox.cuenca.com/transaction_token_validations/TKSEZmmXa-SXuAMv6516sRKw + response: + body: + string: '{"id":"TKSEZmmXa-SXuAMv6516sRKw","user_id":"US6D1wbTEdLuTjf227iF05js","created_at":"2021-10-21T21:55:11.914000","updated_at":"2021-10-21T22:17:38.717414","deactivated_at":"2021-10-22T21:55:11.914000","status":"pending"}' + headers: + Connection: + - keep-alive + Content-Length: + - '219' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 22:17:38 GMT + X-Request-Time: + - 'value: 5.297' + x-amz-apigw-id: + - HlEHoF1JCYcF2iw= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '219' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 22:17:38 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - 8741073a-4d0a-4525-9b19-7b2d2513895e + status: + code: 200 + message: OK +version: 1 diff --git a/tests/resources/cassettes/test_update_transaction_token_validation.yaml b/tests/resources/cassettes/test_update_transaction_token_validation.yaml new file mode 100644 index 00000000..f0792446 --- /dev/null +++ b/tests/resources/cassettes/test_update_transaction_token_validation.yaml @@ -0,0 +1,104 @@ +interactions: +- request: + body: '{"password": "111111"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + Content-Length: + - '22' + Content-Type: + - application/json + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + method: POST + uri: https://sandbox.cuenca.com/user_logins + response: + body: + string: '{"success":true,"id":"ULZkAGFZtfR7u2aKVJjC5pdw","last_login_at":"2021-10-21T22:17:33.133000Z"}' + headers: + Connection: + - keep-alive + Content-Length: + - '94' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 22:18:51 GMT + X-Request-Time: + - 'value: 0.476' + x-amz-apigw-id: + - HlETzF-xCYcFZTA= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '94' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 22:18:51 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - 4543679f-af05-498a-a8a9-e96426bbabcd + status: + code: 201 + message: Created +- request: + body: '{"status": "accepted"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + Content-Length: + - '22' + Content-Type: + - application/json + User-Agent: + - cuenca-python/0.7.12 + X-Cuenca-Api-Version: + - '2020-03-19' + X-Cuenca-LoginId: + - ULZkAGFZtfR7u2aKVJjC5pdw + method: PATCH + uri: https://sandbox.cuenca.com/transaction_token_validations/TKSEZmmXa-SXuAMv6516sRKw + response: + body: + string: '{"id":"TKSEZmmXa-SXuAMv6516sRKw","user_id":"US6D1wbTEdLuTjf227iF05js","created_at":"2021-10-21T21:55:11.914000","updated_at":"2021-10-21T22:18:52.325236","deactivated_at":"2021-10-22T22:18:52.325502","status":"accepted"}' + headers: + Connection: + - keep-alive + Content-Length: + - '220' + Content-Type: + - application/json + Date: + - Thu, 21 Oct 2021 22:18:52 GMT + X-Request-Time: + - 'value: 0.425' + x-amz-apigw-id: + - HlET5HkCiYcFWUw= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '220' + x-amzn-Remapped-Date: + - Thu, 21 Oct 2021 22:18:52 GMT + x-amzn-Remapped-Server: + - nginx/1.20.1 + x-amzn-RequestId: + - abbfb22e-70cc-4504-aa5f-23b9a72a7786 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/resources/test_fraud_validations.py b/tests/resources/test_fraud_validations.py new file mode 100644 index 00000000..b77d258e --- /dev/null +++ b/tests/resources/test_fraud_validations.py @@ -0,0 +1,63 @@ +from typing import Dict + +import pytest +from cuenca_validations.types.enums import ( + AuthorizerTransaction, + CardFraudType, + CardholderVerificationMethod, + CardStatus, + CardType, + EcommerceIndicator, + IssuerNetwork, + PosCapability, + TrackDataMethod, +) +from cuenca_validations.types.requests import ChargeRequest + +from cuenca.resources import FraudValidation + + +@pytest.fixture +def fraud_validation_data() -> Dict: + return dict( + card_id='CA1234567890', + user_id='US1234', + amount=123, + merchant_name='AMAZON MX MARKETPLACE MEXICO DF 000MX', + merchant_type='wtype', + merchant_data='0279288357 00012558', + currency_code='458', + prosa_transaction_id='12345', + retrieval_reference='who ks', + card_type=CardType.virtual, + card_status=CardStatus.active, + transaction_type=AuthorizerTransaction.normal_purchase, + authorizer_number='1231223123', + track_data_method=TrackDataMethod.terminal, + pos_capability=PosCapability.pin_accepted, + is_cvv=True, + issuer=IssuerNetwork.mastercard, + cardholder_verification_method=CardholderVerificationMethod.signature, + ecommerce_indicator=EcommerceIndicator.not_ecommerce, + ) + + +@pytest.mark.vcr +def test_create_fraud_validation(fraud_validation_data: Dict): + charge_request = ChargeRequest(**fraud_validation_data) + fraud_validation = FraudValidation.create(charge_request) + assert all( + getattr(fraud_validation, key) == value + for key, value in fraud_validation_data.items() + ) + assert fraud_validation.id + + +@pytest.mark.vcr +def test_retrieve_fraud_validation(fraud_validation_data): + fraud_validation = FraudValidation.retrieve('FVDnqqjjbXQ92OvY6g0Jf9nQ') + assert all( + getattr(fraud_validation, key) == value + for key, value in fraud_validation_data.items() + ) + assert fraud_validation.result is CardFraudType.authorize diff --git a/tests/resources/test_transaction_token_validations.py b/tests/resources/test_transaction_token_validations.py new file mode 100644 index 00000000..bd9c01cf --- /dev/null +++ b/tests/resources/test_transaction_token_validations.py @@ -0,0 +1,22 @@ +import pytest +from cuenca_validations.types.enums import TransactionTokenValidationStatus + +from cuenca.resources import TransactionTokenValidation, UserLogin + + +@pytest.mark.vcr +def test_retrieve_transaction_token_validation() -> None: + UserLogin.create(password='111111') + token: TransactionTokenValidation = TransactionTokenValidation.retrieve( + 'TKSEZmmXa-SXuAMv6516sRKw' + ) + assert token.status is TransactionTokenValidationStatus.pending + + +@pytest.mark.vcr +def test_update_transaction_token_validation() -> None: + UserLogin.create(password='111111') + token = TransactionTokenValidation.update( + 'TKSEZmmXa-SXuAMv6516sRKw', TransactionTokenValidationStatus.accepted + ) + assert token.status is TransactionTokenValidationStatus.accepted diff --git a/tests/resources/test_user_pld_risk_levels.py b/tests/resources/test_user_pld_risk_levels.py new file mode 100644 index 00000000..7abca585 --- /dev/null +++ b/tests/resources/test_user_pld_risk_levels.py @@ -0,0 +1,10 @@ +import pytest + +from cuenca.resources import UserPldRiskLevel + + +@pytest.mark.vcr +def test_create_user_pld_risk_level() -> None: + risk = UserPldRiskLevel.create('US6D1wbTEdLuTjf227iF05js', 0.7) + assert risk.level == 0.7 + assert risk.is_user_defined From 46fb1f54ecb196e7c53bd35716ca40e4361ed6fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Thu, 21 Oct 2021 18:01:06 -0500 Subject: [PATCH 03/15] mypy --- tests/resources/test_transaction_token_validations.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/resources/test_transaction_token_validations.py b/tests/resources/test_transaction_token_validations.py index bd9c01cf..7d943e18 100644 --- a/tests/resources/test_transaction_token_validations.py +++ b/tests/resources/test_transaction_token_validations.py @@ -7,10 +7,8 @@ @pytest.mark.vcr def test_retrieve_transaction_token_validation() -> None: UserLogin.create(password='111111') - token: TransactionTokenValidation = TransactionTokenValidation.retrieve( - 'TKSEZmmXa-SXuAMv6516sRKw' - ) - assert token.status is TransactionTokenValidationStatus.pending + t = TransactionTokenValidation.retrieve('TKSEZmmXa-SXuAMv6516sRKw') + assert t.status is TransactionTokenValidationStatus.pending # type: ignore @pytest.mark.vcr From 869a2eab2ffd6db36e3969bf3bc4acfa447c974c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Thu, 21 Oct 2021 18:19:48 -0500 Subject: [PATCH 04/15] Version --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 529befce..b8cded61 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.13' +__version__ = '0.7.14.dev0' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From ef59fde96a477126c61a010fb0ad590f0e7d7a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 22 Oct 2021 13:43:24 -0500 Subject: [PATCH 05/15] Add new resources to init --- cuenca/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cuenca/__init__.py b/cuenca/__init__.py index 64842c51..60847359 100644 --- a/cuenca/__init__.py +++ b/cuenca/__init__.py @@ -11,13 +11,16 @@ 'CardValidation', 'Commission', 'Deposit', + 'FraudValidation', 'LoginToken', 'Saving', 'ServiceProvider', 'Statement', + 'TransactionTokenValidation', 'Transfer', 'UserCredential', 'UserLogin', + 'UserPldRiskLevel', 'WalletTransaction', 'WhatsappTransfer', 'configure', @@ -48,6 +51,9 @@ UserLogin, WalletTransaction, WhatsappTransfer, + FraudValidation, + TransactionTokenValidation, + UserPldRiskLevel ) from .version import __version__ From d9159bbce1e58a0cdee55630f9b25ef4e07518c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 22 Oct 2021 13:43:40 -0500 Subject: [PATCH 06/15] version --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index b8cded61..bb2807a1 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev0' +__version__ = '0.7.14.dev1' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From ba6de4169fe73ec3748f6aaacd3b76a65329a1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 22 Oct 2021 13:45:05 -0500 Subject: [PATCH 07/15] Lint --- cuenca/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cuenca/__init__.py b/cuenca/__init__.py index 60847359..2bd7eb12 100644 --- a/cuenca/__init__.py +++ b/cuenca/__init__.py @@ -42,18 +42,18 @@ CardValidation, Commission, Deposit, + FraudValidation, LoginToken, Saving, ServiceProvider, Statement, + TransactionTokenValidation, Transfer, UserCredential, UserLogin, + UserPldRiskLevel, WalletTransaction, WhatsappTransfer, - FraudValidation, - TransactionTokenValidation, - UserPldRiskLevel ) from .version import __version__ From 51b8394b07dd400adcfb3c08c50e80efdc6ba52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Tue, 26 Oct 2021 17:51:51 -0500 Subject: [PATCH 08/15] Use FraudValidationRequest --- cuenca/resources/fraud_validations.py | 7 +++++-- cuenca/version.py | 2 +- tests/resources/test_fraud_validations.py | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cuenca/resources/fraud_validations.py b/cuenca/resources/fraud_validations.py index 6d1d224f..03622feb 100644 --- a/cuenca/resources/fraud_validations.py +++ b/cuenca/resources/fraud_validations.py @@ -12,7 +12,7 @@ PosCapability, TrackDataMethod, ) -from cuenca_validations.types.requests import ChargeRequest +from cuenca_validations.types.requests import FraudValidationRequest from pydantic.dataclasses import dataclass from cuenca.resources.base import Creatable, Retrievable @@ -54,7 +54,10 @@ class FraudValidation(Retrievable, Creatable): @classmethod def create( - cls, request: ChargeRequest, *, session: Session = global_session + cls, + request: FraudValidationRequest, + *, + session: Session = global_session, ) -> 'FraudValidation': return cast( 'FraudValidation', cls._create(session=session, **request.dict()) diff --git a/cuenca/version.py b/cuenca/version.py index bb2807a1..d48b1bd6 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev1' +__version__ = '0.7.14.dev2' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' diff --git a/tests/resources/test_fraud_validations.py b/tests/resources/test_fraud_validations.py index b77d258e..f27f166e 100644 --- a/tests/resources/test_fraud_validations.py +++ b/tests/resources/test_fraud_validations.py @@ -12,7 +12,7 @@ PosCapability, TrackDataMethod, ) -from cuenca_validations.types.requests import ChargeRequest +from cuenca_validations.types.requests import FraudValidationRequest from cuenca.resources import FraudValidation @@ -44,7 +44,7 @@ def fraud_validation_data() -> Dict: @pytest.mark.vcr def test_create_fraud_validation(fraud_validation_data: Dict): - charge_request = ChargeRequest(**fraud_validation_data) + charge_request = FraudValidationRequest(**fraud_validation_data) fraud_validation = FraudValidation.create(charge_request) assert all( getattr(fraud_validation, key) == value From 7b492d5da4a0b42089ca81fca4374c064c250303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Thu, 28 Oct 2021 16:41:00 -0500 Subject: [PATCH 09/15] Remove atm_fee and version --- cuenca/resources/fraud_validations.py | 1 - cuenca/version.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cuenca/resources/fraud_validations.py b/cuenca/resources/fraud_validations.py index 03622feb..afb1cd3b 100644 --- a/cuenca/resources/fraud_validations.py +++ b/cuenca/resources/fraud_validations.py @@ -43,7 +43,6 @@ class FraudValidation(Retrievable, Creatable): track_data_method: TrackDataMethod pos_capability: PosCapability logical_network: Optional[str] - atm_fee: Optional[int] issuer: IssuerNetwork cardholder_verification_method: CardholderVerificationMethod ecommerce_indicator: EcommerceIndicator diff --git a/cuenca/version.py b/cuenca/version.py index d48b1bd6..d29ae318 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev2' +__version__ = '0.7.14' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From fcb54c02e2bf28936d0058973e173874bbb006bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 29 Oct 2021 15:23:34 -0500 Subject: [PATCH 10/15] Remove useless data --- cuenca/resources/fraud_validations.py | 4 ---- cuenca/version.py | 2 +- tests/resources/test_fraud_validations.py | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/cuenca/resources/fraud_validations.py b/cuenca/resources/fraud_validations.py index afb1cd3b..c4edb9df 100644 --- a/cuenca/resources/fraud_validations.py +++ b/cuenca/resources/fraud_validations.py @@ -34,12 +34,9 @@ class FraudValidation(Retrievable, Creatable): merchant_type: str merchant_data: str currency_code: str - prosa_transaction_id: str - retrieval_reference: str card_type: CardType card_status: CardStatus transaction_type: AuthorizerTransaction - authorizer_number: Optional[str] track_data_method: TrackDataMethod pos_capability: PosCapability logical_network: Optional[str] @@ -49,7 +46,6 @@ class FraudValidation(Retrievable, Creatable): token_validation_id: Optional[str] result: Optional[CardFraudType] is_cvv: bool = False - get_balance: bool = False @classmethod def create( diff --git a/cuenca/version.py b/cuenca/version.py index d29ae318..17dadcfc 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14' +__version__ = '0.7.14.dev3' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' diff --git a/tests/resources/test_fraud_validations.py b/tests/resources/test_fraud_validations.py index f27f166e..9c96a3ee 100644 --- a/tests/resources/test_fraud_validations.py +++ b/tests/resources/test_fraud_validations.py @@ -27,12 +27,9 @@ def fraud_validation_data() -> Dict: merchant_type='wtype', merchant_data='0279288357 00012558', currency_code='458', - prosa_transaction_id='12345', - retrieval_reference='who ks', card_type=CardType.virtual, card_status=CardStatus.active, transaction_type=AuthorizerTransaction.normal_purchase, - authorizer_number='1231223123', track_data_method=TrackDataMethod.terminal, pos_capability=PosCapability.pin_accepted, is_cvv=True, From fff77cb2b174d7bcc2ebf66437570868e9f2d86a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 29 Oct 2021 15:37:01 -0500 Subject: [PATCH 11/15] Update cuenca-validations --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 17dadcfc..d2573208 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev3' +__version__ = '0.7.14.dev4' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From a18c24957dfb76d6b05c8865362454883da4a36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Tue, 2 Nov 2021 15:58:12 -0600 Subject: [PATCH 12/15] Add Optional fields --- cuenca/resources/fraud_validations.py | 8 ++++---- cuenca/version.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cuenca/resources/fraud_validations.py b/cuenca/resources/fraud_validations.py index c4edb9df..9627e869 100644 --- a/cuenca/resources/fraud_validations.py +++ b/cuenca/resources/fraud_validations.py @@ -27,15 +27,15 @@ class FraudValidation(Retrievable, Creatable): id: str created_at: dt.datetime updated_at: dt.datetime - card_id: str - user_id: str + card_id: Optional[str] + user_id: Optional[str] amount: int merchant_name: str merchant_type: str merchant_data: str currency_code: str - card_type: CardType - card_status: CardStatus + card_type: Optional[CardType] + card_status: Optional[CardStatus] transaction_type: AuthorizerTransaction track_data_method: TrackDataMethod pos_capability: PosCapability diff --git a/cuenca/version.py b/cuenca/version.py index d2573208..4d049b18 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev4' +__version__ = '0.7.14.dev5' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From 4a475a5ac7003a88e836c7c2b29df2e87df190b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Mon, 20 Dec 2021 16:12:32 -0600 Subject: [PATCH 13/15] version --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 4d049b18..445656d3 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev5' +__version__ = '0.7.14.dev6' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From 7108714991162519787f6f95ed8dbb72f2ebd8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 7 Jan 2022 00:08:22 -0600 Subject: [PATCH 14/15] Updating cuenca-validations --- requirements.txt | 2 +- tests/resources/test_fraud_validations.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 36905448..37839671 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.26.0 -cuenca-validations==0.9.16 +cuenca-validations==0.9.18.dev1 dataclasses>=0.7;python_version<"3.7" diff --git a/tests/resources/test_fraud_validations.py b/tests/resources/test_fraud_validations.py index 9c96a3ee..2d5d336f 100644 --- a/tests/resources/test_fraud_validations.py +++ b/tests/resources/test_fraud_validations.py @@ -20,6 +20,7 @@ @pytest.fixture def fraud_validation_data() -> Dict: return dict( + id='FVDnqqjjbXQ92OvY6g0Jf9nQ', card_id='CA1234567890', user_id='US1234', amount=123, @@ -47,7 +48,6 @@ def test_create_fraud_validation(fraud_validation_data: Dict): getattr(fraud_validation, key) == value for key, value in fraud_validation_data.items() ) - assert fraud_validation.id @pytest.mark.vcr From 152b374d15e1b26113378acf7d04899de93ef3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20S=C3=A1nchez?= Date: Fri, 7 Jan 2022 00:08:44 -0600 Subject: [PATCH 15/15] Version --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 445656d3..2d07f3b7 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.7.14.dev6' +__version__ = '0.7.14.dev7' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19'