Beispiel #1
0
 def test__create_shortlink_without_vanity_domain_and_trim_connection_problem(
         self, http_request, log_data):
     original_url = 'http://test.me/url'
     exception_message = 'test expection message'
     timeout = views.TRIM_FAIL_TIMEOUT
     site_ids = [self.site.pk, self.site_id]
     for site_id in site_ids:
         TrimFailCache.delete({'site': -1})
         data = {
             'original_url': original_url,
             'site_id': site_id,
             'tool': constants.Tools.SHARING_BUTTONS.value,
             'service': constants.SOCIAL_SERVICE_FACEBOOK
         }
         http_request.side_effect = TrimAPIException(exception_message)
         response = self.client.post(self.create_shortlink_url, data)
         self.assertEqual(response.content,
                          json.dumps({'short_url': original_url}))
         # Second time it should use cache and not call trim service
         response = self.client.post(self.create_shortlink_url, data)
         self.assertEqual(response.content,
                          json.dumps({'short_url': original_url}))
         http_request.assert_called_once_with(
             'post',
             'links',
             data={
                 'seed': 'an_%s_sharing-buttons_facebook' % self.site.id,
                 'long_url': original_url
             })
         log_data.check((
             'addnow.apps.tracker.views', 'INFO',
             "Trim connection problem: %s. We will default to long_url for %s seconds"
             % (exception_message, timeout)))
         log_data.clear()
         http_request.reset_mock()
Beispiel #2
0
def create_shortcut_and_add_hook(trim_api_key, vanity_domain, request, long_url, site_id, tool, service, title, uuid):
    if vanity_domain:
        if not should_bypass_trim(site_id):
            try:
                short_url = get_shortcut_and_add_hook(trim_api_key, vanity_domain, request, long_url, site_id, tool,
                                                      service, title, uuid)
                TrimFailCache.delete({'site': site_id})
                return short_url
            except BadTrimKeyException as e:
                logger.info("Trim connection problem: %s. We will bypass vanity domain for site %s for %s seconds"
                            % (e.message, site_id, TRIM_FAIL_TIMEOUT))
                save_trim_fail(site_id, e.message)
                trim_fail = TrimFailCache.get({'site': site_id})
                if trim_fail.get('number_of_requests') == 1:
                    logger.info("Sending email to site %s because invalid tr.im key: %s" % (site_id, e.message))
            except TrimAPIException as e:
                logger.info("Trim connection problem: %s. We will bypass vanity domain for site %s for %s seconds"
                            % (e.message, site_id, TRIM_FAIL_TIMEOUT))
                save_trim_fail(site_id, e.message)

    if should_bypass_trim(-1):
        return long_url
    else:
        try:
            short_url = get_shortcut_and_add_hook(None, None, request, long_url, site_id, tool, service, title, uuid)
            TrimFailCache.delete({'site': -1})
            return short_url
        except ValidationFailedException as e:
            logger.info("Trim validation problem: %s for site: %s , url: %s and service %s"
                        % (e.message, site_id, long_url, service))
        except TrimAPIException as e:
            logger.info("Trim connection problem: %s. We will default to long_url for %s seconds"
                        % (e.message, TRIM_FAIL_TIMEOUT))
            save_trim_fail(-1, e.message)
        return long_url
Beispiel #3
0
 def test__trim_fail_cache__delete(self, django_cache):
     """
     Standard django's cache doesn't have `delete_pattern` method
         which is comes from `django-redis`
     """
     q = dict(site=1)
     TrimFailCache.delete(q)
     django_cache.delete.assert_called_once_with('1:trim_fail')
Beispiel #4
0
def save_trim_fail(site_id, error):
    trim_fail = TrimFailCache.get({'site': site_id})
    now = datetime.now()
    if trim_fail is None:
        trim_fail = {
            'site': site_id,
            'first_fail': now,
            'number_of_requests': 0
        }
    trim_fail['last_try'] = now
    trim_fail['last_error'] = error
    trim_fail['number_of_requests'] += 1
    TrimFailCache.set({'site': site_id}, trim_fail, None)
Beispiel #5
0
 def test__check_trim_service_and_cache(self):
     should_bypass = views.should_bypass_trim(self.site.pk)
     self.assertEqual(should_bypass, False)
     views.save_trim_fail(self.site.id, 'trim_service')
     should_bypass = views.should_bypass_trim(self.site.pk)
     self.assertEqual(should_bypass, True)
     trim_fail = TrimFailCache.get({'site': self.site.pk})
     self.assertEqual(trim_fail['last_error'], 'trim_service')
Beispiel #6
0
def should_bypass_trim(site_id):
    trim_fail = TrimFailCache.get({'site': site_id})
    should_bypass = False
    if trim_fail is not None:
        delta = datetime.now() - trim_fail['last_try']
        if int(delta.total_seconds()) < TRIM_FAIL_TIMEOUT:
            should_bypass = True
    return should_bypass
Beispiel #7
0
 def test__create_shortlink_with_vanity_domain_and_bad_trim_key(
         self, http_request, log_data):
     original_url = 'http://test.me/url'
     exception_message = "{'Forbidden': 'Authentication Failed.'}"
     timeout = views.TRIM_FAIL_TIMEOUT
     site_ids = [self.site.pk, self.site_id]
     for site_id in site_ids:
         TrimFailCache.delete({'site': self.site.pk})
         TrimFailCache.delete({'site': -1})
         data = {
             'original_url': original_url,
             'site_id': site_id,
             'tool': constants.Tools.SHARING_BUTTONS.value,
             'service': constants.SOCIAL_SERVICE_FACEBOOK,
             'vanity_domain': 'test_vanity.domain.pt'
         }
         http_request.side_effect = BadTrimKeyException(exception_message)
         response = self.client.post(self.create_shortlink_url, data)
         self.assertEqual(response.content,
                          json.dumps({'short_url': original_url}))
         # Second time it should use cache and not call trim service
         response = self.client.post(self.create_shortlink_url, data)
         self.assertEqual(response.content,
                          json.dumps({'short_url': original_url}))
         http_request.assert_called_twice_with(
             'post',
             'links',
             data={
                 'seed': 'an_%s_sharing-buttons_facebook' % self.site.id,
                 'long_url': original_url
             })
         log_data.check(
             ('addnow.apps.tracker.views', 'INFO',
              "Trim connection problem: %s. We will bypass vanity domain for site %s for %s seconds"
              % (exception_message, self.site.pk, timeout)),
             ('addnow.apps.tracker.views', 'INFO',
              "Sending email to site %s because invalid tr.im key: %s" %
              (self.site.pk, exception_message)),
             ('addnow.apps.tracker.views', 'INFO',
              "Trim connection problem: %s. We will default to long_url for %s seconds"
              % (exception_message, timeout)),
         )
         log_data.clear()
         http_request.reset_mock()
Beispiel #8
0
 def test__create_shortlink_when_using_default_trim_key_and_short_url_already_taken(
         self, http_request, log_data):
     original_url = 'http://test.me/url'
     exception_message = "Already taken"
     site_ids = [self.site.pk, self.site_id]
     for site_id in site_ids:
         TrimFailCache.delete({'site': self.site.pk})
         TrimFailCache.delete({'site': -1})
         data = {
             'original_url': original_url,
             'site_id': site_id,
             'tool': constants.Tools.SHARING_BUTTONS.value,
             'service': constants.SOCIAL_SERVICE_FACEBOOK,
         }
         http_request.side_effect = ValidationFailedException(
             exception_message)
         response = self.client.post(self.create_shortlink_url, data)
         self.assertEqual(response.content,
                          json.dumps({'short_url': original_url}))
         # Second time it should not use cache and call trim service again
         response = self.client.post(self.create_shortlink_url, data)
         self.assertEqual(response.content,
                          json.dumps({'short_url': original_url}))
         http_request.assert_called_twice_with(
             'post',
             'links',
             data={
                 'seed': 'an_%s_sharing-buttons_facebook' % self.site.id,
                 'long_url': original_url
             })
         log_data.check((
             'addnow.apps.tracker.views', 'INFO',
             "Trim validation problem: %s for site: %s , url: %s and service %s"
             % (exception_message, self.site.pk, original_url,
                constants.SOCIAL_SERVICE_FACEBOOK)
         ), ('addnow.apps.tracker.views', 'INFO',
             "Trim validation problem: %s for site: %s , url: %s and service %s"
             % (exception_message, self.site.pk, original_url,
                constants.SOCIAL_SERVICE_FACEBOOK)))
         log_data.clear()
         http_request.reset_mock()
Beispiel #9
0
def reset_trim_fail_cache(modeladmin, request, queryset):
    from addnow.cache import TrimFailCache
    for site in queryset:
        TrimFailCache.delete(dict(site=site.pk))
Beispiel #10
0
 def test__trim_fail_cache__build_key(self, django_cache):
     q = dict(site=1, )
     TrimFailCache.get(q)
     django_cache.get.assert_called_once_with('1:trim_fail')