Skip to content

Commit 784a11f

Browse files
committed
add test for api_config
1 parent 7fb9f10 commit 784a11f

File tree

4 files changed

+101
-17
lines changed

4 files changed

+101
-17
lines changed

nasdaqdatalink/api_config.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ApiConfig:
1717
retry_status_codes = [429] + list(range(500, 512))
1818
verify_ssl = True
1919

20-
def read_key(self, filename):
20+
def read_key(self, filename=None):
2121
if not os.path.isfile(filename):
2222
raise_empty_file(filename)
2323

@@ -117,8 +117,11 @@ def read_key(filename=None):
117117

118118

119119
def get_config_from_kwargs(kwargs):
120-
params = getattr(kwargs, "params", None)
121-
result = getattr(params, "api_config", None)
122-
if result is None:
123-
result = ApiConfig
120+
result = ApiConfig
121+
if isinstance(kwargs, dict):
122+
params = kwargs.get('params')
123+
if isinstance(params, dict):
124+
result = params.get('api_config')
125+
if not isinstance(result, ApiConfig):
126+
result = ApiConfig
124127
return result

nasdaqdatalink/model/authorized_session.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,26 @@
1010
import urllib
1111

1212

13-
def get_retries(api_config):
14-
if isinstance(api_config, ApiConfig):
15-
if not api_config.use_retries:
16-
return Retry(total=0)
17-
18-
Retry.BACKOFF_MAX = api_config.max_wait_between_retries
19-
retries = Retry(total=api_config.number_of_retries,
20-
connect=api_config.number_of_retries,
21-
read=api_config.number_of_retries,
22-
status_forcelist=api_config.retry_status_codes,
23-
backoff_factor=api_config.retry_backoff_factor,
24-
raise_on_status=False)
13+
def get_retries(api_config=ApiConfig):
14+
retries = None
15+
if not api_config.use_retries:
16+
return Retry(total=0)
17+
18+
Retry.BACKOFF_MAX = api_config.max_wait_between_retries
19+
retries = Retry(total=api_config.number_of_retries,
20+
connect=api_config.number_of_retries,
21+
read=api_config.number_of_retries,
22+
status_forcelist=api_config.retry_status_codes,
23+
backoff_factor=api_config.retry_backoff_factor,
24+
raise_on_status=False)
2525
return retries
2626

2727

2828
class AuthorizedSession:
2929
def __init__(self, api_config=ApiConfig) -> None:
3030
super(AuthorizedSession, self).__init__()
31+
if not isinstance(api_config, ApiConfig):
32+
api_config = ApiConfig
3133
self._api_config = api_config
3234
self._auth_session = requests.Session()
3335
retries = get_retries(self._api_config)

test/test_api_config.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,58 @@ def test_read_key_from_file_with_tab(self):
132132
def test_read_key_from_file_with_multi_newline(self):
133133
given = "keyfordefaultfile\n\nanotherkey\n"
134134
self._read_key_from_file_helper(given, TEST_DEFAULT_FILE_CONTENTS)
135+
136+
def test_default_instance_will_have_share_values_with_singleton(self):
137+
os.environ['NASDAQ_DATA_LINK_API_KEY'] = 'setinenv'
138+
ApiConfig.api_key = None
139+
read_key()
140+
api_config = ApiConfig()
141+
self.assertEqual(api_config.api_key, "setinenv")
142+
# make sure change in instance will not affect the singleton
143+
api_config.api_key = None
144+
self.assertEqual(ApiConfig.api_key, "setinenv")
145+
146+
def test_get_config_from_kwargs_return_api_config_if_present(self):
147+
api_config = get_config_from_kwargs({
148+
'params': {
149+
'api_config': ApiConfig()
150+
}
151+
})
152+
self.assertTrue(isinstance(api_config, ApiConfig))
153+
154+
def test_get_config_from_kwargs_return_singleton_if_not_present_or_wrong_type(self):
155+
api_config = get_config_from_kwargs(None)
156+
self.assertTrue(issubclass(api_config, ApiConfig))
157+
self.assertFalse(isinstance(api_config, ApiConfig))
158+
api_config = get_config_from_kwargs(1)
159+
self.assertTrue(issubclass(api_config, ApiConfig))
160+
self.assertFalse(isinstance(api_config, ApiConfig))
161+
api_config = get_config_from_kwargs({
162+
'params': None
163+
})
164+
self.assertTrue(issubclass(api_config, ApiConfig))
165+
self.assertFalse(isinstance(api_config, ApiConfig))
166+
167+
def test_instance_read_key_should_raise_error(self):
168+
api_config = ApiConfig()
169+
with self.assertRaises(TypeError):
170+
api_config.read_key(None)
171+
with self.assertRaises(ValueError):
172+
api_config.read_key('')
173+
174+
def test_instance_read_key_should_raise_error_when_empty(self):
175+
save_key("", TEST_KEY_FILE)
176+
api_config = ApiConfig()
177+
with self.assertRaises(ValueError):
178+
# read empty file
179+
api_config.read_key(TEST_KEY_FILE)
180+
181+
def test_instance_read_the_right_key(self):
182+
expected_key = 'ilovepython'
183+
save_key(expected_key, TEST_KEY_FILE)
184+
api_config = ApiConfig()
185+
api_config.api_key = ''
186+
api_config.read_key(TEST_KEY_FILE)
187+
self.assertEqual(ApiConfig.api_key, expected_key)
188+
189+

test/test_authorized_session.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from unittest import TestCase
2+
from unittest.mock import patch
3+
4+
from nasdaqdatalink.model.authorized_session import AuthorizedSession
5+
from nasdaqdatalink.api_config import ApiConfig
6+
from requests.sessions import Session
7+
from requests.adapters import HTTPAdapter
8+
9+
10+
class AuthorizedSessionTest(TestCase):
11+
def test_authorized_session_assign_correct_internal_config(self):
12+
authed_session = AuthorizedSession()
13+
self.assertTrue(issubclass(authed_session._api_config, ApiConfig))
14+
authed_session = AuthorizedSession(None)
15+
self.assertTrue(issubclass(authed_session._api_config, ApiConfig))
16+
api_config = ApiConfig()
17+
authed_session = AuthorizedSession(api_config)
18+
self.assertTrue(isinstance(authed_session._api_config, ApiConfig))
19+
20+
def test_authorized_session_pass_created_session(self):
21+
authed_session = AuthorizedSession()
22+
self.assertTrue(isinstance(authed_session._auth_session, Session))
23+
adapter = authed_session._auth_session.get_adapter(ApiConfig.api_protocol)
24+
self.assertTrue(isinstance(adapter, HTTPAdapter))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy