From b955086b2dbe9caf3f96952e3b47c1eba10b0f58 Mon Sep 17 00:00:00 2001 From: Federico Delgado Date: Mon, 19 Jun 2017 00:18:20 -0700 Subject: [PATCH 1/5] - Use PR https://github.com/openx/OX3-Python-API-Client/pull/22/files to add Python 3 support. - Fix tests. --- README.md | 2 +- ox3apiclient/__init__.py | 38 ++++++------ setup.py | 1 + tests/client.py | 126 ++++++++++++++++----------------------- tests/clientfromfile.py | 2 +- 5 files changed, 75 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index ec80c88..2d879f7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A small class to help connect to the OpenX Enterprise API. As of version 0.5.0 it uses [requests_oauthlib](https://github.com/requests/requests-oauthlib) instead of oauth2. -It currently supports Python 2.6 - 2.7, with 3.x support coming in the future. +It currently supports Python 2.6 - 3.5. As of version 0.4.0, ox3apiclient supports API v2. If your instance is v2, set the api_path option to "/ox/4.0". diff --git a/ox3apiclient/__init__.py b/ox3apiclient/__init__.py index 712a67c..e6744c8 100644 --- a/ox3apiclient/__init__.py +++ b/ox3apiclient/__init__.py @@ -1,18 +1,18 @@ # -*- coding: utf-8 -*- -import ConfigParser -import cookielib +from six.moves import configparser as ConfigParser +from six.moves import http_cookiejar as cookielib import logging import mimetypes from pprint import pformat import random import json -from urlparse import parse_qs, urlparse +from six.moves.urllib.parse import parse_qs, urlparse import requests from requests_oauthlib import OAuth1 -__version__ = '0.5.2' +__version__ = '0.5.3' REQUEST_TOKEN_URL = 'https://sso.openx.com/api/index/initiate' ACCESS_TOKEN_URL = 'https://sso.openx.com/api/index/token' @@ -123,9 +123,9 @@ def log_request(self, response): self.logger.debug("%s: %s" % (k, v)) self.logger.debug('====={0:=<45}'.format('OX3 api call response body')) try: - self.logger.debug(pformat(json.loads(response.content))) + self.logger.debug(pformat(json.loads(response.text))) except ValueError: - self.logger.debug("%s" % response.content) + self.logger.debug("%s" % response.text) self.logger.debug('====={0:=<45}'.format('OX3 api call finished')) def request(self, url, method='GET', headers=None, data=None, sign=False, @@ -164,8 +164,8 @@ def fetch_request_token(self): response = self._session.post(url=self.request_token_url, auth=oauth, timeout=self.timeout) self.log_request(response) if response.status_code != 200: - raise OAuthException("OAuth token request failed (%s) %s" % (response.status_code, response.content)) - credentials = parse_qs(response.content) + raise OAuthException("OAuth token request failed (%s) %s" % (response.status_code, response.text)) + credentials = parse_qs(response.text) self._token = {'key': credentials['oauth_token'][0], 'secret': credentials['oauth_token_secret'][0]} return self._token @@ -192,10 +192,10 @@ def authorize_token(self, email=None, password=None): response = self._session.post(url=self.authorization_url, data=data, timeout=self.timeout) self.log_request(response) if response.status_code != 200: - raise OAuthException("OAuth login failed (%s) %s" % (response.status_code, response.content)) + raise OAuthException("OAuth login failed (%s) %s" % (response.status_code, response.text)) # set token verifier - self._token['verifier'] = parse_qs(response.content)['oauth_verifier'][0] + self._token['verifier'] = parse_qs(response.text)['oauth_verifier'][0] def fetch_access_token(self): """Helper method to fetch and set access token. @@ -212,8 +212,8 @@ def fetch_access_token(self): response = self._session.post(url=self.access_token_url, auth=oauth, timeout=self.timeout) self.log_request(response) if response.status_code != 200: - raise OAuthException("OAuth token verification failed (%s) %s" % (response.status_code, response.content)) - self._token = parse_qs(response.content)['oauth_token'][0] + raise OAuthException("OAuth token verification failed (%s) %s" % (response.status_code, response.text)) + self._token = parse_qs(response.text)['oauth_token'][0] return self._token def validate_session(self): @@ -244,7 +244,7 @@ def validate_session(self): if self.api_path == API_PATH_V1: response = self._session.put(url=self._resolve_url('/a/session/validate'), timeout=self.timeout) self.log_request(response) - return response.content + return response.text def logon(self, email=None, password=None): """Returns self after authentication. @@ -276,7 +276,7 @@ def logoff(self): response = self._session.delete(url=self.access_token_url, auth=oauth, timeout=self.timeout) if response.status_code != 204: - raise OAuthException("OAuth token deletion failed (%s) %s" % (response.status_code, response.content)) + raise OAuthException("OAuth token deletion failed (%s) %s" % (response.status_code, response.text)) else: raise UnknownAPIFormatError( 'Unrecognized API path: %s' % self.api_path) @@ -305,13 +305,13 @@ def _resolve_url(self, url): def _response_value(self, response): """ Utility method. Returns decoded json. If the response content cannot be decoded, then - the content is returned. + the text is returned. """ try: return response.json() except ValueError: - return response.content + return response.text def get(self, url): """Issue a GET request to the given URL or API shorthand @@ -377,7 +377,7 @@ def upload_creative(self, account_id, file_path): """ # Thanks to nosklo for his answer on SO: # http://stackoverflow.com/a/681182 - boundary = '-----------------------------' + str(int(random.random()*1e10)) + boundary = '-----------------------------' + str(int(random.random() * 1e10)) parts = [] # Set account ID part. @@ -392,7 +392,8 @@ def upload_creative(self, account_id, file_path): parts.append('Content-Type: %s' % mimetypes.guess_type(file_path)[0] or 'application/octet-stream') parts.append('') # TODO: catch errors with opening file. - parts.append(open(file_path, 'r').read()) + with open(file_path, 'r') as f: + parts.append(f.read()) parts.append('--' + boundary + '--') parts.append('') @@ -479,6 +480,7 @@ def client_from_file(file_path='.ox3rc', env=None): return client + # The exposed API has moved to using Client instead of OX3APIClient, but create # a temporary alias for backwards compatibility. OX3APIClient = Client diff --git a/setup.py b/setup.py index 323f9db..562f07b 100644 --- a/setup.py +++ b/setup.py @@ -26,6 +26,7 @@ 'Programming Language :: Python', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', 'Programming Language :: Python :: Implementation :: CPython', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Topic :: Software Development :: Libraries', diff --git a/tests/client.py b/tests/client.py index 8bf89f1..06956c8 100644 --- a/tests/client.py +++ b/tests/client.py @@ -3,7 +3,6 @@ import unittest from mock import Mock, patch import os -from contextlib import nested class TestClient(unittest.TestCase): @@ -12,7 +11,7 @@ class TestClient(unittest.TestCase): 'rheader2': 'rvalue2'} ex_resp.headers = {'header1': 'value1', 'header2': 'value2'} - ex_resp.content = 'oauth_token=key&oauth_token_secret=secret&oauth_callback_confirmed=true' + ex_resp.text = 'oauth_token=key&oauth_token_secret=secret&oauth_callback_confirmed=true' ex_resp.json.return_value = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} @@ -33,37 +32,25 @@ def setUp(self): self.api_path_v2 = '/ox/4.0' self.url = 'https://www.example.com' - with nested( - patch('ox3apiclient.requests.Session'), - patch('ox3apiclient.Client.log_request') - ) as (self.mock_requests_session, self.mock_client_log_request): - - self.mock_requests_session.return_value.get.return_value = self.ex_resp - self.mock_requests_session.return_value.post.return_value = self.ex_resp - self.mock_requests_session.return_value.put.return_value = self.ex_resp - self.mock_requests_session.return_value.options.return_value = self.ex_resp - self.mock_requests_session.return_value.delete.return_value = self.ex_resp - - self.mock_client_log_request.return_value = None - self.client = ox3apiclient.Client( - email=self.email, - password=self.password, - domain=self.domain, - realm=self.realm, - consumer_key=self.consumer_key, - consumer_secret=self.consumer_secret, - request_token_url=self.request_token_url, - access_token_url=self.access_token_url, - authorization_url=self.authorization_url) - - def test_init(self): - pass - - def test_log_request(self): - pass - - def test_request(self): - pass + with patch('ox3apiclient.requests.Session') as self.mock_requests_session: + with patch('ox3apiclient.Client.log_request') as self.mock_client_log_request: + self.mock_requests_session.return_value.get.return_value = self.ex_resp + self.mock_requests_session.return_value.post.return_value = self.ex_resp + self.mock_requests_session.return_value.put.return_value = self.ex_resp + self.mock_requests_session.return_value.options.return_value = self.ex_resp + self.mock_requests_session.return_value.delete.return_value = self.ex_resp + + self.mock_client_log_request.return_value = None + self.client = ox3apiclient.Client( + email=self.email, + password=self.password, + domain=self.domain, + realm=self.realm, + consumer_key=self.consumer_key, + consumer_secret=self.consumer_secret, + request_token_url=self.request_token_url, + access_token_url=self.access_token_url, + authorization_url=self.authorization_url) def test_fetch_request_token(self): # Authorized Case @@ -83,7 +70,7 @@ def test_authorize_token(self, mock_fetch_request_token): # mock the post response, and do some setup r = Mock() - r.content = 'oauth_verifier=verifier' + r.text = 'oauth_verifier=verifier' self.mock_requests_session.return_value.post.return_value = r mock_client_log_request.return_value = None mock_fetch_request_token.return_value = {'key': 'key', @@ -106,7 +93,7 @@ def test_fetch_access_token(self, mock_client_log_request, mock_oauth1): # mock the OAuth1 and session post response mock_oauth1.return_value = 'oauth' r = Mock() - r.content = 'oauth_token=key' + r.text = 'oauth_token=key' self.mock_requests_session.return_value.post.return_value = r self.client._token = {'key': 'key', 'secret': 'secret', @@ -128,27 +115,21 @@ def test_validate_session(self): 'oauth_callback_confirmed=true') def test_logon(self): - with nested( - patch('ox3apiclient.Client.fetch_request_token'), - patch('ox3apiclient.Client.authorize_token'), - patch('ox3apiclient.Client.fetch_access_token'), - patch('ox3apiclient.Client.validate_session'), - ) as (mock_fetch_request_token, mock_authorize_token, - mock_fetch_access_token, mock_validate_session): - mock_fetch_request_token.return_value = None - mock_authorize_token.return_value = None - mock_fetch_access_token.return_value = None - mock_validate_session.return_value = None - ret_val = self.client.logon() - self.assertTrue(isinstance(ret_val, ox3apiclient.Client)) + with patch('ox3apiclient.Client.fetch_request_token') as mock_fetch_request_token: + with patch('ox3apiclient.Client.authorize_token') as mock_authorize_token: + with patch('ox3apiclient.Client.fetch_access_token') as mock_fetch_access_token: + with patch('ox3apiclient.Client.validate_session') as mock_validate_session: + mock_fetch_request_token.return_value = None + mock_authorize_token.return_value = None + mock_fetch_access_token.return_value = None + mock_validate_session.return_value = None + ret_val = self.client.logon() + self.assertTrue(isinstance(ret_val, ox3apiclient.Client)) def test_logoff(self): ret_val = self.client.logoff() self.assertTrue(isinstance(ret_val, ox3apiclient.Client)) - # def test_resolve_url(self): - # pass - def test_get(self): ret_val = self.client.get(self.url) self.assertEqual(ret_val, {'key1': 'value1', @@ -156,42 +137,38 @@ def test_get(self): 'key3': 'value3'}) def test_options(self): - ret_val = self.client.options('https://example.com') + ret_val = self.client.options(self.url) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) def test_put(self): - ret_val = self.client.put('https://example.com', data={'k': 'v'}) + ret_val = self.client.put(self.url, data={'k': 'v'}) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) def test_post(self): - ret_val = self.client.post('https://example.com', data={'k': 'v'}) + ret_val = self.client.post(self.url, data={'k': 'v'}) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) - @patch('ox3apiclient.requests.delete') - @patch('ox3apiclient.Client.log_request') - def test_delete(self, mock_client_log_request, mock_requests_delete): - mock_client_log_request.return_value = None - r = Mock() - r.status_code = 204 - mock_requests_delete.return_value = r - ret_val = self.client.delete('https://example.com') - self.assertEqual(ret_val, []) - - r.status_code = 200 - # r.content = {'key': 'value'} - # ret_val = self.client.delete('https://example.com') - # mock_requests_delete.return_value.json.side_effect = AttributeError - # self.assertEqual(ret_val, {'key': 'value'}) - - r.json.return_value = {'key': 'value'} - ret_val = self.client.delete('https://example.com') - self.assertEqual(ret_val, {'key': 'value'}) + def test_delete(self): + orig_exp_resp_sc = self.ex_resp.status_code + orig_exp_resp_json = self.ex_resp.json.return_value + try: + self.ex_resp.status_code = 204 + ret_val = self.client.delete('https://example.com') + self.assertEqual(ret_val, []) + + self.ex_resp.status_code = 200 + self.ex_resp.json.return_value = {'key': 'value'} + ret_val = self.client.delete('https://example.com') + self.assertEqual(ret_val, {'key': 'value'}) + finally: + self.ex_resp.status_code = orig_exp_resp_sc + self.ex_resp.json.return_value = orig_exp_resp_json def test_upload_creative(self): file_path = os.path.join(os.path.dirname(__file__), 'ox3rctest') @@ -200,6 +177,7 @@ def test_upload_creative(self): 'key2': 'value2', 'key3': 'value3'}) + if __name__ == '__main__': - # run this using python -m unittes -v tests from the root dir + # run this using python -m unittest -v tests from the root dir unittest.main() diff --git a/tests/clientfromfile.py b/tests/clientfromfile.py index 6761aa9..a45e430 100644 --- a/tests/clientfromfile.py +++ b/tests/clientfromfile.py @@ -93,5 +93,5 @@ def test_loads_optional_options(self): if __name__ == '__main__': - # run this using python -m unittes -v tests from the root dir + # run this using python -m unittest -v tests from the root dir unittest.main() From 45145ebd81f603badb64e0f48682dc4527fcba77 Mon Sep 17 00:00:00 2001 From: Federico Delgado Date: Mon, 19 Jun 2017 10:27:52 -0700 Subject: [PATCH 2/5] - Test changes to shares less state among them. --- tests/client.py | 161 +++++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 77 deletions(-) diff --git a/tests/client.py b/tests/client.py index 06956c8..0b62077 100644 --- a/tests/client.py +++ b/tests/client.py @@ -6,17 +6,6 @@ class TestClient(unittest.TestCase): - ex_resp = Mock() - ex_resp.request.headers = {'rheader1': 'rvalue1', - 'rheader2': 'rvalue2'} - ex_resp.headers = {'header1': 'value1', - 'header2': 'value2'} - ex_resp.text = 'oauth_token=key&oauth_token_secret=secret&oauth_callback_confirmed=true' - ex_resp.json.return_value = {'key1': 'value1', - 'key2': 'value2', - 'key3': 'value3'} - # Change this depending on needs, default is 200 - ex_resp.status_code = 200 def setUp(self): self.email = 'you@example.com' @@ -32,16 +21,19 @@ def setUp(self): self.api_path_v2 = '/ox/4.0' self.url = 'https://www.example.com' - with patch('ox3apiclient.requests.Session') as self.mock_requests_session: - with patch('ox3apiclient.Client.log_request') as self.mock_client_log_request: - self.mock_requests_session.return_value.get.return_value = self.ex_resp - self.mock_requests_session.return_value.post.return_value = self.ex_resp - self.mock_requests_session.return_value.put.return_value = self.ex_resp - self.mock_requests_session.return_value.options.return_value = self.ex_resp - self.mock_requests_session.return_value.delete.return_value = self.ex_resp + def _get_client(self, get_return=None, put_return=None, post_return=None, options_return=None, delete_return=None): + ex_resp = self._build_mock_response() - self.mock_client_log_request.return_value = None - self.client = ox3apiclient.Client( + with patch('ox3apiclient.requests.Session') as mock_requests_session: + with patch('ox3apiclient.Client.log_request') as mock_client_log_request: + mock_requests_session.return_value.get.return_value = get_return or ex_resp + mock_requests_session.return_value.post.return_value = post_return or ex_resp + mock_requests_session.return_value.put.return_value = put_return or ex_resp + mock_requests_session.return_value.options.return_value = options_return or ex_resp + mock_requests_session.return_value.delete.return_value = delete_return or ex_resp + + mock_client_log_request.return_value = None + return ox3apiclient.Client( email=self.email, password=self.password, domain=self.domain, @@ -52,63 +44,75 @@ def setUp(self): access_token_url=self.access_token_url, authorization_url=self.authorization_url) + def _build_mock_response(self): + resp = Mock() + resp.request.headers = {'rheader1': 'rvalue1', + 'rheader2': 'rvalue2'} + resp.headers = {'header1': 'value1', + 'header2': 'value2'} + resp.text = 'oauth_token=key&oauth_token_secret=secret&oauth_callback_confirmed=true' + resp.json.return_value = {'key1': 'value1', + 'key2': 'value2', + 'key3': 'value3'} + + resp.status_code = 200 + return resp + def test_fetch_request_token(self): # Authorized Case - ret_val = self.client.fetch_request_token() + resp = self._build_mock_response() + client = self._get_client(post_return=resp) + + ret_val = client.fetch_request_token() self.assertTrue(isinstance(ret_val, dict)) - self.assertEqual( - (ret_val['secret'], ret_val['key']), ('secret', 'key')) - # UnAuthorized Case - self.ex_resp.status_code = 401 + self.assertEqual((ret_val['secret'], ret_val['key']), ('secret', 'key')) + + # Unauthorized Case + resp.status_code = 401 with self.assertRaises(ox3apiclient.OAuthException): - self.client.fetch_request_token() + client.fetch_request_token() - @patch('ox3apiclient.Client.fetch_request_token') - @patch('ox3apiclient.Client.log_request') - def test_authorize_token(self, - mock_client_log_request, - mock_fetch_request_token): + def test_authorize_token(self): # mock the post response, and do some setup - r = Mock() + r = self._build_mock_response() r.text = 'oauth_verifier=verifier' - self.mock_requests_session.return_value.post.return_value = r - mock_client_log_request.return_value = None - mock_fetch_request_token.return_value = {'key': 'key', - 'secret': 'secret'} - self.client._token = {'key': 'key', - 'secret': 'secret'} - - # UnAuthorized Case + r.return_value = {'key': 'key', 'secret': 'secret'} + client = self._get_client(post_return=r) + client._token = {'key': 'key', 'secret': 'secret'} + + # Unauthorized Case r.status_code = 401 with self.assertRaises(ox3apiclient.OAuthException): - self.client.authorize_token() + client.authorize_token() + # Authorized Case r.status_code = 200 - self.client.authorize_token() - self.assertEqual(self.client._token['verifier'], 'verifier') + client.authorize_token() + self.assertEqual(client._token['verifier'], 'verifier') - @patch('requests_oauthlib.OAuth1') - @patch('ox3apiclient.Client.log_request') - def test_fetch_access_token(self, mock_client_log_request, mock_oauth1): + def test_fetch_access_token(self): # mock the OAuth1 and session post response - mock_oauth1.return_value = 'oauth' - r = Mock() + r = self._build_mock_response() r.text = 'oauth_token=key' - self.mock_requests_session.return_value.post.return_value = r - self.client._token = {'key': 'key', - 'secret': 'secret', - 'verifier': 'verifier'} + r.return_value = 'oauth_token=key' + client = self._get_client(post_return=r) + client._token = {'key': 'key', + 'secret': 'secret', + 'verifier': 'verifier'} - # UnAuthorized Case + # Unauthorized Case r.status_code = 401 with self.assertRaises(ox3apiclient.OAuthException): - self.client.fetch_access_token() + client.fetch_access_token() + # Authorized Case r.status_code = 200 - self.assertEqual(self.client.fetch_access_token(), 'key') + self.assertEqual(client.fetch_access_token(), 'key') def test_validate_session(self): - ret_val = self.client.validate_session() + client = self._get_client() + + ret_val = client.validate_session() self.assertEqual(ret_val, 'oauth_token=key&' 'oauth_token_secret=secret&' @@ -119,60 +123,63 @@ def test_logon(self): with patch('ox3apiclient.Client.authorize_token') as mock_authorize_token: with patch('ox3apiclient.Client.fetch_access_token') as mock_fetch_access_token: with patch('ox3apiclient.Client.validate_session') as mock_validate_session: + client = self._get_client() mock_fetch_request_token.return_value = None mock_authorize_token.return_value = None mock_fetch_access_token.return_value = None mock_validate_session.return_value = None - ret_val = self.client.logon() + ret_val = client.logon() self.assertTrue(isinstance(ret_val, ox3apiclient.Client)) def test_logoff(self): - ret_val = self.client.logoff() + client = self._get_client() + ret_val = client.logoff() self.assertTrue(isinstance(ret_val, ox3apiclient.Client)) def test_get(self): - ret_val = self.client.get(self.url) + client = self._get_client() + ret_val = client.get(self.url) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) def test_options(self): - ret_val = self.client.options(self.url) + client = self._get_client() + ret_val = client.options(self.url) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) def test_put(self): - ret_val = self.client.put(self.url, data={'k': 'v'}) + client = self._get_client() + ret_val = client.put(self.url, data={'k': 'v'}) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) def test_post(self): - ret_val = self.client.post(self.url, data={'k': 'v'}) + client = self._get_client() + ret_val = client.post(self.url, data={'k': 'v'}) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) def test_delete(self): - orig_exp_resp_sc = self.ex_resp.status_code - orig_exp_resp_json = self.ex_resp.json.return_value - try: - self.ex_resp.status_code = 204 - ret_val = self.client.delete('https://example.com') - self.assertEqual(ret_val, []) - - self.ex_resp.status_code = 200 - self.ex_resp.json.return_value = {'key': 'value'} - ret_val = self.client.delete('https://example.com') - self.assertEqual(ret_val, {'key': 'value'}) - finally: - self.ex_resp.status_code = orig_exp_resp_sc - self.ex_resp.json.return_value = orig_exp_resp_json + r = self._build_mock_response() + r.status_code = 204 + client = self._get_client(delete_return=r) + ret_val = client.delete('https://example.com') + self.assertEqual(ret_val, []) + + r.status_code = 200 + r.json.return_value = {'key': 'value'} + ret_val = client.delete('https://example.com') + self.assertEqual(ret_val, {'key': 'value'}) def test_upload_creative(self): file_path = os.path.join(os.path.dirname(__file__), 'ox3rctest') - ret_val = self.client.upload_creative('123456789', file_path) + client = self._get_client() + ret_val = client.upload_creative('123456789', file_path) self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) From adbcf021c7217f988a004b6ba6012b36ca5b35f4 Mon Sep 17 00:00:00 2001 From: Federico Delgado Date: Mon, 19 Jun 2017 11:09:38 -0700 Subject: [PATCH 3/5] version bump --- ox3apiclient/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ox3apiclient/__init__.py b/ox3apiclient/__init__.py index e6744c8..4d14b52 100644 --- a/ox3apiclient/__init__.py +++ b/ox3apiclient/__init__.py @@ -12,7 +12,7 @@ import requests from requests_oauthlib import OAuth1 -__version__ = '0.5.3' +__version__ = '0.6.0' REQUEST_TOKEN_URL = 'https://sso.openx.com/api/index/initiate' ACCESS_TOKEN_URL = 'https://sso.openx.com/api/index/token' From 3fa924cb081ea8dc876b43ab18d7647aaefcc584 Mon Sep 17 00:00:00 2001 From: Federico Delgado Date: Mon, 19 Jun 2017 15:24:06 -0700 Subject: [PATCH 4/5] modified tests file structure to run using nose. Previous instructions ran consistently only for Python 2. --- tests/__init__.py | 4 ---- tests/{client.py => test_client.py} | 3 ++- tests/{clientfromfile.py => test_clientfromfile.py} | 3 ++- 3 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 tests/__init__.py rename tests/{client.py => test_client.py} (98%) rename tests/{clientfromfile.py => test_clientfromfile.py} (96%) diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 1934b3a..0000000 --- a/tests/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- - -from clientfromfile import * -from client import * \ No newline at end of file diff --git a/tests/client.py b/tests/test_client.py similarity index 98% rename from tests/client.py rename to tests/test_client.py index 0b62077..a4ed265 100644 --- a/tests/client.py +++ b/tests/test_client.py @@ -186,5 +186,6 @@ def test_upload_creative(self): if __name__ == '__main__': - # run this using python -m unittest -v tests from the root dir + # To run these tests. Install nose (pip install nose) + # and run nosetests -sxv tests/ from the root dir unittest.main() diff --git a/tests/clientfromfile.py b/tests/test_clientfromfile.py similarity index 96% rename from tests/clientfromfile.py rename to tests/test_clientfromfile.py index a45e430..044ef7b 100644 --- a/tests/clientfromfile.py +++ b/tests/test_clientfromfile.py @@ -93,5 +93,6 @@ def test_loads_optional_options(self): if __name__ == '__main__': - # run this using python -m unittest -v tests from the root dir + # To run these tests. Install nose (pip install nose) + # and run nosetests -sxv tests/ from the root dir unittest.main() From 5deacd2969541822c974f3770aae6e41de51657a Mon Sep 17 00:00:00 2001 From: Federico Delgado Date: Mon, 19 Jun 2017 15:36:55 -0700 Subject: [PATCH 5/5] - Removed left overs from old testing - Updated instructions to run tests - Updated versioning information --- History.md | 5 +++++ README.md | 17 +++++++++++++++++ tests/test_client.py | 6 ------ tests/test_clientfromfile.py | 6 ------ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/History.md b/History.md index 3c3e475..c0df417 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,8 @@ +0.6.0 / 2017-06-19 +================== + * Added: Python 3 compatibility + * Fixed: Non running tests + 0.5.2 / 2017-02-02 ================== * Fixed: packaging for Pypi diff --git a/README.md b/README.md index 2d879f7..851c430 100644 --- a/README.md +++ b/README.md @@ -121,3 +121,20 @@ ox = ox3apiclient.Client( ox.logon(email, password) ```` + + # To run these tests. Install nose (pip install nose) + # and run nosetests -sxv tests/ from the root dir + +## Tests + +Install nose + +````bash +pip install nose +```` + + and run the following command line from the root: + +````bash +nosetests -sxv tests/ +```` \ No newline at end of file diff --git a/tests/test_client.py b/tests/test_client.py index a4ed265..3543b7a 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -183,9 +183,3 @@ def test_upload_creative(self): self.assertEqual(ret_val, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}) - - -if __name__ == '__main__': - # To run these tests. Install nose (pip install nose) - # and run nosetests -sxv tests/ from the root dir - unittest.main() diff --git a/tests/test_clientfromfile.py b/tests/test_clientfromfile.py index 044ef7b..9ff4f7a 100644 --- a/tests/test_clientfromfile.py +++ b/tests/test_clientfromfile.py @@ -90,9 +90,3 @@ def test_loads_optional_options(self): loaded_values.sort() self.assertEqual(loaded_values, test_values) - - -if __name__ == '__main__': - # To run these tests. Install nose (pip install nose) - # and run nosetests -sxv tests/ from the root dir - unittest.main()