diff --git a/src/constants.py b/src/constants.py new file mode 100644 index 00000000..a3b78c48 --- /dev/null +++ b/src/constants.py @@ -0,0 +1,4 @@ +REQUEST_TIMEOUT = 100 +CONNECTION_TIMEOUT = 30 +BASE_URL = 'https://graph.microsoft.com/v1.0' +SDK_VERSION = 'graph-python-0.0.1' diff --git a/src/core/http_client_factory.py b/src/core/http_client_factory.py new file mode 100644 index 00000000..552b267b --- /dev/null +++ b/src/core/http_client_factory.py @@ -0,0 +1,45 @@ +from requests import Session + +from requests_middleware import MiddlewareHTTPAdapter + +from src.constants import BASE_URL, SDK_VERSION + + +class HTTPClientFactory: + @classmethod + def with_graph_middlewares(cls, middlewares): + return _HTTPClient(middlewares=middlewares) + + +class _HTTPClient(Session): + def __init__(self, **kwargs): + super(_HTTPClient, self).__init__() + self.headers.update({'sdkVersion': SDK_VERSION}) + self._base_url = BASE_URL + + adapter = MiddlewareHTTPAdapter(kwargs.get('middlewares')) + self.mount('https://', adapter) + + def get(self, url, **kwargs): + request_url = self._get_url(url) + super(_HTTPClient, self).get(request_url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + request_url = self._get_url(url) + super(_HTTPClient, self).post(request_url, data=None, json=None, **kwargs) + + def put(self, url, data=None, **kwargs): + request_url = self._get_url(url) + super(_HTTPClient, self).put(request_url, data=None, **kwargs) + + def patch(self, url, data=None, **kwargs): + request_url = self._get_url(url) + super(_HTTPClient, self).patch(request_url, data=None, **kwargs) + + def delete(self, url, **kwargs): + request_url = self._get_url(url) + super(_HTTPClient, self).delete(request_url, **kwargs) + + def _get_url(self, url): + return self._base_url+url if (url[0] == '/') else url + diff --git a/tests/test.py b/tests/test.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/test_http_client.py b/tests/test_http_client.py new file mode 100644 index 00000000..e806653e --- /dev/null +++ b/tests/test_http_client.py @@ -0,0 +1,44 @@ +from unittest import TestCase + +from requests import Session +import responses + +from src.core.http_client_factory import _HTTPClient +from src.constants import BASE_URL, SDK_VERSION + + +class HTTPClientTest(TestCase): + def setUp(self) -> None: + self.requests = _HTTPClient() + + def tearDown(self) -> None: + self.requests = None + + def test_creates_instance_of_session(self): + self.assertIsInstance(self.requests, Session) + + def test_has_graph_url_as_base_url(self): + self.assertEqual(self.requests._base_url, BASE_URL) + + def test_has_sdk_version_header(self): + self.assertEqual(self.requests.headers.get('sdkVersion'), SDK_VERSION) + + @responses.activate + def test_builds_graph_urls(self): + graph_url = BASE_URL+'/me' + responses.add(responses.GET, graph_url, status=200) + + self.requests.get('/me') + request_url = responses.calls[0].request.url + + self.assertEqual(graph_url, request_url) + + @responses.activate + def test_does_not_build_graph_urls_for_full_urls(self): + other_url = 'https://microsoft.com/' + responses.add(responses.GET, other_url, status=200) + + self.requests.get(other_url) + request_url = responses.calls[0].request.url + + self.assertEqual(other_url, request_url) diff --git a/tests/test_http_client_factory.py b/tests/test_http_client_factory.py new file mode 100644 index 00000000..95488256 --- /dev/null +++ b/tests/test_http_client_factory.py @@ -0,0 +1,24 @@ +from unittest import TestCase + +from requests_middleware import BaseMiddleware, MiddlewareHTTPAdapter + +from src.core.http_client_factory import HTTPClientFactory + + +class HTTPClientFactoryTest(TestCase): + def test_initialized_with_middlewares(self): + middlewares = [ + BaseMiddleware() + ] + + requests = HTTPClientFactory.with_graph_middlewares(middlewares) + mocked_middleware = requests.get_adapter('https://') + + self.assertIsInstance(mocked_middleware, MiddlewareHTTPAdapter) + + def test_created_with_authentication_provider(self): + """ + TODO: Implement create with authentication provider + :return: + """ + pass