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()
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
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')
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()
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()
def reset_trim_fail_cache(modeladmin, request, queryset): from addnow.cache import TrimFailCache for site in queryset: TrimFailCache.delete(dict(site=site.pk))