Skip to content

Commit 4f33b94

Browse files
authored
Create BaseURLSession (#12)
* ignore .venv * Create BaseURLSession * Remove unused import * Add test
1 parent c5a325b commit 4f33b94

File tree

5 files changed

+59
-42
lines changed

5 files changed

+59
-42
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ __pycache__/
44
*.egg-info
55

66
# Virtual environments
7-
venv
7+
venv
8+
.venv/

santander_sdk/api_client/base.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from urllib.parse import urljoin
2+
3+
from requests import Session
4+
5+
6+
class BaseURLSession(Session):
7+
def __init__(self, base_url):
8+
self.base_url = base_url
9+
super().__init__()
10+
11+
def prepare_request(self, request):
12+
request.url = urljoin(self.base_url, request.url)
13+
return super().prepare_request(request)

santander_sdk/api_client/client.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
from datetime import datetime, timedelta
21
import logging
3-
from urllib.parse import urljoin
2+
from datetime import datetime, timedelta
3+
44
import requests
55

6+
from santander_sdk.api_client.base import BaseURLSession
67
from santander_sdk.api_client.workspaces import get_first_workspace_id_of_type
78

8-
from .helpers import get_status_code_description, try_parse_response_to_json
9-
109
from .abstract_client import SantanderAbstractApiClient
1110
from .client_configuration import SantanderClientConfiguration
1211
from .exceptions import (
13-
SantanderRequestException,
1412
SantanderClientException,
13+
SantanderRequestException,
1514
SantanderWorkspaceException,
1615
)
16+
from .helpers import get_status_code_description, try_parse_response_to_json
1717

1818
BEFORE_EXPIRE_TOKEN_SECONDS = timedelta(seconds=60)
1919
TOKEN_ENDPOINT = "/auth/oauth/v2/token"
@@ -44,9 +44,8 @@ class SantanderApiClient(SantanderAbstractApiClient):
4444
"""
4545

4646
def __init__(self, config: SantanderClientConfiguration):
47-
self.base_url = config.base_url.rstrip("/")
4847
self.config = config
49-
self.session = requests.Session()
48+
self.session = BaseURLSession(base_url=config.base_url)
5049
self.token = None
5150
self.token_expires_at = datetime.now()
5251

@@ -108,7 +107,6 @@ def _authenticate(self) -> None:
108107
self.session.cert = self.config.cert # pyright: ignore
109108

110109
def _request_token(self) -> dict:
111-
url = urljoin(self.base_url, TOKEN_ENDPOINT)
112110
headers = {"Content-Type": "application/x-www-form-urlencoded"}
113111
data = {
114112
"client_id": self.config.client_id,
@@ -117,7 +115,7 @@ def _request_token(self) -> dict:
117115
}
118116
try:
119117
response = self.session.post(
120-
url,
118+
TOKEN_ENDPOINT,
121119
data=data,
122120
headers=headers,
123121
verify=True,
@@ -135,13 +133,13 @@ def _request_token(self) -> dict:
135133
return token_data
136134

137135
def _prepare_url(self, endpoint: str) -> str:
138-
url = urljoin(self.base_url, endpoint).lower()
139-
140-
if ":workspaceid" in url:
136+
endpoint = endpoint.lower()
137+
if ":workspaceid" in endpoint:
141138
if not self.config.workspace_id:
142139
raise SantanderClientException("ID da workspace não configurado")
143-
url = url.replace(":workspaceid", self.config.workspace_id)
144-
return url
140+
endpoint = endpoint.replace(":workspaceid", self.config.workspace_id)
141+
142+
return endpoint
145143

146144
def _request(
147145
self,

tests/test_client.py

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
from datetime import datetime, timedelta
21
import unittest
2+
from datetime import datetime, timedelta
3+
from decimal import Decimal as D
34
from unittest.mock import patch
4-
from urllib.parse import urljoin
55

6-
from santander_sdk.api_client.client import TOKEN_ENDPOINT, SantanderApiClient
7-
from santander_sdk.api_client.client_configuration import (
8-
SantanderClientConfiguration,
9-
)
10-
from santander_sdk.api_client.exceptions import SantanderClientException
11-
from decimal import Decimal as D
126
from mock.santander_mocker import (
137
SANTANDER_URL,
14-
get_dict_token_response,
15-
get_dict_token_request,
168
get_dict_payment_pix_request,
179
get_dict_payment_pix_response,
10+
get_dict_token_request,
11+
get_dict_token_response,
1812
)
13+
14+
from santander_sdk.api_client.client import TOKEN_ENDPOINT, SantanderApiClient
15+
from santander_sdk.api_client.client_configuration import (
16+
SantanderClientConfiguration,
17+
)
18+
from santander_sdk.api_client.exceptions import SantanderClientException
1919
from santander_sdk.types import OrderStatus
2020

2121

@@ -93,7 +93,7 @@ def test_request_token(self, mock_post):
9393

9494
token_data = self.client._request_token()
9595
mock_post.assert_called_once_with(
96-
urljoin(SANTANDER_URL, TOKEN_ENDPOINT),
96+
TOKEN_ENDPOINT,
9797
data=self.token_request_mock,
9898
verify=True,
9999
timeout=60,
@@ -119,42 +119,35 @@ def test_request(self, mock_ensure_requirements, mock_request):
119119
mock_request.return_value.json.return_value = response_dict
120120

121121
# GET (Não precisa de data)
122-
response_data = self.client._request("GET", "test_endpoint")
122+
response_data = self.client._request("GET", "/test_endpoint")
123123
assert response_data == response_dict, (
124124
"Deveria ter retornado o dict de resposta"
125125
)
126126
mock_request.assert_called_once_with(
127-
"GET", f"{SANTANDER_URL}/test_endpoint", json=None, params=None, timeout=60
127+
"GET", "/test_endpoint", json=None, params=None, timeout=60
128128
)
129129

130130
# Post (Precisa de data)
131131
mock_request.reset_mock()
132-
response_data = self.client._request("POST", "test_endpoint", data=request_dict)
132+
response_data = self.client._request(
133+
"POST", "/test_endpoint", data=request_dict
134+
)
133135
assert response_data == response_dict, (
134136
"Deveria ter retornado o dict de resposta"
135137
)
136138
mock_request.assert_called_once_with(
137139
"POST",
138-
f"{SANTANDER_URL}/test_endpoint",
140+
"/test_endpoint",
139141
json=request_dict,
140142
params=None,
141143
timeout=60,
142144
)
143145

144146
def test_prepare_url(self):
145147
self.client.config.workspace_id = "d6c7b8a9e"
146-
assert (
147-
self.client._prepare_url("test_endpoint/qr")
148-
== f"{SANTANDER_URL}/test_endpoint/qr"
149-
)
150-
assert (
151-
self.client._prepare_url("test/:WORKSPACEID")
152-
== f"{SANTANDER_URL}/test/d6c7b8a9e"
153-
)
154-
assert (
155-
self.client._prepare_url(":workspaceid/pix")
156-
== f"{SANTANDER_URL}/d6c7b8a9e/pix"
157-
)
148+
assert self.client._prepare_url("test_endpoint/qr") == "test_endpoint/qr"
149+
assert self.client._prepare_url("test/:WORKSPACEID") == "test/d6c7b8a9e"
150+
assert self.client._prepare_url(":workspaceid/pix") == "d6c7b8a9e/pix"
158151
self.client.config.workspace_id = ""
159152
with self.assertRaises(SantanderClientException):
160153
self.client._prepare_url("test_endpoint/:workspaceid")

tests/test_session.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from requests import Request
2+
3+
from santander_sdk.api_client.base import BaseURLSession
4+
5+
6+
def test_base_url_session_prepare_request():
7+
session = BaseURLSession("https://api.santander.com.br")
8+
9+
req = Request("GET", "/orders")
10+
req = session.prepare_request(req)
11+
12+
assert req.url == "https://api.santander.com.br/orders"

0 commit comments

Comments
 (0)