Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions targetprocess/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ class TargetProcessAPIClient(object):
ITEMS_PER_PAGE = 20
MAX_RETRIES = 1

def __init__(self, api_url, user, password):
def __init__(self, api_url, user=None, password=None, token=None):
self.auth = HTTPBasicAuth(user, password)
self.token = token
self.api_url = api_url
self.query = {'format': 'json'}

Expand Down Expand Up @@ -174,7 +175,12 @@ def _do_request(self, method, url, **kwargs):
attempt = kwargs.pop('attempt', 0)
try:
request_method = requests.__getattribute__(method)
response = request_method(url=url, auth=self.auth, **kwargs)

if self.token:
response = request_method(url=url, params={'access_token': self.token}, **kwargs)
else:
response = request_method(url=url, auth=self.auth, **kwargs)

if response.status_code not in (200, 201):
raise BadResponseError(response=response)

Expand Down
39 changes: 39 additions & 0 deletions tests/tests_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from unittest import TestCase

import mock
import requests
from requests import ConnectionError

from targetprocess.api import TargetProcessAPIClient
Expand Down Expand Up @@ -154,3 +155,41 @@ def test_do_request_raises_bad_response(self):
self.method.assert_called_once_with(
url='http://tp.api.url/api/v1/UserStories/?take=20&format=json', auth=self.api.auth
)


class TargetProcessAPIAuthTest(TestCase):
def setUp(self):
self.requests_get_patcher = mock.patch.object(requests, 'get', autospec=True)
self.requests_get_mock = self.requests_get_patcher.start()
self.addCleanup(self.requests_get_patcher.stop)

self.response = mock.Mock()
self.response.status_code = 200
self.requests_get_mock.return_value = self.response

def test_basic_auth(self):
self.api = TargetProcessAPIClient('http://tp.api.url/api/v1', 'username', 'password')
self.api._do_request('get', 'test_url')

self.requests_get_mock.assert_called_once_with(
url='test_url',
auth=requests.auth.HTTPBasicAuth('username', 'password'),
)

def test_token_auth(self):
self.api = TargetProcessAPIClient('http://tp.api.url/api/v1', token='my_token')
self.api._do_request('get', 'test_url')

self.requests_get_mock.assert_called_once_with(
url='test_url',
params={'access_token': 'my_token'},
)

def test_both_auth_methods_token_overrides(self):
self.api = TargetProcessAPIClient('http://tp.api.url/api/v1', 'username', 'password', 'my_token')
self.api._do_request('get', 'test_url')

self.requests_get_mock.assert_called_once_with(
url='test_url',
params={'access_token': 'my_token'},
)