def forwards(apps, schema_editor):
    UserFitbit = apps.get_model('fitapp', 'UserFitbit')
    for fbuser in UserFitbit.objects.filter(refresh_token=''):
        try:
            token = FitbitOauth2Client(
                get_setting('FITAPP_CONSUMER_KEY'),
                get_setting('FITAPP_CONSUMER_SECRET'),
                refresh_token='{0}:{1}'.format(
                    fbuser.access_token, fbuser.auth_secret)).refresh_token()
            fbuser.access_token = token['access_token']
            fbuser.refresh_token = token['refresh_token']
            fbuser.save()
        except MissingTokenError:
            # Delete fitbit user if existing access_token is invalid
            fbuser.delete()
 def test_unintegrated(self):
     """No Fitbit credentials required to access Logout view."""
     self.fbuser.delete()
     response = self._get()
     self.assertRedirectsNoFollow(response,
             utils.get_setting('FITAPP_LOGIN_REDIRECT'))
     self.assertEqual(UserFitbit.objects.count(), 0)
def forwards(apps, schema_editor):
    UserFitbit = apps.get_model('fitapp', 'UserFitbit')
    for fbuser in UserFitbit.objects.filter(refresh_token=''):
        try:
            token = FitbitOauth2Client(
                get_setting('FITAPP_CONSUMER_KEY'),
                get_setting('FITAPP_CONSUMER_SECRET'),
                refresh_token='{0}:{1}'.format(
                    fbuser.access_token, fbuser.auth_secret)
            ).refresh_token()
            fbuser.access_token = token['access_token']
            fbuser.refresh_token = token['refresh_token']
            fbuser.save()
        except MissingTokenError:
            # Delete fitbit user if existing access_token is invalid
            fbuser.delete()
예제 #4
0
 def test_unintegrated(self):
     """No Fitbit credentials required to access Logout view."""
     self.fbuser.delete()
     response = self._get()
     self.assertRedirectsNoFollow(
         response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
     self.assertEqual(UserFitbit.objects.count(), 0)
예제 #5
0
 def test_get(self, apply_async):
     """Logout view should remove associated UserFitbit and redirect."""
     response = self._get()
     apply_async.assert_called_once_with(kwargs=self.fbuser.get_user_data(),
                                         countdown=5)
     self.assertRedirectsNoFollow(
         response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
     self.assertEqual(UserFitbit.objects.count(), 0)
예제 #6
0
    def test_complete_no_res(self, tsd_apply_async, sub_apply_async):
        """Complete view shouldn't import data if subs dict has no resources"""
        response = self._mock_client(
            client_kwargs=self.token, get_kwargs={'code': self.code})

        self.assertRedirectsNoFollow(
            response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
        self.assertEqual(tsd_apply_async.call_count, 0)
 def test_unauthenticated(self):
     """User must be logged in to access Error view."""
     self.client.logout()
     response = self._get()
     if utils.get_setting('FITAPP_LOGIN_REQUIRED'):
         self.assertEqual(response.status_code, 302)
     else:
         self.assertEqual(response.status_code, 200)
예제 #8
0
    def test_complete_no_res(self, tsd_apply_async, sub_apply_async):
        """Complete view shouldn't import data if subs dict has no resources"""
        response = self._mock_client(
            client_kwargs=self.token, get_kwargs={'code': self.code})

        self.assertRedirectsNoFollow(
            response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
        self.assertEqual(tsd_apply_async.call_count, 0)
예제 #9
0
    def test_invalid_subscriptions_no_error(self):
        """
        Check that get_setting doesn't raise an error when FITAPP_SUBSCRIPTIONS
        is valid
        """
        subs = get_setting('FITAPP_SUBSCRIPTIONS')

        self.assertEqual(subs['activities'], ['steps'])
예제 #10
0
    def test_invalid_subscriptions_no_error(self):
        """
        Check that get_setting doesn't raise an error when FITAPP_SUBSCRIPTIONS
        is valid
        """
        subs = get_setting('FITAPP_SUBSCRIPTIONS')

        self.assertEqual(subs['activities'], ['steps'])
예제 #11
0
    def test_is_not_integrated(self):
        """Message should be added if user is not integrated."""
        UserFitbit.objects.all().delete()
        results = self._mock_decorator()

        self.assertEqual(results, "hello")
        self.assertEqual(len(self.messages), 1)
        self.assertEqual(self.messages[0], utils.get_setting("FITAPP_DECORATOR_MESSAGE"))
예제 #12
0
    def test_unauthenticated(self):
        """Message should be added if user is not logged in."""
        self.fake_request.user = AnonymousUser()
        results = self._mock_decorator()

        self.assertEqual(results, "hello")
        self.assertEqual(len(self.messages), 1)
        self.assertEqual(self.messages[0], utils.get_setting("FITAPP_DECORATOR_MESSAGE"))
 def test_get(self, apply_async):
     """Logout view should remove associated UserFitbit and redirect."""
     response = self._get()
     apply_async.assert_called_once_with(kwargs=self.fbuser.get_user_data(),
                                         countdown=5)
     self.assertRedirectsNoFollow(response,
             utils.get_setting('FITAPP_LOGIN_REDIRECT'))
     self.assertEqual(UserFitbit.objects.count(), 0)
예제 #14
0
    def test_unauthenticated(self):
        """Message should be added if user is not logged in."""
        self.fake_request.user = AnonymousUser()
        results = self._mock_decorator()

        self.assertEqual(results, "hello")
        self.assertEqual(len(self.messages), 1)
        self.assertEqual(self.messages[0],
                         utils.get_setting('FITAPP_DECORATOR_MESSAGE'))
예제 #15
0
    def test_is_not_integrated(self):
        """Message should be added if user is not integrated."""
        UserFitbit.objects.all().delete()
        results = self._mock_decorator()

        self.assertEqual(results, "hello")
        self.assertEqual(len(self.messages), 1)
        self.assertEqual(self.messages[0],
                         utils.get_setting('FITAPP_DECORATOR_MESSAGE'))
예제 #16
0
 def test_get(self):
     """Complete view should fetch & store user's access credentials."""
     response = self._mock_client()
     self.assertRedirectsNoFollow(response, utils.get_setting("FITAPP_LOGIN_REDIRECT"))
     fbuser = UserFitbit.objects.get()
     self.assertEqual(fbuser.user, self.user)
     self.assertEqual(fbuser.auth_token, self.key)
     self.assertEqual(fbuser.auth_secret, self.secret)
     self.assertEqual(fbuser.fitbit_user, self.user_id)
예제 #17
0
 def test_integrated(self):
     """
     Complete view should overwrite existing credentials for this user.
     """
     self.fbuser = self.create_userfitbit(user=self.user)
     response = self._mock_client()
     fbuser = UserFitbit.objects.get()
     self.assertEqual(fbuser.user, self.user)
     self.assertEqual(fbuser.auth_token, self.key)
     self.assertEqual(fbuser.auth_secret, self.secret)
     self.assertEqual(fbuser.fitbit_user, self.user_id)
     self.assertRedirectsNoFollow(response, utils.get_setting("FITAPP_LOGIN_REDIRECT"))
예제 #18
0
    def test_complete_different_delays(self, tsd_apply_async, sub_apply_async):
        """Complete view should use configured delays"""
        tsdts = TimeSeriesDataType.objects.all()
        response = self._mock_client(
            client_kwargs=self.token, get_kwargs={'code': self.code})
        fbuser = UserFitbit.objects.get()

        self.assertRedirectsNoFollow(
            response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
        for i, _type in enumerate(tsdts):
            tsd_apply_async.assert_any_call(
                (fbuser.fitbit_user, _type.category, _type.resource,),
                countdown=11 + (i * 6))
예제 #19
0
    def test_complete_different_delays(self, tsd_apply_async, sub_apply_async):
        """Complete view should use configured delays"""
        tsdts = TimeSeriesDataType.objects.all()
        response = self._mock_client(
            client_kwargs=self.token, get_kwargs={'code': self.code})
        fbuser = UserFitbit.objects.get()

        self.assertRedirectsNoFollow(
            response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
        for i, _type in enumerate(tsdts):
            tsd_apply_async.assert_any_call(
                (fbuser.fitbit_user, _type.category, _type.resource,),
                countdown=11 + (i * 6))
 def test_integrated(self, tsd_apply_async, sub_apply_async):
     """
     Complete view should overwrite existing credentials for this user.
     """
     self.fbuser = self.create_userfitbit(user=self.user)
     response = self._mock_client()
     fbuser = UserFitbit.objects.get()
     sub_apply_async.assert_called_with(
         (fbuser.fitbit_user, settings.FITAPP_SUBSCRIBER_ID), countdown=5)
     self.assertEqual(tsd_apply_async.call_count,
                      TimeSeriesDataType.objects.count())
     self.assertEqual(fbuser.user, self.user)
     self.assertEqual(fbuser.auth_token, self.resource_owner_key)
     self.assertEqual(fbuser.auth_secret, self.resource_owner_secret)
     self.assertEqual(fbuser.fitbit_user, self.user_id)
     self.assertRedirectsNoFollow(
         response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
예제 #21
0
 def test_integrated(self, tsd_apply_async, sub_apply_async):
     """
     Complete view should overwrite existing credentials for this user.
     """
     self.fbuser = self.create_userfitbit(user=self.user)
     response = self._mock_client()
     fbuser = UserFitbit.objects.get()
     sub_apply_async.assert_called_with(
         (fbuser.fitbit_user, settings.FITAPP_SUBSCRIBER_ID), countdown=5)
     self.assertEqual(tsd_apply_async.call_count,
                      TimeSeriesDataType.objects.count())
     self.assertEqual(fbuser.user, self.user)
     self.assertEqual(fbuser.auth_token, self.resource_owner_key)
     self.assertEqual(fbuser.auth_secret, self.resource_owner_secret)
     self.assertEqual(fbuser.fitbit_user, self.user_id)
     self.assertRedirectsNoFollow(
         response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
 def test_get(self, tsd_apply_async, sub_apply_async):
     """Complete view should fetch & store user's access credentials."""
     response = self._mock_client()
     self.assertRedirectsNoFollow(
          response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
     fbuser = UserFitbit.objects.get()
     sub_apply_async.assert_called_once_with(
         (fbuser.fitbit_user, settings.FITAPP_SUBSCRIBER_ID), countdown=5)
     tsdts = TimeSeriesDataType.objects.all()
     self.assertEqual(tsd_apply_async.call_count, tsdts.count())
     for i, _type in enumerate(tsdts):
         tsd_apply_async.assert_any_call(
             (fbuser.fitbit_user, _type.category, _type.resource,),
             countdown=10 + (i * 5))
     self.assertEqual(fbuser.user, self.user)
     self.assertEqual(fbuser.auth_token, self.resource_owner_key)
     self.assertEqual(fbuser.auth_secret, self.resource_owner_secret)
     self.assertEqual(fbuser.fitbit_user, self.user_id)
예제 #23
0
 def test_complete(self, tsd_apply_async, sub_apply_async):
     """Complete view should fetch & store user's access credentials."""
     response = self._mock_client(
         client_kwargs=self.token, get_kwargs={'code': self.code})
     self.assertRedirectsNoFollow(
         response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
     fbuser = UserFitbit.objects.get()
     sub_apply_async.assert_called_once_with(
         (fbuser.fitbit_user, settings.FITAPP_SUBSCRIBER_ID), countdown=5)
     tsdts = TimeSeriesDataType.objects.all()
     self.assertEqual(tsd_apply_async.call_count, tsdts.count())
     for i, _type in enumerate(tsdts):
         tsd_apply_async.assert_any_call(
             (fbuser.fitbit_user, _type.category, _type.resource,),
             countdown=10 + (i * 5))
     self.assertEqual(fbuser.user, self.user)
     self.assertEqual(fbuser.access_token, self.token['access_token'])
     self.assertEqual(fbuser.refresh_token, self.token['refresh_token'])
     self.assertEqual(fbuser.fitbit_user, self.user_id)
예제 #24
0
    def test_complete_sub_list(self, tsd_apply_async, sub_apply_async):
        """
        Complete view should only import the listed subscriptions, in the right
        order
        """
        activities = TimeSeriesDataType.activities
        response = self._mock_client(client_kwargs=self.token,
                                     get_kwargs={'code': self.code})
        fbuser = UserFitbit.objects.get()

        self.assertRedirectsNoFollow(
            response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
        tsd_apply_async.assert_any_call((
            fbuser.fitbit_user,
            activities,
            'steps',
        ),
                                        countdown=10)
        tsd_apply_async.assert_any_call((
            fbuser.fitbit_user,
            activities,
            'calories',
        ),
                                        countdown=15)
        tsd_apply_async.assert_any_call((
            fbuser.fitbit_user,
            activities,
            'distance',
        ),
                                        countdown=20)
        tsd_apply_async.assert_any_call(
            (fbuser.fitbit_user, activities, 'activityCalories'), countdown=25)
        tsd_apply_async.assert_any_call((
            fbuser.fitbit_user,
            TimeSeriesDataType.foods,
            'log/water',
        ),
                                        countdown=30)
예제 #25
0
    def test_complete_sub_list(self, tsd_apply_async, sub_apply_async):
        """
        Complete view should only import the listed subscriptions, in the right
        order
        """
        activities = TimeSeriesDataType.activities
        response = self._mock_client(
            client_kwargs=self.token, get_kwargs={'code': self.code})
        fbuser = UserFitbit.objects.get()

        self.assertRedirectsNoFollow(
            response, utils.get_setting('FITAPP_LOGIN_REDIRECT'))
        tsd_apply_async.assert_any_call(
            (fbuser.fitbit_user, activities, 'steps',), countdown=10)
        tsd_apply_async.assert_any_call(
            (fbuser.fitbit_user, activities, 'calories',), countdown=15)
        tsd_apply_async.assert_any_call(
            (fbuser.fitbit_user, activities, 'distance',), countdown=20)
        tsd_apply_async.assert_any_call(
            (fbuser.fitbit_user, activities, 'activityCalories'), countdown=25)
        tsd_apply_async.assert_any_call(
            (fbuser.fitbit_user, TimeSeriesDataType.foods, 'log/water',),
            countdown=30)
예제 #26
0
 def test_get(self):
     """Logout view should remove associated UserFitbit and redirect."""
     response = self._get()
     self.assertRedirectsNoFollow(response, utils.get_setting("FITAPP_LOGIN_REDIRECT"))
     self.assertEqual(UserFitbit.objects.count(), 0)