cuenca 0.15.8.dev2__tar.gz → 0.15.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/PKG-INFO +1 -1
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/http/client.py +23 -23
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/jwt.py +1 -1
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/user_logins.py +2 -2
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/version.py +1 -1
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca.egg-info/PKG-INFO +1 -1
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca.egg-info/SOURCES.txt +1 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/conftest.py +11 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_login_tokens.py +2 -2
- cuenca-0.15.9/tests/resources/test_user_lists_validation.py +20 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_user_logins.py +3 -3
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/LICENSE +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/README.md +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/__init__.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/exc.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/http/__init__.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/py.typed +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/__init__.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/accounts.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/api_keys.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/arpc.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/balance_entries.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/base.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/bill_payments.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/card_activations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/card_transactions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/card_validations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/cards.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/cash_references.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/clabes.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/commissions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/curp_validations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/deposits.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/endpoints.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/file_batches.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/files.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/identities.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/identity_events.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/kyc_validations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/kyc_verifications.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/limited_wallets.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/login_tokens.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/platforms.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/resources.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/savings.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/service_providers.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/sessions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/statements.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/transfers.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/user_credentials.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/user_events.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/user_lists_validation.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/users.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/verifications.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/wallet_transactions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/webhooks.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca/resources/whatsapp_transfers.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca.egg-info/dependency_links.txt +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca.egg-info/requires.txt +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/cuenca.egg-info/top_level.txt +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/setup.cfg +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/setup.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/__init__.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/http/__init__.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/http/conftest.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/http/test_client.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/__init__.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_accounts.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_api_keys.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_arpc.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_balance_entries.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_bill_payments.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_card_activations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_card_transactions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_card_validations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_cards.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_cash_references.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_clabes.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_commissions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_curp_validations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_deposits.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_endpoints.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_file_batches.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_files.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_identities.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_identity_events.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_kyc_validations.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_kyc_verifications.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_limited_wallets.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_platforms.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_resources.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_savings.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_service_providers.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_sessions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_statements.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_transfers.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_user_credentials.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_user_events.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_users.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_verifications.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_wallet_transactions.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_webhooks.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/resources/test_whatsapp_transfers.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/test_cuenca.py +0 -0
- {cuenca-0.15.8.dev2 → cuenca-0.15.9}/tests/test_jwt.py +0 -0
|
@@ -24,18 +24,15 @@ SANDBOX_HOST = 'sandbox.cuenca.com'
|
|
|
24
24
|
class Session:
|
|
25
25
|
|
|
26
26
|
host: str = API_HOST
|
|
27
|
+
headers: DictStrAny = {}
|
|
27
28
|
basic_auth: Tuple[str, str]
|
|
28
29
|
jwt_token: Optional[Jwt] = None
|
|
29
|
-
session: requests.Session
|
|
30
30
|
|
|
31
31
|
def __init__(self):
|
|
32
|
-
self.
|
|
33
|
-
|
|
34
|
-
{
|
|
35
|
-
|
|
36
|
-
'User-Agent': f'cuenca-python/{CLIENT_VERSION}',
|
|
37
|
-
}
|
|
38
|
-
)
|
|
32
|
+
self.headers = {
|
|
33
|
+
'X-Cuenca-Api-Version': API_VERSION,
|
|
34
|
+
'User-Agent': f'cuenca-python/{CLIENT_VERSION}',
|
|
35
|
+
}
|
|
39
36
|
|
|
40
37
|
# basic auth
|
|
41
38
|
api_key = os.getenv('CUENCA_API_KEY', '')
|
|
@@ -75,10 +72,10 @@ class Session:
|
|
|
75
72
|
self.jwt_token = Jwt.create(self)
|
|
76
73
|
|
|
77
74
|
if login_token:
|
|
78
|
-
self.
|
|
75
|
+
self.headers['X-Cuenca-LoginToken'] = login_token
|
|
79
76
|
|
|
80
77
|
if session_token:
|
|
81
|
-
self.
|
|
78
|
+
self.headers['X-Cuenca-SessionId'] = session_token
|
|
82
79
|
|
|
83
80
|
def get(
|
|
84
81
|
self, endpoint: str, params: ClientRequestParams = None
|
|
@@ -105,19 +102,22 @@ class Session:
|
|
|
105
102
|
data: OptionalDict = None,
|
|
106
103
|
**kwargs,
|
|
107
104
|
) -> bytes:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
105
|
+
resp = None
|
|
106
|
+
with requests.Session() as session:
|
|
107
|
+
session.headers = self.headers # type: ignore
|
|
108
|
+
if self.jwt_token:
|
|
109
|
+
if self.jwt_token.is_expired:
|
|
110
|
+
self.jwt_token = Jwt.create(self)
|
|
111
|
+
self.headers['X-Cuenca-Token'] = self.jwt_token.token
|
|
112
|
+
session.headers = self.headers # type: ignore
|
|
113
|
+
resp = session.request( # type: ignore
|
|
114
|
+
method=method,
|
|
115
|
+
url='https://' + self.host + urljoin('/', endpoint),
|
|
116
|
+
auth=self.auth,
|
|
117
|
+
json=json.loads(JSONEncoder().encode(data)),
|
|
118
|
+
params=params,
|
|
119
|
+
**kwargs,
|
|
120
|
+
)
|
|
121
121
|
self._check_response(resp)
|
|
122
122
|
return resp.content
|
|
123
123
|
|
|
@@ -42,7 +42,7 @@ class Jwt(BaseModel):
|
|
|
42
42
|
@classmethod
|
|
43
43
|
def create(cls, session: 'Session') -> 'Jwt':
|
|
44
44
|
session.jwt_token = None
|
|
45
|
-
session.
|
|
45
|
+
session.headers.pop('X-Cuenca-Token', None)
|
|
46
46
|
token = session.post('/token', dict())['token']
|
|
47
47
|
expires_at = Jwt.get_expiration_date(token)
|
|
48
48
|
return cls(expires_at=expires_at, token=token)
|
|
@@ -33,7 +33,7 @@ class UserLogin(Creatable):
|
|
|
33
33
|
req = UserLoginRequest(password=password, user_id=user_id)
|
|
34
34
|
login = cast('UserLogin', cls._create(session=session, **req.dict()))
|
|
35
35
|
if login.success:
|
|
36
|
-
session.
|
|
36
|
+
session.headers['X-Cuenca-LoginId'] = login.id
|
|
37
37
|
return login
|
|
38
38
|
|
|
39
39
|
@classmethod
|
|
@@ -43,4 +43,4 @@ class UserLogin(Creatable):
|
|
|
43
43
|
# Using user_id vs user_login_id to avoid needing to store
|
|
44
44
|
# user_login_id or perform a query to fetch it
|
|
45
45
|
session.delete(f'{cls._resource}/{user_id}', dict())
|
|
46
|
-
session.
|
|
46
|
+
session.headers.pop('X-Cuenca-LoginId', None)
|
|
@@ -95,6 +95,7 @@ tests/resources/test_statements.py
|
|
|
95
95
|
tests/resources/test_transfers.py
|
|
96
96
|
tests/resources/test_user_credentials.py
|
|
97
97
|
tests/resources/test_user_events.py
|
|
98
|
+
tests/resources/test_user_lists_validation.py
|
|
98
99
|
tests/resources/test_user_logins.py
|
|
99
100
|
tests/resources/test_users.py
|
|
100
101
|
tests/resources/test_verifications.py
|
|
@@ -63,6 +63,17 @@ def user_request() -> Dict:
|
|
|
63
63
|
return user_dict
|
|
64
64
|
|
|
65
65
|
|
|
66
|
+
@pytest.fixture
|
|
67
|
+
def user_lists_request() -> Dict:
|
|
68
|
+
user_dict = dict(
|
|
69
|
+
curp='LOHJ660606HDFPRS02',
|
|
70
|
+
names='Alejandro',
|
|
71
|
+
first_surname='Martinez',
|
|
72
|
+
second_surname='Viquez',
|
|
73
|
+
)
|
|
74
|
+
return user_dict
|
|
75
|
+
|
|
76
|
+
|
|
66
77
|
@pytest.fixture
|
|
67
78
|
def file() -> BytesIO:
|
|
68
79
|
with open('tests/data/test_file.jpeg', 'rb') as image_file:
|
|
@@ -4,7 +4,7 @@ from cuenca import LoginToken, Transfer, UserLogin
|
|
|
4
4
|
from cuenca.http.client import Session
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
@pytest.fixture
|
|
7
|
+
@pytest.fixture(scope='function')
|
|
8
8
|
def session():
|
|
9
9
|
session = Session()
|
|
10
10
|
session.configure(
|
|
@@ -19,6 +19,6 @@ def session():
|
|
|
19
19
|
def test_login_token(session):
|
|
20
20
|
UserLogin.create('222222', session=session)
|
|
21
21
|
login_token = LoginToken.create(session=session)
|
|
22
|
-
session.
|
|
22
|
+
session.headers.pop('X-Cuenca-LoginId')
|
|
23
23
|
session.configure(login_token=login_token.id)
|
|
24
24
|
Transfer.count(session=session)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from cuenca_validations.types import VerificationStatus
|
|
3
|
+
|
|
4
|
+
from cuenca.exc import CuencaResponseException
|
|
5
|
+
from cuenca.resources import UserListsValidation
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@pytest.mark.vcr
|
|
9
|
+
def test_create_user_validation(user_lists_request):
|
|
10
|
+
user_validation = UserListsValidation.create(**user_lists_request)
|
|
11
|
+
assert user_validation.status == VerificationStatus.succeeded
|
|
12
|
+
assert user_validation.id
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@pytest.mark.vcr
|
|
16
|
+
def test_create_user_validation_invalid_inputs():
|
|
17
|
+
with pytest.raises(CuencaResponseException) as exc:
|
|
18
|
+
UserListsValidation.create(**dict())
|
|
19
|
+
assert exc.status_code == 403
|
|
20
|
+
assert exc.json['error'] == 'There is an error with the inputs'
|
|
@@ -21,7 +21,7 @@ def test_valid_login(session: Session):
|
|
|
21
21
|
assert login.success
|
|
22
22
|
assert login.last_login_at is not None
|
|
23
23
|
assert login.id is not None
|
|
24
|
-
assert session.
|
|
24
|
+
assert session.headers['X-Cuenca-LoginId'] == login.id
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
@pytest.mark.vcr
|
|
@@ -30,11 +30,11 @@ def test_invalid_login(session: Session):
|
|
|
30
30
|
assert not login.success
|
|
31
31
|
assert login.last_login_at is None
|
|
32
32
|
assert login.id is not None
|
|
33
|
-
assert 'X-Cuenca-LoginId' not in session.
|
|
33
|
+
assert 'X-Cuenca-LoginId' not in session.headers
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
@pytest.mark.vcr
|
|
37
37
|
def test_logout(session: Session):
|
|
38
38
|
UserLogin.create('222222', session=session)
|
|
39
39
|
UserLogin.logout(session=session)
|
|
40
|
-
assert 'X-Cuenca-LoginId' not in session.
|
|
40
|
+
assert 'X-Cuenca-LoginId' not in session.headers
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|