diff --git a/fitbit/api.py b/fitbit/api.py index 740b5c7..72d253c 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -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(, ,resource_owner_key=, resource_owner_secret=) - oath2: Fitbit(client_id=, ,access_token=, refresh_token=) + oauth1: Fitbit(, , resource_owner_key=, resource_owner_secret=) + oauth2: Fitbit(, , oauth2=True, access_token=, refresh_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 diff --git a/fitbit_tests/test_auth.py b/fitbit_tests/test_auth.py index 16d479a..e3ecca6 100644 --- a/fitbit_tests/test_auth.py +++ b/fitbit_tests/test_auth.py @@ -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']) @@ -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)