Skip to content

Commit

Permalink
alternative oauth2 API
Browse files Browse the repository at this point in the history
  • Loading branch information
brad committed Jun 13, 2015
1 parent 3abe822 commit f7cc3cb
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 36 deletions.
19 changes: 7 additions & 12 deletions fitbit/api.py
Expand Up @@ -324,23 +324,18 @@ class Fitbit(object):
'frequent',
]

def __init__(self, client_key=None, client_secret=None, client_id=None, system=US, **kwargs):
def __init__(self, client_key, client_secret, oauth2=False, system=US, **kwargs):
"""
pleasse provide either client_key/client_secret to use OAuth1
pleasse provide either client_id/client_secret to use OAuth2
kwargs can be used to provide parameters:
oath1: Fitbit(<key>, <secret>,resource_owner_key=<key>, resource_owner_secret=<key>)
oath2: Fitbit(client_id=<id>, <secret>,access_token=<token>, refresh_token=<token>)
oauth1: Fitbit(<key>, <secret>, resource_owner_key=<key>, resource_owner_secret=<key>)
oauth2: Fitbit(<id>, <secret>, oauth2=True, access_token=<token>, refresh_token=<token>)
"""
self.system = system

if (client_key is not None) or kwargs.has_key('client_key'):
self.client = FitbitOauthClient(client_key, client_secret, **kwargs)
elif (client_id is not None) or kwargs.has_key('client_id'):
self.client = FitbitOauth2Client(client_id, client_secret, **kwargs)
if oauth2:
self.client = FitbitOauth2Client(client_key, client_secret, **kwargs)
else:
raise TypeError("Please specify either client_key (oauth1) or client_id (oauth2)")
self.client = FitbitOauthClient(client_key, client_secret, **kwargs)

# All of these use the same patterns, define the method for accessing
# creating and deleting records once, and use curry to make individual
# Methods for each
Expand Down
48 changes: 24 additions & 24 deletions fitbit_tests/test_auth.py
Expand Up @@ -73,36 +73,36 @@ class Auth2Test(TestCase):
make sure we call the right oauth calls, respond correctly based on the responses
"""
client_kwargs = {
'client_id': 'fake_id',
'client_key': 'fake_id',
'client_secret': 'fake_secret',
'callback_uri': 'fake_callback_url',
'oauth2': True,
'scope': ['fake_scope1']
}
def test_authorize_token_url(self):
# authorize_token_url calls oauth and returns a URL
client = FitbitOauth2Client(**self.client_kwargs)
retval = client.authorize_token_url()
fb = Fitbit(**self.client_kwargs)
retval = fb.client.authorize_token_url()
self.assertEqual(retval[0],'https://www.fitbit.com/oauth2/authorize?response_type=code&client_id=fake_id&scope=activity+nutrition+heartrate+location+nutrition+profile+settings+sleep+social+weight&state='+retval[1])

def test_authorize_token_url_with_parameters(self):
# authorize_token_url calls oauth and returns a URL
client = FitbitOauth2Client(**self.client_kwargs)
retval = client.authorize_token_url(scope=self.client_kwargs['scope'],
fb = Fitbit(**self.client_kwargs)
retval = fb.client.authorize_token_url(scope=self.client_kwargs['scope'],
callback_uri=self.client_kwargs['callback_uri'])
self.assertEqual(retval[0],'https://www.fitbit.com/oauth2/authorize?response_type=code&client_id=fake_id&scope='+ str(self.client_kwargs['scope'][0])+ '&state='+retval[1]+'&callback_uri='+self.client_kwargs['callback_uri'])


def test_fetch_access_token(self):
# tests the fetching of access token using code and redirect_URL
kwargs = self.client_kwargs
client = FitbitOauth2Client(**kwargs)
fb = Fitbit(**self.client_kwargs)
fake_code = "fake_code"
with mock.patch.object(OAuth2Session, 'fetch_token') as fat:
fat.return_value = {
'access_token': 'fake_return_access_token',
'refresh_token': 'fake_return_refresh_token'
}
retval = client.fetch_access_token(fake_code,kwargs['callback_uri'])
retval = fb.client.fetch_access_token(fake_code, self.client_kwargs['callback_uri'])
self.assertEqual("fake_return_access_token", retval['access_token'])
self.assertEqual("fake_return_refresh_token", retval['refresh_token'])

Expand All @@ -112,55 +112,55 @@ def test_refresh_token(self):
kwargs = self.client_kwargs
kwargs['access_token'] = 'fake_access_token'
kwargs['refresh_token'] = 'fake_refresh_token'
client = FitbitOauth2Client(**kwargs)
fb = Fitbit(**kwargs)
with mock.patch.object(OAuth2Session, 'post') as r:
r.return_value = fake_response(200,'{"access_token": "fake_return_access_token", "scope": "fake_scope", "token_type": "Bearer", "refresh_token": "fake_return_refresh_token"}')
retval = client.refresh_token()
retval = fb.client.refresh_token()
self.assertEqual("fake_return_access_token", retval['access_token'])
self.assertEqual("fake_return_refresh_token", retval['refresh_token'])


def test_auto_refresh_token_exception(self):
# test of auto_refersh with tokenExpired exception
# test of auto_refersh with tokenExpired exception
# 1. first call to _request causes a TokenExpired
# 2. the token_refresh call is faked
# 3. the second call to _request returns a valid value
kwargs = self.client_kwargs
kwargs['access_token'] = 'fake_access_token'
kwargs['refresh_token'] = 'fake_refresh_token'
client = FitbitOauth2Client(**kwargs)

fb = Fitbit(**kwargs)
with mock.patch.object(FitbitOauth2Client, '_request') as r:
r.side_effect = [TokenExpiredError, fake_response(200,'correct_response')]
with mock.patch.object(OAuth2Session, 'post') as auth:
auth.return_value = fake_response(200,'{"access_token": "fake_return_access_token", "scope": "fake_scope", "token_type": "Bearer", "refresh_token": "fake_return_refresh_token"}')
retval = client.make_request(Fitbit.API_ENDPOINT + '/1/user/-/profile.json')
retval = fb.client.make_request(Fitbit.API_ENDPOINT + '/1/user/-/profile.json')
self.assertEqual("correct_response", retval.text)
self.assertEqual("fake_return_access_token", client.token['access_token'])
self.assertEqual("fake_return_refresh_token",client.token['refresh_token'])
self.assertEqual("fake_return_access_token", fb.client.token['access_token'])
self.assertEqual("fake_return_refresh_token", fb.client.token['refresh_token'])
self.assertEqual(1, auth.call_count)
self.assertEqual(2, r.call_count)


def test_auto_refresh_token_nonException(self):
# test of auto_refersh when the exception doesn't fire
# 1. first call to _request causes a 401 expired token response
# test of auto_refersh when the exception doesn't fire
# 1. first call to _request causes a 401 expired token response
# 2. the token_refresh call is faked
# 3. the second call to _request returns a valid value
kwargs = self.client_kwargs
kwargs['access_token'] = 'fake_access_token'
kwargs['refresh_token'] = 'fake_refresh_token'
client = FitbitOauth2Client(**kwargs)

fb = Fitbit(**kwargs)
with mock.patch.object(FitbitOauth2Client, '_request') as r:
r.side_effect = [fake_response(401,b'{"errors": [{"message": "Access token invalid or expired: some_token_goes_here", "errorType": "oauth", "fieldName": "access_token"}]}'),
r.side_effect = [fake_response(401,b'{"errors": [{"message": "Access token invalid or expired: some_token_goes_here", "errorType": "oauth", "fieldName": "access_token"}]}'),
fake_response(200,'correct_response')]
with mock.patch.object(OAuth2Session, 'post') as auth:
auth.return_value = fake_response(200,'{"access_token": "fake_return_access_token", "scope": "fake_scope", "token_type": "Bearer", "refresh_token": "fake_return_refresh_token"}')
retval = client.make_request(Fitbit.API_ENDPOINT + '/1/user/-/profile.json')
retval = fb.client.make_request(Fitbit.API_ENDPOINT + '/1/user/-/profile.json')
self.assertEqual("correct_response", retval.text)
self.assertEqual("fake_return_access_token", client.token['access_token'])
self.assertEqual("fake_return_refresh_token",client.token['refresh_token'])
self.assertEqual("fake_return_access_token", fb.client.token['access_token'])
self.assertEqual("fake_return_refresh_token", fb.client.token['refresh_token'])
self.assertEqual(1, auth.call_count)
self.assertEqual(2, r.call_count)

Expand Down

0 comments on commit f7cc3cb

Please sign in to comment.