From 25fcdd00cc76b81d62ed85744860bc47c4e5fa9c Mon Sep 17 00:00:00 2001 From: Peter Bittner Date: Fri, 4 Apr 2025 13:25:00 +0200 Subject: [PATCH] Reformat code using Ruff --- analytical/templatetags/analytical.py | 9 +- analytical/templatetags/chartbeat.py | 12 +- analytical/templatetags/clickmap.py | 8 +- analytical/templatetags/clicky.py | 4 +- analytical/templatetags/crazy_egg.py | 26 +- analytical/templatetags/facebook_pixel.py | 3 +- analytical/templatetags/gauges.py | 4 +- analytical/templatetags/google_analytics.py | 72 +++-- .../templatetags/google_analytics_gtag.py | 21 +- .../templatetags/google_analytics_js.py | 51 ++-- analytical/templatetags/gosquared.py | 6 +- analytical/templatetags/heap.py | 8 +- analytical/templatetags/hotjar.py | 3 +- analytical/templatetags/hubspot.py | 5 +- analytical/templatetags/intercom.py | 13 +- analytical/templatetags/kiss_insights.py | 14 +- analytical/templatetags/kiss_metrics.py | 28 +- analytical/templatetags/luckyorange.py | 3 +- analytical/templatetags/matomo.py | 42 +-- analytical/templatetags/mixpanel.py | 29 +- analytical/templatetags/olark.py | 46 ++- analytical/templatetags/optimizely.py | 6 +- analytical/templatetags/performable.py | 17 +- analytical/templatetags/rating_mailru.py | 6 +- analytical/templatetags/snapengage.py | 107 ++++--- analytical/templatetags/spring_metrics.py | 15 +- analytical/templatetags/uservoice.py | 18 +- analytical/templatetags/woopra.py | 7 +- analytical/templatetags/yandex_metrica.py | 8 +- analytical/utils.py | 14 +- docs/_ext/local.py | 24 +- docs/conf.py | 15 +- tests/testproject/templatetags/dummy.py | 4 +- tests/unit/test_tag_analytical.py | 2 +- tests/unit/test_tag_chartbeat.py | 48 ++-- tests/unit/test_tag_clicky.py | 16 +- tests/unit/test_tag_facebook_pixel.py | 30 +- tests/unit/test_tag_gauges.py | 10 +- tests/unit/test_tag_google_analytics.py | 46 +-- tests/unit/test_tag_google_analytics_gtag.py | 26 +- tests/unit/test_tag_google_analytics_js.py | 82 ++++-- tests/unit/test_tag_gosquared.py | 22 +- tests/unit/test_tag_heap.py | 4 +- tests/unit/test_tag_hotjar.py | 15 +- tests/unit/test_tag_intercom.py | 100 ++++--- tests/unit/test_tag_kiss_insights.py | 4 +- tests/unit/test_tag_kiss_metrics.py | 43 ++- tests/unit/test_tag_luckyorange.py | 23 +- tests/unit/test_tag_matomo.py | 57 ++-- tests/unit/test_tag_mixpanel.py | 15 +- tests/unit/test_tag_olark.py | 69 +++-- tests/unit/test_tag_rating_mailru.py | 4 +- tests/unit/test_tag_snapengage.py | 268 ++++++++++++------ tests/unit/test_tag_spring_metrics.py | 22 +- tests/unit/test_tag_uservoice.py | 6 +- tests/unit/test_tag_woopra.py | 58 ++-- tests/unit/test_tag_yandex_metrica.py | 5 +- tests/unit/test_utils.py | 34 ++- tests/unit/utils.py | 2 +- 59 files changed, 1055 insertions(+), 604 deletions(-) diff --git a/analytical/templatetags/analytical.py b/analytical/templatetags/analytical.py index ee6aa42..7ae606b 100644 --- a/analytical/templatetags/analytical.py +++ b/analytical/templatetags/analytical.py @@ -66,7 +66,7 @@ class AnalyticalNode(Node): self.nodes = [node_cls() for node_cls in template_nodes[location]] def render(self, context): - return "".join([node.render(context) for node in self.nodes]) + return ''.join([node.render(context) for node in self.nodes]) def _load_template_nodes(): @@ -82,14 +82,15 @@ def _load_template_nodes(): except AnalyticalException as e: logger.debug("not loading tags from '%s': %s", path, e) for location in TAG_LOCATIONS: - template_nodes[location] = sum((template_nodes[location][p] - for p in TAG_POSITIONS), []) + template_nodes[location] = sum( + (template_nodes[location][p] for p in TAG_POSITIONS), [] + ) return template_nodes def _import_tag_module(path): app_name, lib_name = path.rsplit('.', 1) - return import_module("%s.templatetags.%s" % (app_name, lib_name)) + return import_module('%s.templatetags.%s' % (app_name, lib_name)) template_nodes = _load_template_nodes() diff --git a/analytical/templatetags/chartbeat.py b/analytical/templatetags/chartbeat.py index 6ab7b84..c499935 100644 --- a/analytical/templatetags/chartbeat.py +++ b/analytical/templatetags/chartbeat.py @@ -12,7 +12,9 @@ from django.template import Library, Node, TemplateSyntaxError from analytical.utils import disable_html, get_required_setting, is_internal_ip USER_ID_RE = re.compile(r'^\d+$') -INIT_CODE = """""" +INIT_CODE = ( + """""" +) SETUP_CODE = """ '.\ - format(placeholder_url='//dnn506yrbagrg.cloudfront.net/pages/scripts/' - '%(account_nr_1)s/%(account_nr_2)s.js') +SETUP_CODE = ''.format( + placeholder_url='//dnn506yrbagrg.cloudfront.net/pages/scripts/' + '%(account_nr_1)s/%(account_nr_2)s.js' +) USERVAR_CODE = "CE2.set(%(varnr)d, '%(value)s');" @@ -38,7 +38,8 @@ class CrazyEggNode(Node): def __init__(self): self.account_nr = get_required_setting( 'CRAZY_EGG_ACCOUNT_NUMBER', - ACCOUNT_NUMBER_RE, "must be (a string containing) a number" + ACCOUNT_NUMBER_RE, + 'must be (a string containing) a number', ) def render(self, context): @@ -49,12 +50,15 @@ class CrazyEggNode(Node): values = (context.get('crazy_egg_var%d' % i) for i in range(1, 6)) params = [(i, v) for i, v in enumerate(values, 1) if v is not None] if params: - js = " ".join(USERVAR_CODE % { - 'varnr': varnr, - 'value': value, - } for (varnr, value) in params) - html = '%s\n' \ - '' % (html, js) + js = ' '.join( + USERVAR_CODE + % { + 'varnr': varnr, + 'value': value, + } + for (varnr, value) in params + ) + html = '%s\n' % (html, js) if is_internal_ip(context, 'CRAZY_EGG'): html = disable_html(html, 'Crazy Egg') return html diff --git a/analytical/templatetags/facebook_pixel.py b/analytical/templatetags/facebook_pixel.py index 6634686..e1b5e43 100644 --- a/analytical/templatetags/facebook_pixel.py +++ b/analytical/templatetags/facebook_pixel.py @@ -60,11 +60,12 @@ class _FacebookPixelNode(Node): """ Base class: override and provide code_template. """ + def __init__(self): self.pixel_id = get_required_setting( 'FACEBOOK_PIXEL_ID', re.compile(r'^\d+$'), - "must be (a string containing) a number", + 'must be (a string containing) a number', ) def render(self, context): diff --git a/analytical/templatetags/gauges.py b/analytical/templatetags/gauges.py index d4f9307..ee9c714 100644 --- a/analytical/templatetags/gauges.py +++ b/analytical/templatetags/gauges.py @@ -46,8 +46,8 @@ def gauges(parser, token): class GaugesNode(Node): def __init__(self): self.site_id = get_required_setting( - 'GAUGES_SITE_ID', SITE_ID_RE, - "must be a string looking like 'XXXXXXX'") + 'GAUGES_SITE_ID', SITE_ID_RE, "must be a string looking like 'XXXXXXX'" + ) def render(self, context): html = TRACKING_CODE % {'site_id': self.site_id} diff --git a/analytical/templatetags/google_analytics.py b/analytical/templatetags/google_analytics.py index 96f8808..a7640dc 100644 --- a/analytical/templatetags/google_analytics.py +++ b/analytical/templatetags/google_analytics.py @@ -45,8 +45,9 @@ DOMAIN_CODE = "_gaq.push(['_setDomainName', '%s']);" NO_ALLOW_HASH_CODE = "_gaq.push(['_setAllowHash', false]);" TRACK_PAGE_VIEW = "_gaq.push(['_trackPageview']);" ALLOW_LINKER_CODE = "_gaq.push(['_setAllowLinker', true]);" -CUSTOM_VAR_CODE = "_gaq.push(['_setCustomVar', %(index)s, '%(name)s', " \ - "'%(value)s', %(scope)s]);" +CUSTOM_VAR_CODE = ( + "_gaq.push(['_setCustomVar', %(index)s, '%(name)s', '%(value)s', %(scope)s]);" +) SITE_SPEED_CODE = "_gaq.push(['_trackPageLoadTime']);" ANONYMIZE_IP_CODE = "_gaq.push(['_gat._anonymizeIp']);" SAMPLE_RATE_CODE = "_gaq.push(['_setSampleRate', '%s']);" @@ -54,7 +55,10 @@ SITE_SPEED_SAMPLE_RATE_CODE = "_gaq.push(['_setSiteSpeedSampleRate', '%s']);" SESSION_COOKIE_TIMEOUT_CODE = "_gaq.push(['_setSessionCookieTimeout', '%s']);" VISITOR_COOKIE_TIMEOUT_CODE = "_gaq.push(['_setVisitorCookieTimeout', '%s']);" DEFAULT_SOURCE = ("'https://ssl' : 'http://www'", "'.google-analytics.com/ga.js'") -DISPLAY_ADVERTISING_SOURCE = ("'https://' : 'http://'", "'stats.g.doubleclick.net/dc.js'") +DISPLAY_ADVERTISING_SOURCE = ( + "'https://' : 'http://'", + "'stats.g.doubleclick.net/dc.js'", +) ZEROPLACES = decimal.Decimal('0') TWOPLACES = decimal.Decimal('0.01') @@ -80,8 +84,10 @@ def google_analytics(parser, token): class GoogleAnalyticsNode(Node): def __init__(self): self.property_id = get_required_setting( - 'GOOGLE_ANALYTICS_PROPERTY_ID', PROPERTY_ID_RE, - "must be a string looking like 'UA-XXXXXX-Y'") + 'GOOGLE_ANALYTICS_PROPERTY_ID', + PROPERTY_ID_RE, + "must be a string looking like 'UA-XXXXXX-Y'", + ) def render(self, context): commands = self._get_domain_commands(context) @@ -94,7 +100,7 @@ class GoogleAnalyticsNode(Node): source = DEFAULT_SOURCE html = SETUP_CODE % { 'property_id': self.property_id, - 'commands': " ".join(commands), + 'commands': ' '.join(commands), 'source_scheme': source[0], 'source_url': source[1], } @@ -104,15 +110,17 @@ class GoogleAnalyticsNode(Node): def _get_domain_commands(self, context): commands = [] - tracking_type = getattr(settings, 'GOOGLE_ANALYTICS_TRACKING_STYLE', - TRACK_SINGLE_DOMAIN) + tracking_type = getattr( + settings, 'GOOGLE_ANALYTICS_TRACKING_STYLE', TRACK_SINGLE_DOMAIN + ) if tracking_type == TRACK_SINGLE_DOMAIN: pass else: domain = get_domain(context, 'google_analytics') if domain is None: raise AnalyticalException( - "tracking multiple domains with Google Analytics requires a domain name") + 'tracking multiple domains with Google Analytics requires a domain name' + ) commands.append(DOMAIN_CODE % domain) commands.append(NO_ALLOW_HASH_CODE) if tracking_type == TRACK_MULTIPLE_DOMAINS: @@ -120,9 +128,7 @@ class GoogleAnalyticsNode(Node): return commands def _get_custom_var_commands(self, context): - values = ( - context.get('google_analytics_var%s' % i) for i in range(1, 6) - ) + values = (context.get('google_analytics_var%s' % i) for i in range(1, 6)) params = [(i, v) for i, v in enumerate(values, 1) if v is not None] commands = [] for index, var in params: @@ -132,12 +138,15 @@ class GoogleAnalyticsNode(Node): scope = var[2] except IndexError: scope = SCOPE_PAGE - commands.append(CUSTOM_VAR_CODE % { - 'index': index, - 'name': name, - 'value': value, - 'scope': scope, - }) + commands.append( + CUSTOM_VAR_CODE + % { + 'index': index, + 'name': name, + 'value': value, + 'scope': scope, + } + ) return commands def _get_other_commands(self, context): @@ -152,29 +161,42 @@ class GoogleAnalyticsNode(Node): if sampleRate is not False: value = decimal.Decimal(sampleRate) if not 0 <= value <= 100: - raise AnalyticalException("'GOOGLE_ANALYTICS_SAMPLE_RATE' must be >= 0 and <= 100") + raise AnalyticalException( + "'GOOGLE_ANALYTICS_SAMPLE_RATE' must be >= 0 and <= 100" + ) commands.append(SAMPLE_RATE_CODE % value.quantize(TWOPLACES)) - siteSpeedSampleRate = getattr(settings, 'GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE', False) + siteSpeedSampleRate = getattr( + settings, 'GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE', False + ) if siteSpeedSampleRate is not False: value = decimal.Decimal(siteSpeedSampleRate) if not 0 <= value <= 100: raise AnalyticalException( - "'GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE' must be >= 0 and <= 100") + "'GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE' must be >= 0 and <= 100" + ) commands.append(SITE_SPEED_SAMPLE_RATE_CODE % value.quantize(TWOPLACES)) - sessionCookieTimeout = getattr(settings, 'GOOGLE_ANALYTICS_SESSION_COOKIE_TIMEOUT', False) + sessionCookieTimeout = getattr( + settings, 'GOOGLE_ANALYTICS_SESSION_COOKIE_TIMEOUT', False + ) if sessionCookieTimeout is not False: value = decimal.Decimal(sessionCookieTimeout) if value < 0: - raise AnalyticalException("'GOOGLE_ANALYTICS_SESSION_COOKIE_TIMEOUT' must be >= 0") + raise AnalyticalException( + "'GOOGLE_ANALYTICS_SESSION_COOKIE_TIMEOUT' must be >= 0" + ) commands.append(SESSION_COOKIE_TIMEOUT_CODE % value.quantize(ZEROPLACES)) - visitorCookieTimeout = getattr(settings, 'GOOGLE_ANALYTICS_VISITOR_COOKIE_TIMEOUT', False) + visitorCookieTimeout = getattr( + settings, 'GOOGLE_ANALYTICS_VISITOR_COOKIE_TIMEOUT', False + ) if visitorCookieTimeout is not False: value = decimal.Decimal(visitorCookieTimeout) if value < 0: - raise AnalyticalException("'GOOGLE_ANALYTICS_VISITOR_COOKIE_TIMEOUT' must be >= 0") + raise AnalyticalException( + "'GOOGLE_ANALYTICS_VISITOR_COOKIE_TIMEOUT' must be >= 0" + ) commands.append(VISITOR_COOKIE_TIMEOUT_CODE % value.quantize(ZEROPLACES)) return commands diff --git a/analytical/templatetags/google_analytics_gtag.py b/analytical/templatetags/google_analytics_gtag.py index 19bcc57..f83f835 100644 --- a/analytical/templatetags/google_analytics_gtag.py +++ b/analytical/templatetags/google_analytics_gtag.py @@ -13,7 +13,9 @@ from analytical.utils import ( is_internal_ip, ) -PROPERTY_ID_RE = re.compile(r'^UA-\d+-\d+$|^G-[a-zA-Z0-9]+$|^AW-[a-zA-Z0-9]+$|^DC-[a-zA-Z0-9]+$') +PROPERTY_ID_RE = re.compile( + r'^UA-\d+-\d+$|^G-[a-zA-Z0-9]+$|^AW-[a-zA-Z0-9]+$|^DC-[a-zA-Z0-9]+$' +) SETUP_CODE = """ -""" # noqa +""" # noqa register = Library() @@ -41,9 +41,9 @@ def heap(parser, token): class HeapNode(Node): def __init__(self): - self.tracker_id = get_required_setting('HEAP_TRACKER_ID', - HEAP_TRACKER_ID_RE, - "must be an numeric string") + self.tracker_id = get_required_setting( + 'HEAP_TRACKER_ID', HEAP_TRACKER_ID_RE, 'must be an numeric string' + ) def render(self, context): html = TRACKING_CODE % {'tracker_id': self.tracker_id} diff --git a/analytical/templatetags/hotjar.py b/analytical/templatetags/hotjar.py index 6ad2063..9c5bf38 100644 --- a/analytical/templatetags/hotjar.py +++ b/analytical/templatetags/hotjar.py @@ -41,12 +41,11 @@ def hotjar(parser, token): class HotjarNode(Node): - def __init__(self): self.site_id = get_required_setting( 'HOTJAR_SITE_ID', re.compile(r'^\d+$'), - "must be (a string containing) a number", + 'must be (a string containing) a number', ) def render(self, context): diff --git a/analytical/templatetags/hubspot.py b/analytical/templatetags/hubspot.py index 6aeab9f..cff51b8 100644 --- a/analytical/templatetags/hubspot.py +++ b/analytical/templatetags/hubspot.py @@ -41,8 +41,9 @@ def hubspot(parser, token): class HubSpotNode(Node): def __init__(self): - self.portal_id = get_required_setting('HUBSPOT_PORTAL_ID', PORTAL_ID_RE, - "must be a (string containing a) number") + self.portal_id = get_required_setting( + 'HUBSPOT_PORTAL_ID', PORTAL_ID_RE, 'must be a (string containing a) number' + ) def render(self, context): html = TRACKING_CODE % {'portal_id': self.portal_id} diff --git a/analytical/templatetags/intercom.py b/analytical/templatetags/intercom.py index fc47376..69ae77e 100644 --- a/analytical/templatetags/intercom.py +++ b/analytical/templatetags/intercom.py @@ -76,8 +76,8 @@ def intercom(parser, token): class IntercomNode(Node): def __init__(self): self.app_id = get_required_setting( - 'INTERCOM_APP_ID', APP_ID_RE, - "must be a string looking like 'XXXXXXX'") + 'INTERCOM_APP_ID', APP_ID_RE, "must be a string looking like 'XXXXXXX'" + ) def _identify(self, user): name = user.get_full_name() @@ -95,8 +95,7 @@ class IntercomNode(Node): user = get_user_from_context(context) if user is not None and get_user_is_authenticated(user): if 'name' not in params: - params['name'] = get_identity( - context, 'intercom', self._identify, user) + params['name'] = get_identity(context, 'intercom', self._identify, user) if 'email' not in params and user.email: params['email'] = user.email @@ -120,10 +119,8 @@ class IntercomNode(Node): def render(self, context): params = self._get_custom_attrs(context) - params["app_id"] = self.app_id - html = TRACKING_CODE % { - "settings_json": json.dumps(params, sort_keys=True) - } + params['app_id'] = self.app_id + html = TRACKING_CODE % {'settings_json': json.dumps(params, sort_keys=True)} if is_internal_ip(context, 'INTERCOM'): html = disable_html(html, 'Intercom') diff --git a/analytical/templatetags/kiss_insights.py b/analytical/templatetags/kiss_insights.py index f009d8f..4aa11e8 100644 --- a/analytical/templatetags/kiss_insights.py +++ b/analytical/templatetags/kiss_insights.py @@ -41,11 +41,15 @@ def kiss_insights(parser, token): class KissInsightsNode(Node): def __init__(self): self.account_number = get_required_setting( - 'KISS_INSIGHTS_ACCOUNT_NUMBER', ACCOUNT_NUMBER_RE, - "must be (a string containing) a number") + 'KISS_INSIGHTS_ACCOUNT_NUMBER', + ACCOUNT_NUMBER_RE, + 'must be (a string containing) a number', + ) self.site_code = get_required_setting( - 'KISS_INSIGHTS_SITE_CODE', SITE_CODE_RE, - "must be a string containing three characters") + 'KISS_INSIGHTS_SITE_CODE', + SITE_CODE_RE, + 'must be a string containing three characters', + ) def render(self, context): commands = [] @@ -59,7 +63,7 @@ class KissInsightsNode(Node): html = SETUP_CODE % { 'account_number': self.account_number, 'site_code': self.site_code, - 'commands': " ".join(commands), + 'commands': ' '.join(commands), } return html diff --git a/analytical/templatetags/kiss_metrics.py b/analytical/templatetags/kiss_metrics.py index dc91e44..73d09d5 100644 --- a/analytical/templatetags/kiss_metrics.py +++ b/analytical/templatetags/kiss_metrics.py @@ -63,8 +63,10 @@ def kiss_metrics(parser, token): class KissMetricsNode(Node): def __init__(self): self.api_key = get_required_setting( - 'KISS_METRICS_API_KEY', API_KEY_RE, - "must be a string containing a 40-digit hexadecimal number") + 'KISS_METRICS_API_KEY', + API_KEY_RE, + 'must be a string containing a 40-digit hexadecimal number', + ) def render(self, context): commands = [] @@ -79,22 +81,28 @@ class KissMetricsNode(Node): pass try: name, properties = context[EVENT_CONTEXT_KEY] - commands.append(EVENT_CODE % { - 'name': name, - 'properties': json.dumps(properties, sort_keys=True), - }) + commands.append( + EVENT_CODE + % { + 'name': name, + 'properties': json.dumps(properties, sort_keys=True), + } + ) except KeyError: pass try: properties = context[PROPERTY_CONTEXT_KEY] - commands.append(PROPERTY_CODE % { - 'properties': json.dumps(properties, sort_keys=True), - }) + commands.append( + PROPERTY_CODE + % { + 'properties': json.dumps(properties, sort_keys=True), + } + ) except KeyError: pass html = TRACKING_CODE % { 'api_key': self.api_key, - 'commands': " ".join(commands), + 'commands': ' '.join(commands), } if is_internal_ip(context, 'KISS_METRICS'): html = disable_html(html, 'KISSmetrics') diff --git a/analytical/templatetags/luckyorange.py b/analytical/templatetags/luckyorange.py index e9bba8e..0c22a81 100644 --- a/analytical/templatetags/luckyorange.py +++ b/analytical/templatetags/luckyorange.py @@ -39,12 +39,11 @@ def luckyorange(parser, token): class LuckyOrangeNode(Node): - def __init__(self): self.site_id = get_required_setting( 'LUCKYORANGE_SITE_ID', re.compile(r'^\d+$'), - "must be (a string containing) a number", + 'must be (a string containing) a number', ) def render(self, context): diff --git a/analytical/templatetags/matomo.py b/analytical/templatetags/matomo.py index c5b1c1c..a984841 100644 --- a/analytical/templatetags/matomo.py +++ b/analytical/templatetags/matomo.py @@ -40,9 +40,11 @@ TRACKING_CODE = """ """ # noqa -VARIABLE_CODE = '_paq.push(["setCustomVariable", %(index)s, "%(name)s", "%(value)s", "%(scope)s"]);' # noqa +VARIABLE_CODE = ( + '_paq.push(["setCustomVariable", %(index)s, "%(name)s", "%(value)s", "%(scope)s"]);' # noqa +) IDENTITY_CODE = '_paq.push(["setUserId", "%(userid)s"]);' -DISABLE_COOKIES_CODE = '_paq.push([\'disableCookies\']);' +DISABLE_COOKIES_CODE = "_paq.push(['disableCookies']);" DEFAULT_SCOPE = 'page' @@ -75,23 +77,27 @@ def matomo(parser, token): class MatomoNode(Node): def __init__(self): - self.domain_path = \ - get_required_setting('MATOMO_DOMAIN_PATH', DOMAINPATH_RE, - "must be a domain name, optionally followed " - "by an URI path, no trailing slash (e.g. " - "matomo.example.com or my.matomo.server/path)") - self.site_id = \ - get_required_setting('MATOMO_SITE_ID', SITEID_RE, - "must be a (string containing a) number") + self.domain_path = get_required_setting( + 'MATOMO_DOMAIN_PATH', + DOMAINPATH_RE, + 'must be a domain name, optionally followed ' + 'by an URI path, no trailing slash (e.g. ' + 'matomo.example.com or my.matomo.server/path)', + ) + self.site_id = get_required_setting( + 'MATOMO_SITE_ID', SITEID_RE, 'must be a (string containing a) number' + ) def render(self, context): custom_variables = context.get('matomo_vars', ()) - complete_variables = (var if len(var) >= 4 else var + (DEFAULT_SCOPE,) - for var in custom_variables) + complete_variables = ( + var if len(var) >= 4 else var + (DEFAULT_SCOPE,) for var in custom_variables + ) - variables_code = (VARIABLE_CODE % MatomoVar(*var)._asdict() - for var in complete_variables) + variables_code = ( + VARIABLE_CODE % MatomoVar(*var)._asdict() for var in complete_variables + ) commands = [] if getattr(settings, 'MATOMO_DISABLE_COOKIES', False): @@ -99,15 +105,15 @@ class MatomoNode(Node): userid = get_identity(context, 'matomo') if userid is not None: - variables_code = chain(variables_code, ( - IDENTITY_CODE % {'userid': userid}, - )) + variables_code = chain( + variables_code, (IDENTITY_CODE % {'userid': userid},) + ) html = TRACKING_CODE % { 'url': self.domain_path, 'siteid': self.site_id, 'variables': '\n '.join(variables_code), - 'commands': '\n '.join(commands) + 'commands': '\n '.join(commands), } if is_internal_ip(context, 'MATOMO'): html = disable_html(html, 'Matomo') diff --git a/analytical/templatetags/mixpanel.py b/analytical/templatetags/mixpanel.py index e9b95b7..996d772 100644 --- a/analytical/templatetags/mixpanel.py +++ b/analytical/templatetags/mixpanel.py @@ -25,7 +25,7 @@ e,d])};b.__SV=1.2}})(document,window.mixpanel||[]); """ # noqa IDENTIFY_CODE = "mixpanel.identify('%s');" -IDENTIFY_PROPERTIES = "mixpanel.people.set(%s);" +IDENTIFY_PROPERTIES = 'mixpanel.people.set(%s);' EVENT_CODE = "mixpanel.track('%(name)s', %(properties)s);" EVENT_CONTEXT_KEY = 'mixpanel_event' @@ -49,29 +49,38 @@ def mixpanel(parser, token): class MixpanelNode(Node): def __init__(self): self._token = get_required_setting( - 'MIXPANEL_API_TOKEN', MIXPANEL_API_TOKEN_RE, - "must be a string containing a 32-digit hexadecimal number") + 'MIXPANEL_API_TOKEN', + MIXPANEL_API_TOKEN_RE, + 'must be a string containing a 32-digit hexadecimal number', + ) def render(self, context): commands = [] identity = get_identity(context, 'mixpanel') if identity is not None: if isinstance(identity, dict): - commands.append(IDENTIFY_CODE % identity.get('id', identity.get('username'))) - commands.append(IDENTIFY_PROPERTIES % json.dumps(identity, sort_keys=True)) + commands.append( + IDENTIFY_CODE % identity.get('id', identity.get('username')) + ) + commands.append( + IDENTIFY_PROPERTIES % json.dumps(identity, sort_keys=True) + ) else: commands.append(IDENTIFY_CODE % identity) try: name, properties = context[EVENT_CONTEXT_KEY] - commands.append(EVENT_CODE % { - 'name': name, - 'properties': json.dumps(properties, sort_keys=True), - }) + commands.append( + EVENT_CODE + % { + 'name': name, + 'properties': json.dumps(properties, sort_keys=True), + } + ) except KeyError: pass html = TRACKING_CODE % { 'token': self._token, - 'commands': " ".join(commands), + 'commands': ' '.join(commands), } if is_internal_ip(context, 'MIXPANEL'): html = disable_html(html, 'Mixpanel') diff --git a/analytical/templatetags/olark.py b/analytical/templatetags/olark.py index 833a01f..34e5c4f 100644 --- a/analytical/templatetags/olark.py +++ b/analytical/templatetags/olark.py @@ -24,16 +24,29 @@ EMAIL_CODE = "olark('api.visitor.updateEmailAddress', {{emailAddress: '{0}'}});" EMAIL_CONTEXT_KEY = 'olark_email' STATUS_CODE = "olark('api.chat.updateVisitorStatus', {snippet: %s});" STATUS_CONTEXT_KEY = 'olark_status' -MESSAGE_CODE = "olark.configure('locale.%(key)s', \"%(msg)s\");" +MESSAGE_CODE = 'olark.configure(\'locale.%(key)s\', "%(msg)s");' MESSAGE_KEYS = { - "welcome_title", "chatting_title", "unavailable_title", - "busy_title", "away_message", "loading_title", "welcome_message", - "busy_message", "chat_input_text", "name_input_text", - "email_input_text", "offline_note_message", "send_button_text", - "offline_note_thankyou_text", "offline_note_error_text", - "offline_note_sending_text", "operator_is_typing_text", - "operator_has_stopped_typing_text", "introduction_error_text", - "introduction_messages", "introduction_submit_button_text", + 'welcome_title', + 'chatting_title', + 'unavailable_title', + 'busy_title', + 'away_message', + 'loading_title', + 'welcome_message', + 'busy_message', + 'chat_input_text', + 'name_input_text', + 'email_input_text', + 'offline_note_message', + 'send_button_text', + 'offline_note_thankyou_text', + 'offline_note_error_text', + 'offline_note_sending_text', + 'operator_is_typing_text', + 'operator_has_stopped_typing_text', + 'introduction_error_text', + 'introduction_messages', + 'introduction_submit_button_text', } register = Library() @@ -56,8 +69,10 @@ def olark(parser, token): class OlarkNode(Node): def __init__(self): self.site_id = get_required_setting( - 'OLARK_SITE_ID', SITE_ID_RE, - "must be a string looking like 'XXXX-XXX-XX-XXXX'") + 'OLARK_SITE_ID', + SITE_ID_RE, + "must be a string looking like 'XXXX-XXX-XX-XXXX'", + ) def render(self, context): extra_code = [] @@ -76,21 +91,22 @@ class OlarkNode(Node): except KeyError: pass try: - extra_code.append(STATUS_CODE % json.dumps(context[STATUS_CONTEXT_KEY], - sort_keys=True)) + extra_code.append( + STATUS_CODE % json.dumps(context[STATUS_CONTEXT_KEY], sort_keys=True) + ) except KeyError: pass extra_code.extend(self._get_configuration(context)) html = SETUP_CODE % { 'site_id': self.site_id, - 'extra_code': " ".join(extra_code), + 'extra_code': ' '.join(extra_code), } return html def _get_nickname(self, user): name = user.get_full_name() if name: - return "%s (%s)" % (name, user.username) + return '%s (%s)' % (name, user.username) else: return user.username diff --git a/analytical/templatetags/optimizely.py b/analytical/templatetags/optimizely.py index 83e72b3..91a8efc 100644 --- a/analytical/templatetags/optimizely.py +++ b/analytical/templatetags/optimizely.py @@ -33,8 +33,10 @@ def optimizely(parser, token): class OptimizelyNode(Node): def __init__(self): self.account_number = get_required_setting( - 'OPTIMIZELY_ACCOUNT_NUMBER', ACCOUNT_NUMBER_RE, - "must be a string looking like 'XXXXXXX'") + 'OPTIMIZELY_ACCOUNT_NUMBER', + ACCOUNT_NUMBER_RE, + "must be a string looking like 'XXXXXXX'", + ) def render(self, context): html = SETUP_CODE % {'account_number': self.account_number} diff --git a/analytical/templatetags/performable.py b/analytical/templatetags/performable.py index de84bcf..302a025 100644 --- a/analytical/templatetags/performable.py +++ b/analytical/templatetags/performable.py @@ -56,14 +56,14 @@ def performable(parser, token): class PerformableNode(Node): def __init__(self): self.api_key = get_required_setting( - 'PERFORMABLE_API_KEY', API_KEY_RE, - "must be a string looking like 'XXXXX'") + 'PERFORMABLE_API_KEY', API_KEY_RE, "must be a string looking like 'XXXXX'" + ) def render(self, context): html = SETUP_CODE % {'api_key': self.api_key} identity = get_identity(context, 'performable') if identity is not None: - html = "%s%s" % (IDENTIFY_CODE % identity, html) + html = '%s%s' % (IDENTIFY_CODE % identity, html) if is_internal_ip(context, 'PERFORMABLE'): html = disable_html(html, 'Performable') return html @@ -74,10 +74,13 @@ def performable_embed(hostname, page_id): """ Include a Performable landing page. """ - return mark_safe(EMBED_CODE % { - 'hostname': hostname, - 'page_id': page_id, - }) + return mark_safe( + EMBED_CODE + % { + 'hostname': hostname, + 'page_id': page_id, + } + ) def contribute_to_analytical(add_node): diff --git a/analytical/templatetags/rating_mailru.py b/analytical/templatetags/rating_mailru.py index bdcb444..0eaa5d8 100644 --- a/analytical/templatetags/rating_mailru.py +++ b/analytical/templatetags/rating_mailru.py @@ -48,8 +48,10 @@ def rating_mailru(parser, token): class RatingMailruNode(Node): def __init__(self): self.counter_id = get_required_setting( - 'RATING_MAILRU_COUNTER_ID', COUNTER_ID_RE, - "must be (a string containing) a number'") + 'RATING_MAILRU_COUNTER_ID', + COUNTER_ID_RE, + "must be (a string containing) a number'", + ) def render(self, context): html = COUNTER_CODE % { diff --git a/analytical/templatetags/snapengage.py b/analytical/templatetags/snapengage.py index ce54c79..6c13001 100644 --- a/analytical/templatetags/snapengage.py +++ b/analytical/templatetags/snapengage.py @@ -24,7 +24,9 @@ FORM_POSITION_TOP_RIGHT = 'tr' FORM_POSITION_BOTTOM_LEFT = 'bl' FORM_POSITION_BOTTOM_RIGHT = 'br' -WIDGET_ID_RE = re.compile(r'^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$') +WIDGET_ID_RE = re.compile( + r'^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' +) SETUP_CODE = """ """ + ) def test_node(self): - assert GaugesNode().render(Context()) == """ + assert ( + GaugesNode().render(Context()) + == """ """ + ) @override_settings(GAUGES_SITE_ID=None) def test_no_account_number(self): diff --git a/tests/unit/test_tag_google_analytics.py b/tests/unit/test_tag_google_analytics.py index 35220dd..14aaeb2 100644 --- a/tests/unit/test_tag_google_analytics.py +++ b/tests/unit/test_tag_google_analytics.py @@ -20,8 +20,10 @@ from analytical.templatetags.google_analytics import ( from analytical.utils import AnalyticalException -@override_settings(GOOGLE_ANALYTICS_PROPERTY_ID='UA-123456-7', - GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_SINGLE_DOMAIN) +@override_settings( + GOOGLE_ANALYTICS_PROPERTY_ID='UA-123456-7', + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_SINGLE_DOMAIN, +) class GoogleAnalyticsTagTestCase(TagTestCase): """ Tests for the ``google_analytics`` template tag. @@ -47,15 +49,19 @@ class GoogleAnalyticsTagTestCase(TagTestCase): with pytest.raises(AnalyticalException): GoogleAnalyticsNode() - @override_settings(GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_SUBDOMAINS, - GOOGLE_ANALYTICS_DOMAIN='example.com') + @override_settings( + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_SUBDOMAINS, + GOOGLE_ANALYTICS_DOMAIN='example.com', + ) def test_track_multiple_subdomains(self): r = GoogleAnalyticsNode().render(Context()) assert "_gaq.push(['_setDomainName', 'example.com']);" in r assert "_gaq.push(['_setAllowHash', false]);" in r - @override_settings(GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, - GOOGLE_ANALYTICS_DOMAIN='example.com') + @override_settings( + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, + GOOGLE_ANALYTICS_DOMAIN='example.com', + ) def test_track_multiple_domains(self): r = GoogleAnalyticsNode().render(Context()) assert "_gaq.push(['_setDomainName', 'example.com']);" in r @@ -63,12 +69,14 @@ class GoogleAnalyticsTagTestCase(TagTestCase): assert "_gaq.push(['_setAllowLinker', true]);" in r def test_custom_vars(self): - context = Context({ - 'google_analytics_var1': ('test1', 'foo'), - 'google_analytics_var2': ('test2', 'bar', SCOPE_VISITOR), - 'google_analytics_var4': ('test4', 'baz', SCOPE_SESSION), - 'google_analytics_var5': ('test5', 'qux', SCOPE_PAGE), - }) + context = Context( + { + 'google_analytics_var1': ('test1', 'foo'), + 'google_analytics_var2': ('test2', 'bar', SCOPE_VISITOR), + 'google_analytics_var4': ('test4', 'baz', SCOPE_SESSION), + 'google_analytics_var5': ('test5', 'qux', SCOPE_PAGE), + } + ) r = GoogleAnalyticsNode().render(context) assert "_gaq.push(['_setCustomVar', 1, 'test1', 'foo', 3]);" in r assert "_gaq.push(['_setCustomVar', 2, 'test2', 'bar', 1]);" in r @@ -83,10 +91,10 @@ class GoogleAnalyticsTagTestCase(TagTestCase): def test_display_advertising(self): with override_settings(GOOGLE_ANALYTICS_DISPLAY_ADVERTISING=False): r = GoogleAnalyticsNode().render(Context()) - assert "google-analytics.com/ga.js" in r + assert 'google-analytics.com/ga.js' in r with override_settings(GOOGLE_ANALYTICS_DISPLAY_ADVERTISING=True): r = GoogleAnalyticsNode().render(Context()) - assert "stats.g.doubleclick.net/dc.js" in r + assert 'stats.g.doubleclick.net/dc.js' in r @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) def test_render_internal_ip(self): @@ -185,10 +193,12 @@ class GoogleAnalyticsTagTestCase(TagTestCase): GoogleAnalyticsNode().render(context) -@override_settings(GOOGLE_ANALYTICS_PROPERTY_ID='UA-123456-7', - GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, - GOOGLE_ANALYTICS_DOMAIN=None, - ANALYTICAL_DOMAIN=None) +@override_settings( + GOOGLE_ANALYTICS_PROPERTY_ID='UA-123456-7', + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, + GOOGLE_ANALYTICS_DOMAIN=None, + ANALYTICAL_DOMAIN=None, +) class NoDomainTestCase(TestCase): def test_exception_without_domain(self): context = Context() diff --git a/tests/unit/test_tag_google_analytics_gtag.py b/tests/unit/test_tag_google_analytics_gtag.py index 6b5cd87..16c356f 100644 --- a/tests/unit/test_tag_google_analytics_gtag.py +++ b/tests/unit/test_tag_google_analytics_gtag.py @@ -64,21 +64,29 @@ class GoogleAnalyticsTagTestCase(TagTestCase): The user_id variable must be set according to google_analytics_gtag_identity variable in the context. """ - r = GoogleAnalyticsGTagNode().render(Context({ - 'google_analytics_gtag_identity': 'foo_gtag_identity', - 'analytical_identity': 'bar_analytical_identity', - 'user': User(username='test'), - })) + r = GoogleAnalyticsGTagNode().render( + Context( + { + 'google_analytics_gtag_identity': 'foo_gtag_identity', + 'analytical_identity': 'bar_analytical_identity', + 'user': User(username='test'), + } + ) + ) assert "gtag('set', {'user_id': 'foo_gtag_identity'});" in r def test_identity_context_general(self): """ The user_id variable must be set according to analytical_identity variable in the context. """ - r = GoogleAnalyticsGTagNode().render(Context({ - 'analytical_identity': 'bar_analytical_identity', - 'user': User(username='test'), - })) + r = GoogleAnalyticsGTagNode().render( + Context( + { + 'analytical_identity': 'bar_analytical_identity', + 'user': User(username='test'), + } + ) + ) assert "gtag('set', {'user_id': 'bar_analytical_identity'});" in r @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='G-12345678') diff --git a/tests/unit/test_tag_google_analytics_js.py b/tests/unit/test_tag_google_analytics_js.py index ed4b216..d0e53ab 100644 --- a/tests/unit/test_tag_google_analytics_js.py +++ b/tests/unit/test_tag_google_analytics_js.py @@ -17,8 +17,10 @@ from analytical.templatetags.google_analytics_js import ( from analytical.utils import AnalyticalException -@override_settings(GOOGLE_ANALYTICS_JS_PROPERTY_ID='UA-123456-7', - GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_SINGLE_DOMAIN) +@override_settings( + GOOGLE_ANALYTICS_JS_PROPERTY_ID='UA-123456-7', + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_SINGLE_DOMAIN, +) class GoogleAnalyticsTagTestCase(TagTestCase): """ Tests for the ``google_analytics_js`` template tag. @@ -26,19 +28,25 @@ class GoogleAnalyticsTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('google_analytics_js', 'google_analytics_js') - assert """(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + assert ( + """(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) -})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');""" in r +})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');""" + in r + ) assert "ga('create', 'UA-123456-7', 'auto', {});" in r assert "ga('send', 'pageview');" in r def test_node(self): r = GoogleAnalyticsJsNode().render(Context()) - assert """(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + assert ( + """(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) -})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');""" in r +})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');""" + in r + ) assert "ga('create', 'UA-123456-7', 'auto', {});" in r assert "ga('send', 'pageview');" in r @@ -52,27 +60,36 @@ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) with pytest.raises(AnalyticalException): GoogleAnalyticsJsNode() - @override_settings(GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_SUBDOMAINS, - GOOGLE_ANALYTICS_DOMAIN='example.com') + @override_settings( + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_SUBDOMAINS, + GOOGLE_ANALYTICS_DOMAIN='example.com', + ) def test_track_multiple_subdomains(self): r = GoogleAnalyticsJsNode().render(Context()) - assert """ga('create', 'UA-123456-7', 'auto', {"legacyCookieDomain": "example.com"}""" in r + assert ( + """ga('create', 'UA-123456-7', 'auto', {"legacyCookieDomain": "example.com"}""" + in r + ) - @override_settings(GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, - GOOGLE_ANALYTICS_DOMAIN='example.com') + @override_settings( + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, + GOOGLE_ANALYTICS_DOMAIN='example.com', + ) def test_track_multiple_domains(self): r = GoogleAnalyticsJsNode().render(Context()) assert "ga('create', 'UA-123456-7', 'auto', {" in r assert '"legacyCookieDomain": "example.com"' in r - assert '"allowLinker\": true' in r + assert '"allowLinker": true' in r def test_custom_vars(self): - context = Context({ - 'google_analytics_var1': ('test1', 'foo'), - 'google_analytics_var2': ('test2', 'bar'), - 'google_analytics_var4': ('test4', 1), - 'google_analytics_var5': ('test5', 2.2), - }) + context = Context( + { + 'google_analytics_var1': ('test1', 'foo'), + 'google_analytics_var2': ('test2', 'bar'), + 'google_analytics_var4': ('test4', 1), + 'google_analytics_var5': ('test5', 2.2), + } + ) r = GoogleAnalyticsJsNode().render(context) assert "ga('set', 'test1', 'foo');" in r assert "ga('set', 'test2', 'bar');" in r @@ -82,9 +99,12 @@ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) def test_display_advertising(self): with override_settings(GOOGLE_ANALYTICS_DISPLAY_ADVERTISING=True): r = GoogleAnalyticsJsNode().render(Context()) - assert """ga('create', 'UA-123456-7', 'auto', {}); + assert ( + """ga('create', 'UA-123456-7', 'auto', {}); ga('require', 'displayfeatures'); -ga('send', 'pageview');""" in r +ga('send', 'pageview');""" + in r + ) @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) def test_render_internal_ip(self): @@ -92,8 +112,7 @@ ga('send', 'pageview');""" in r req.META['REMOTE_ADDR'] = '1.1.1.1' context = Context({'request': req}) r = GoogleAnalyticsJsNode().render(context) - assert r.startswith( - '') @override_settings(GOOGLE_ANALYTICS_ANONYMIZE_IP=True) @@ -131,12 +150,17 @@ ga('send', 'pageview');""" in r @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE=0.0) def test_set_site_speed_sample_rate_min(self): r = GoogleAnalyticsJsNode().render(Context()) - assert """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 0});""" in r + assert ( + """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 0});""" in r + ) @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE='100.00') def test_set_site_speed_sample_rate_max(self): r = GoogleAnalyticsJsNode().render(Context()) - assert """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 100});""" in r + assert ( + """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 100});""" + in r + ) @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE=-1) def test_exception_whenset_site_speed_sample_rate_too_small(self): @@ -167,10 +191,12 @@ ga('send', 'pageview');""" in r GoogleAnalyticsJsNode().render(context) -@override_settings(GOOGLE_ANALYTICS_JS_PROPERTY_ID='UA-123456-7', - GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, - GOOGLE_ANALYTICS_DOMAIN=None, - ANALYTICAL_DOMAIN=None) +@override_settings( + GOOGLE_ANALYTICS_JS_PROPERTY_ID='UA-123456-7', + GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, + GOOGLE_ANALYTICS_DOMAIN=None, + ANALYTICAL_DOMAIN=None, +) class NoDomainTestCase(TestCase): def test_exception_without_domain(self): context = Context() diff --git a/tests/unit/test_tag_gosquared.py b/tests/unit/test_tag_gosquared.py index 46ef40d..5c27653 100644 --- a/tests/unit/test_tag_gosquared.py +++ b/tests/unit/test_tag_gosquared.py @@ -39,17 +39,25 @@ class GoSquaredTagTestCase(TagTestCase): @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_auto_identify(self): - r = GoSquaredNode().render(Context({ - 'user': User(username='test', first_name='Test', last_name='User'), - })) + r = GoSquaredNode().render( + Context( + { + 'user': User(username='test', first_name='Test', last_name='User'), + } + ) + ) assert 'GoSquared.UserName = "Test User";' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_manual_identify(self): - r = GoSquaredNode().render(Context({ - 'user': User(username='test', first_name='Test', last_name='User'), - 'gosquared_identity': 'test_identity', - })) + r = GoSquaredNode().render( + Context( + { + 'user': User(username='test', first_name='Test', last_name='User'), + 'gosquared_identity': 'test_identity', + } + ) + ) assert 'GoSquared.UserName = "test_identity";' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) diff --git a/tests/unit/test_tag_heap.py b/tests/unit/test_tag_heap.py index 37ff046..906369c 100644 --- a/tests/unit/test_tag_heap.py +++ b/tests/unit/test_tag_heap.py @@ -20,11 +20,11 @@ class HeapTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('heap', 'heap') - assert "123456789" in r + assert '123456789' in r def test_node(self): r = HeapNode().render(Context({})) - assert "123456789" in r + assert '123456789' in r def test_tags_take_no_args(self): with pytest.raises(TemplateSyntaxError, match="'heap' takes no arguments"): diff --git a/tests/unit/test_tag_hotjar.py b/tests/unit/test_tag_hotjar.py index 4ad0f75..ba7f42e 100644 --- a/tests/unit/test_tag_hotjar.py +++ b/tests/unit/test_tag_hotjar.py @@ -1,6 +1,7 @@ """ Tests for the Hotjar template tags. """ + import pytest from django.http import HttpRequest from django.template import Context, Template, TemplateSyntaxError @@ -27,7 +28,6 @@ expected_html = """\ @override_settings(HOTJAR_SITE_ID='123456789') class HotjarTagTestCase(TagTestCase): - maxDiff = None def test_tag(self): @@ -44,13 +44,14 @@ class HotjarTagTestCase(TagTestCase): @override_settings(HOTJAR_SITE_ID=None) def test_no_id(self): - with pytest.raises(AnalyticalException, match="HOTJAR_SITE_ID setting is not set"): + with pytest.raises( + AnalyticalException, match='HOTJAR_SITE_ID setting is not set' + ): HotjarNode() @override_settings(HOTJAR_SITE_ID='invalid') def test_invalid_id(self): - expected_pattern = ( - r"^HOTJAR_SITE_ID setting: must be \(a string containing\) a number: 'invalid'$") + expected_pattern = r"^HOTJAR_SITE_ID setting: must be \(a string containing\) a number: 'invalid'$" with pytest.raises(AnalyticalException, match=expected_pattern): HotjarNode() @@ -61,11 +62,13 @@ class HotjarTagTestCase(TagTestCase): context = Context({'request': request}) actual_html = HotjarNode().render(context) - disabled_html = '\n'.join([ + disabled_html = '\n'.join( + [ '', - ]) + ] + ) assert disabled_html == actual_html def test_contribute_to_analytical(self): diff --git a/tests/unit/test_tag_intercom.py b/tests/unit/test_tag_intercom.py index 149dfb7..f71e64a 100644 --- a/tests/unit/test_tag_intercom.py +++ b/tests/unit/test_tag_intercom.py @@ -15,7 +15,7 @@ from analytical.templatetags.intercom import IntercomNode, intercom_user_hash from analytical.utils import AnalyticalException -@override_settings(INTERCOM_APP_ID="abc123xyz") +@override_settings(INTERCOM_APP_ID='abc123xyz') class IntercomTagTestCase(TagTestCase): """ Tests for the ``intercom`` template tag. @@ -23,7 +23,9 @@ class IntercomTagTestCase(TagTestCase): def test_tag(self): rendered_tag = self.render_tag('intercom', 'intercom') - assert rendered_tag.strip().startswith(' -""" % {'user_id': user.pk} # noqa +""" + % {'user_id': user.pk} + ) # noqa @override_settings(INTERCOM_APP_ID=None) def test_no_account_number(self): @@ -59,32 +65,40 @@ class IntercomTagTestCase(TagTestCase): username='test', first_name='Firstname', last_name='Lastname', - email="test@example.com", + email='test@example.com', date_joined=now, ) - r = IntercomNode().render(Context({ - 'user': user, - })) + r = IntercomNode().render( + Context( + { + 'user': user, + } + ) + ) assert ( 'window.intercomSettings = {"app_id": "abc123xyz", "created_at": 1397074500, ' f'"email": "test@example.com", "name": "Firstname Lastname", "user_id": {user.pk}}};' ) in r def test_custom(self): - r = IntercomNode().render(Context({ - 'intercom_var1': 'val1', - 'intercom_var2': 'val2' - })) + r = IntercomNode().render( + Context({'intercom_var1': 'val1', 'intercom_var2': 'val2'}) + ) assert 'var1": "val1", "var2": "val2"' in r def test_identify_name_and_email(self): - r = IntercomNode().render(Context({ - 'user': User( - username='test', - first_name='Firstname', - last_name='Lastname', - email="test@example.com"), - })) + r = IntercomNode().render( + Context( + { + 'user': User( + username='test', + first_name='Firstname', + last_name='Lastname', + email='test@example.com', + ), + } + ) + ) assert '"email": "test@example.com", "name": "Firstname Lastname"' in r def test_identify_username_no_email(self): @@ -92,17 +106,25 @@ class IntercomTagTestCase(TagTestCase): assert '"name": "test"' in r, r def test_no_identify_when_explicit_name(self): - r = IntercomNode().render(Context({ - 'intercom_name': 'explicit', - 'user': User(username='implicit'), - })) + r = IntercomNode().render( + Context( + { + 'intercom_name': 'explicit', + 'user': User(username='implicit'), + } + ) + ) assert '"name": "explicit"' in r, r def test_no_identify_when_explicit_email(self): - r = IntercomNode().render(Context({ - 'intercom_email': 'explicit', - 'user': User(username='implicit'), - })) + r = IntercomNode().render( + Context( + { + 'intercom_email': 'explicit', + 'user': User(username='implicit'), + } + ) + ) assert '"email": "explicit"' in r, r @override_settings(INTERCOM_HMAC_SECRET_KEY='secret') @@ -135,10 +157,14 @@ class IntercomTagTestCase(TagTestCase): """ 'user_hash' of context-provided `user_id`. """ - attrs = IntercomNode()._get_custom_attrs(Context({ - 'intercom_email': 'test@example.com', - 'intercom_user_id': '5', - })) + attrs = IntercomNode()._get_custom_attrs( + Context( + { + 'intercom_email': 'test@example.com', + 'intercom_user_id': '5', + } + ) + ) assert attrs == { 'created_at': None, 'email': 'test@example.com', @@ -152,9 +178,13 @@ class IntercomTagTestCase(TagTestCase): """ 'user_hash' of context-provided `email`. """ - attrs = IntercomNode()._get_custom_attrs(Context({ - 'intercom_email': 'test@example.com', - })) + attrs = IntercomNode()._get_custom_attrs( + Context( + { + 'intercom_email': 'test@example.com', + } + ) + ) assert attrs == { 'created_at': None, 'email': 'test@example.com', diff --git a/tests/unit/test_tag_kiss_insights.py b/tests/unit/test_tag_kiss_insights.py index e36e91b..e2e96fb 100644 --- a/tests/unit/test_tag_kiss_insights.py +++ b/tests/unit/test_tag_kiss_insights.py @@ -20,11 +20,11 @@ class KissInsightsTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('kiss_insights', 'kiss_insights') - assert "//s3.amazonaws.com/ki.js/12345/abc.js" in r + assert '//s3.amazonaws.com/ki.js/12345/abc.js' in r def test_node(self): r = KissInsightsNode().render(Context()) - assert "//s3.amazonaws.com/ki.js/12345/abc.js" in r + assert '//s3.amazonaws.com/ki.js/12345/abc.js' in r @override_settings(KISS_INSIGHTS_ACCOUNT_NUMBER=None) def test_no_account_number(self): diff --git a/tests/unit/test_tag_kiss_metrics.py b/tests/unit/test_tag_kiss_metrics.py index 8abc274..129b435 100644 --- a/tests/unit/test_tag_kiss_metrics.py +++ b/tests/unit/test_tag_kiss_metrics.py @@ -21,11 +21,17 @@ class KissMetricsTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('kiss_metrics', 'kiss_metrics') - assert "//doug1izaerwt3.cloudfront.net/0123456789abcdef0123456789abcdef01234567.1.js" in r + assert ( + '//doug1izaerwt3.cloudfront.net/0123456789abcdef0123456789abcdef01234567.1.js' + in r + ) def test_node(self): r = KissMetricsNode().render(Context()) - assert "//doug1izaerwt3.cloudfront.net/0123456789abcdef0123456789abcdef01234567.1.js" in r + assert ( + '//doug1izaerwt3.cloudfront.net/0123456789abcdef0123456789abcdef01234567.1.js' + in r + ) @override_settings(KISS_METRICS_API_KEY=None) def test_no_api_key(self): @@ -53,22 +59,37 @@ class KissMetricsTagTestCase(TagTestCase): assert "_kmq.push(['identify', " not in r def test_event(self): - r = KissMetricsNode().render(Context({ - 'kiss_metrics_event': ('test_event', {'prop1': 'val1', 'prop2': 'val2'}), - })) + r = KissMetricsNode().render( + Context( + { + 'kiss_metrics_event': ( + 'test_event', + {'prop1': 'val1', 'prop2': 'val2'}, + ), + } + ) + ) assert "_kmq.push(['record', 'test_event', " '{"prop1": "val1", "prop2": "val2"}]);' in r def test_property(self): - r = KissMetricsNode().render(Context({ - 'kiss_metrics_properties': {'prop1': 'val1', 'prop2': 'val2'}, - })) + r = KissMetricsNode().render( + Context( + { + 'kiss_metrics_properties': {'prop1': 'val1', 'prop2': 'val2'}, + } + ) + ) assert '_kmq.push([\'set\', {"prop1": "val1", "prop2": "val2"}]);' in r def test_alias(self): - r = KissMetricsNode().render(Context({ - 'kiss_metrics_alias': {'test': 'test_alias'}, - })) + r = KissMetricsNode().render( + Context( + { + 'kiss_metrics_alias': {'test': 'test_alias'}, + } + ) + ) assert "_kmq.push(['alias', 'test', 'test_alias']);" in r @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) diff --git a/tests/unit/test_tag_luckyorange.py b/tests/unit/test_tag_luckyorange.py index b22d053..20b56f6 100644 --- a/tests/unit/test_tag_luckyorange.py +++ b/tests/unit/test_tag_luckyorange.py @@ -1,6 +1,7 @@ """ Tests for the Lucky Orange template tags. """ + import pytest from django.http import HttpRequest from django.template import Context, Template, TemplateSyntaxError @@ -25,7 +26,6 @@ window.__lo_site_id = 123456; @override_settings(LUCKYORANGE_SITE_ID='123456') class LuckyOrangeTagTestCase(TagTestCase): - maxDiff = None def test_tag(self): @@ -37,18 +37,23 @@ class LuckyOrangeTagTestCase(TagTestCase): assert expected_html == html def test_tags_take_no_args(self): - with pytest.raises(TemplateSyntaxError, match="'luckyorange' takes no arguments"): - Template('{% load luckyorange %}{% luckyorange "arg" %}').render(Context({})) + with pytest.raises( + TemplateSyntaxError, match="'luckyorange' takes no arguments" + ): + Template('{% load luckyorange %}{% luckyorange "arg" %}').render( + Context({}) + ) @override_settings(LUCKYORANGE_SITE_ID=None) def test_no_id(self): - with pytest.raises(AnalyticalException, match="LUCKYORANGE_SITE_ID setting is not set"): + with pytest.raises( + AnalyticalException, match='LUCKYORANGE_SITE_ID setting is not set' + ): LuckyOrangeNode() @override_settings(LUCKYORANGE_SITE_ID='invalid') def test_invalid_id(self): - expected_pattern = ( - r"^LUCKYORANGE_SITE_ID setting: must be \(a string containing\) a number: 'invalid'$") + expected_pattern = r"^LUCKYORANGE_SITE_ID setting: must be \(a string containing\) a number: 'invalid'$" with pytest.raises(AnalyticalException, match=expected_pattern): LuckyOrangeNode() @@ -59,11 +64,13 @@ class LuckyOrangeTagTestCase(TagTestCase): context = Context({'request': request}) actual_html = LuckyOrangeNode().render(context) - disabled_html = '\n'.join([ + disabled_html = '\n'.join( + [ '', - ]) + ] + ) assert disabled_html == actual_html def test_contribute_to_analytical(self): diff --git a/tests/unit/test_tag_matomo.py b/tests/unit/test_tag_matomo.py index 6e9a850..0765c12 100644 --- a/tests/unit/test_tag_matomo.py +++ b/tests/unit/test_tag_matomo.py @@ -31,20 +31,19 @@ class MatomoTagTestCase(TagTestCase): assert "_paq.push(['setSiteId', 345]);" in r assert 'img src="//example.com/matomo.php?idsite=345"' in r - @override_settings(MATOMO_DOMAIN_PATH='example.com/matomo', - MATOMO_SITE_ID='345') + @override_settings(MATOMO_DOMAIN_PATH='example.com/matomo', MATOMO_SITE_ID='345') def test_domain_path_valid(self): r = self.render_tag('matomo', 'matomo') assert '"//example.com/matomo/"' in r - @override_settings(MATOMO_DOMAIN_PATH='example.com:1234', - MATOMO_SITE_ID='345') + @override_settings(MATOMO_DOMAIN_PATH='example.com:1234', MATOMO_SITE_ID='345') def test_domain_port_valid(self): r = self.render_tag('matomo', 'matomo') assert '"//example.com:1234/";' in r - @override_settings(MATOMO_DOMAIN_PATH='example.com:1234/matomo', - MATOMO_SITE_ID='345') + @override_settings( + MATOMO_DOMAIN_PATH='example.com:1234/matomo', MATOMO_SITE_ID='345' + ) def test_domain_port_path_valid(self): r = self.render_tag('matomo', 'matomo') assert '"//example.com:1234/matomo/"' in r @@ -104,46 +103,54 @@ class MatomoTagTestCase(TagTestCase): assert r.endswith('-->') def test_uservars(self): - context = Context({'matomo_vars': [(1, 'foo', 'foo_val'), - (2, 'bar', 'bar_val', 'page'), - (3, 'spam', 'spam_val', 'visit')]}) + context = Context( + { + 'matomo_vars': [ + (1, 'foo', 'foo_val'), + (2, 'bar', 'bar_val', 'page'), + (3, 'spam', 'spam_val', 'visit'), + ] + } + ) r = MatomoNode().render(context) - for var_code in ['_paq.push(["setCustomVariable", 1, "foo", "foo_val", "page"]);', - '_paq.push(["setCustomVariable", 2, "bar", "bar_val", "page"]);', - '_paq.push(["setCustomVariable", 3, "spam", "spam_val", "visit"]);']: + for var_code in [ + '_paq.push(["setCustomVariable", 1, "foo", "foo_val", "page"]);', + '_paq.push(["setCustomVariable", 2, "bar", "bar_val", "page"]);', + '_paq.push(["setCustomVariable", 3, "spam", "spam_val", "visit"]);', + ]: assert var_code in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_default_usertrack(self): - context = Context({ - 'user': User(username='BDFL', first_name='Guido', last_name='van Rossum') - }) + context = Context( + {'user': User(username='BDFL', first_name='Guido', last_name='van Rossum')} + ) r = MatomoNode().render(context) var_code = '_paq.push(["setUserId", "BDFL"]);' assert var_code in r def test_matomo_usertrack(self): - context = Context({ - 'matomo_identity': 'BDFL' - }) + context = Context({'matomo_identity': 'BDFL'}) r = MatomoNode().render(context) var_code = '_paq.push(["setUserId", "BDFL"]);' assert var_code in r def test_analytical_usertrack(self): - context = Context({ - 'analytical_identity': 'BDFL' - }) + context = Context({'analytical_identity': 'BDFL'}) r = MatomoNode().render(context) var_code = '_paq.push(["setUserId", "BDFL"]);' assert var_code in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_disable_usertrack(self): - context = Context({ - 'user': User(username='BDFL', first_name='Guido', last_name='van Rossum'), - 'matomo_identity': None - }) + context = Context( + { + 'user': User( + username='BDFL', first_name='Guido', last_name='van Rossum' + ), + 'matomo_identity': None, + } + ) r = MatomoNode().render(context) var_code = '_paq.push(["setUserId", "BDFL"]);' assert var_code not in r diff --git a/tests/unit/test_tag_mixpanel.py b/tests/unit/test_tag_mixpanel.py index 503dff2..8b2cb04 100644 --- a/tests/unit/test_tag_mixpanel.py +++ b/tests/unit/test_tag_mixpanel.py @@ -50,12 +50,19 @@ class MixpanelTagTestCase(TagTestCase): @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): r = MixpanelNode().render(Context({'user': AnonymousUser()})) - assert "mixpanel.register_once({distinct_id:" not in r + assert 'mixpanel.register_once({distinct_id:' not in r def test_event(self): - r = MixpanelNode().render(Context({ - 'mixpanel_event': ('test_event', {'prop1': 'val1', 'prop2': 'val2'}), - })) + r = MixpanelNode().render( + Context( + { + 'mixpanel_event': ( + 'test_event', + {'prop1': 'val1', 'prop2': 'val2'}, + ), + } + ) + ) assert "mixpanel.track('test_event', " '{"prop1": "val1", "prop2": "val2"});' in r diff --git a/tests/unit/test_tag_olark.py b/tests/unit/test_tag_olark.py index 95079f2..34ba68b 100644 --- a/tests/unit/test_tag_olark.py +++ b/tests/unit/test_tag_olark.py @@ -38,10 +38,17 @@ class OlarkTestCase(TagTestCase): @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = OlarkNode().render(Context({ - 'user': User(username='test', first_name='Test', last_name='User'), - })) - assert "olark('api.chat.updateVisitorNickname', {snippet: 'Test User (test)'});" in r + r = OlarkNode().render( + Context( + { + 'user': User(username='test', first_name='Test', last_name='User'), + } + ) + ) + assert ( + "olark('api.chat.updateVisitorNickname', {snippet: 'Test User (test)'});" + in r + ) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): @@ -58,37 +65,41 @@ class OlarkTestCase(TagTestCase): '{snippet: "teststatus"});' in r def test_status_string_list(self): - r = OlarkNode().render(Context({ - 'olark_status': ['teststatus1', 'teststatus2'], - })) + r = OlarkNode().render( + Context( + { + 'olark_status': ['teststatus1', 'teststatus2'], + } + ) + ) assert "olark('api.chat.updateVisitorStatus', " '{snippet: ["teststatus1", "teststatus2"]});' in r def test_messages(self): messages = [ - "welcome_title", - "chatting_title", - "unavailable_title", - "busy_title", - "away_message", - "loading_title", - "welcome_message", - "busy_message", - "chat_input_text", - "name_input_text", - "email_input_text", - "offline_note_message", - "send_button_text", - "offline_note_thankyou_text", - "offline_note_error_text", - "offline_note_sending_text", - "operator_is_typing_text", - "operator_has_stopped_typing_text", - "introduction_error_text", - "introduction_messages", - "introduction_submit_button_text", + 'welcome_title', + 'chatting_title', + 'unavailable_title', + 'busy_title', + 'away_message', + 'loading_title', + 'welcome_message', + 'busy_message', + 'chat_input_text', + 'name_input_text', + 'email_input_text', + 'offline_note_message', + 'send_button_text', + 'offline_note_thankyou_text', + 'offline_note_error_text', + 'offline_note_sending_text', + 'operator_is_typing_text', + 'operator_has_stopped_typing_text', + 'introduction_error_text', + 'introduction_messages', + 'introduction_submit_button_text', ] vars = {f'olark_{m}': m for m in messages} r = OlarkNode().render(Context(vars)) for m in messages: - assert f"olark.configure('locale.{m}', \"{m}\");" in r + assert f'olark.configure(\'locale.{m}\', "{m}");' in r diff --git a/tests/unit/test_tag_rating_mailru.py b/tests/unit/test_tag_rating_mailru.py index 16aa794..4493b72 100644 --- a/tests/unit/test_tag_rating_mailru.py +++ b/tests/unit/test_tag_rating_mailru.py @@ -20,11 +20,11 @@ class RatingMailruTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('rating_mailru', 'rating_mailru') - assert "counter?id=1234567;js=na" in r + assert 'counter?id=1234567;js=na' in r def test_node(self): r = RatingMailruNode().render(Context({})) - assert "counter?id=1234567;js=na" in r + assert 'counter?id=1234567;js=na' in r @override_settings(RATING_MAILRU_COUNTER_ID=None) def test_no_site_id(self): diff --git a/tests/unit/test_tag_snapengage.py b/tests/unit/test_tag_snapengage.py index e1f6ca2..51ac8ef 100644 --- a/tests/unit/test_tag_snapengage.py +++ b/tests/unit/test_tag_snapengage.py @@ -29,7 +29,7 @@ WIDGET_ID = 'ec329c69-0bf0-4db8-9b77-3f8150fb977e' SNAPENGAGE_WIDGET_ID=WIDGET_ID, SNAPENGAGE_BUTTON=BUTTON_STYLE_DEFAULT, SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_LEFT, - SNAPENGAGE_BUTTON_OFFSET="55%", + SNAPENGAGE_BUTTON_OFFSET='55%', ) class SnapEngageTestCase(TagTestCase): """ @@ -38,11 +38,15 @@ class SnapEngageTestCase(TagTestCase): def test_tag(self): r = self.render_tag('snapengage', 'snapengage') - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + ) def test_node(self): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + ) @override_settings(SNAPENGAGE_WIDGET_ID=None) def test_no_site_id(self): @@ -55,142 +59,220 @@ class SnapEngageTestCase(TagTestCase): SnapEngageNode() def test_no_button(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button': BUTTON_STYLE_NONE, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_button': BUTTON_STYLE_NONE, + } + ) + ) assert 'SnapABug.init("ec329c69-0bf0-4db8-9b77-3f8150fb977e")' in r with override_settings(SNAPENGAGE_BUTTON=BUTTON_STYLE_NONE): r = SnapEngageNode().render(Context()) assert 'SnapABug.init("ec329c69-0bf0-4db8-9b77-3f8150fb977e")' in r def test_live_button(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button': BUTTON_STYLE_LIVE, - })) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%",true);' in r + r = SnapEngageNode().render( + Context( + { + 'snapengage_button': BUTTON_STYLE_LIVE, + } + ) + ) + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%",true);' + in r + ) with override_settings(SNAPENGAGE_BUTTON=BUTTON_STYLE_LIVE): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%",true);' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%",true);' + in r + ) def test_custom_button(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button': "http://www.example.com/button.png", - })) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + r = SnapEngageNode().render( + Context( + { + 'snapengage_button': 'http://www.example.com/button.png', + } + ) + ) + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + ) assert 'SnapABug.setButton("http://www.example.com/button.png");' in r - with override_settings( - SNAPENGAGE_BUTTON="http://www.example.com/button.png"): + with override_settings(SNAPENGAGE_BUTTON='http://www.example.com/button.png'): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","55%");' + in r + ) assert 'SnapABug.setButton("http://www.example.com/button.png");' in r def test_button_location_right(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location': BUTTON_LOCATION_RIGHT, - })) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","1","55%");' in r + r = SnapEngageNode().render( + Context( + { + 'snapengage_button_location': BUTTON_LOCATION_RIGHT, + } + ) + ) + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","1","55%");' in r + ) with override_settings(SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_RIGHT): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","1","55%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","1","55%");' + in r + ) def test_button_location_top(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location': BUTTON_LOCATION_TOP, - })) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","2","55%");' in r + r = SnapEngageNode().render( + Context( + { + 'snapengage_button_location': BUTTON_LOCATION_TOP, + } + ) + ) + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","2","55%");' in r + ) with override_settings(SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_TOP): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","2","55%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","2","55%");' + in r + ) def test_button_location_bottom(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location': BUTTON_LOCATION_BOTTOM, - })) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","3","55%");' in r - with override_settings( - SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_BOTTOM): + r = SnapEngageNode().render( + Context( + { + 'snapengage_button_location': BUTTON_LOCATION_BOTTOM, + } + ) + ) + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","3","55%");' in r + ) + with override_settings(SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_BOTTOM): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","3","55%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","3","55%");' + in r + ) def test_button_offset(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location_offset': "30%", - })) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","30%");' in r - with override_settings(SNAPENGAGE_BUTTON_LOCATION_OFFSET="30%"): + r = SnapEngageNode().render( + Context( + { + 'snapengage_button_location_offset': '30%', + } + ) + ) + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","30%");' in r + ) + with override_settings(SNAPENGAGE_BUTTON_LOCATION_OFFSET='30%'): r = SnapEngageNode().render(Context()) - assert 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","30%");' in r + assert ( + 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0","30%");' + in r + ) def test_button_effect(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_effect': "-4px", - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_button_effect': '-4px', + } + ) + ) assert 'SnapABug.setButtonEffect("-4px");' in r - with override_settings(SNAPENGAGE_BUTTON_EFFECT="-4px"): + with override_settings(SNAPENGAGE_BUTTON_EFFECT='-4px'): r = SnapEngageNode().render(Context()) assert 'SnapABug.setButtonEffect("-4px");' in r def test_form_position(self): - r = SnapEngageNode().render(Context({ - 'snapengage_form_position': FORM_POSITION_TOP_LEFT, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_form_position': FORM_POSITION_TOP_LEFT, + } + ) + ) assert 'SnapABug.setChatFormPosition("tl");' in r with override_settings(SNAPENGAGE_FORM_POSITION=FORM_POSITION_TOP_LEFT): r = SnapEngageNode().render(Context()) assert 'SnapABug.setChatFormPosition("tl");' in r def test_form_top_position(self): - r = SnapEngageNode().render(Context({ - 'snapengage_form_top_position': 40, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_form_top_position': 40, + } + ) + ) assert 'SnapABug.setFormTopPosition(40);' in r with override_settings(SNAPENGAGE_FORM_TOP_POSITION=40): r = SnapEngageNode().render(Context()) assert 'SnapABug.setFormTopPosition(40);' in r def test_domain(self): - r = SnapEngageNode().render(Context({ - 'snapengage_domain': "example.com"})) + r = SnapEngageNode().render(Context({'snapengage_domain': 'example.com'})) assert 'SnapABug.setDomain("example.com");' in r - with override_settings(SNAPENGAGE_DOMAIN="example.com"): + with override_settings(SNAPENGAGE_DOMAIN='example.com'): r = SnapEngageNode().render(Context()) assert 'SnapABug.setDomain("example.com");' in r def test_secure_connection(self): - r = SnapEngageNode().render(Context({ - 'snapengage_secure_connection': True})) + r = SnapEngageNode().render(Context({'snapengage_secure_connection': True})) assert 'SnapABug.setSecureConnexion();' in r with override_settings(SNAPENGAGE_SECURE_CONNECTION=True): r = SnapEngageNode().render(Context()) assert 'SnapABug.setSecureConnexion();' in r def test_show_offline(self): - r = SnapEngageNode().render(Context({ - 'snapengage_show_offline': False, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_show_offline': False, + } + ) + ) assert 'SnapABug.allowOffline(false);' in r with override_settings(SNAPENGAGE_SHOW_OFFLINE=False): r = SnapEngageNode().render(Context()) assert 'SnapABug.allowOffline(false);' in r def test_proactive_chat(self): - r = SnapEngageNode().render(Context({ - 'snapengage_proactive_chat': False})) + r = SnapEngageNode().render(Context({'snapengage_proactive_chat': False})) assert 'SnapABug.allowProactiveChat(false);' in r def test_screenshot(self): - r = SnapEngageNode().render(Context({ - 'snapengage_screenshots': False, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_screenshots': False, + } + ) + ) assert 'SnapABug.allowScreenshot(false);' in r with override_settings(SNAPENGAGE_SCREENSHOTS=False): r = SnapEngageNode().render(Context()) assert 'SnapABug.allowScreenshot(false);' in r def test_offline_screenshots(self): - r = SnapEngageNode().render(Context({ - 'snapengage_offline_screenshots': False, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_offline_screenshots': False, + } + ) + ) assert 'SnapABug.showScreenshotOption(false);' in r with override_settings(SNAPENGAGE_OFFLINE_SCREENSHOTS=False): r = SnapEngageNode().render(Context()) @@ -205,35 +287,55 @@ class SnapEngageTestCase(TagTestCase): @override_settings(SNAPENGAGE_READONLY_EMAIL=False) def test_email(self): - r = SnapEngageNode().render(Context({ - 'snapengage_email': 'test@example.com', - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_email': 'test@example.com', + } + ) + ) assert 'SnapABug.setUserEmail("test@example.com");' in r def test_email_readonly(self): - r = SnapEngageNode().render(Context({ - 'snapengage_email': 'test@example.com', - 'snapengage_readonly_email': True, - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_email': 'test@example.com', + 'snapengage_readonly_email': True, + } + ) + ) assert 'SnapABug.setUserEmail("test@example.com",true);' in r with override_settings(SNAPENGAGE_READONLY_EMAIL=True): - r = SnapEngageNode().render(Context({ - 'snapengage_email': 'test@example.com', - })) + r = SnapEngageNode().render( + Context( + { + 'snapengage_email': 'test@example.com', + } + ) + ) assert 'SnapABug.setUserEmail("test@example.com",true);' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = SnapEngageNode().render(Context({ - 'user': User(username='test', email='test@example.com'), - })) + r = SnapEngageNode().render( + Context( + { + 'user': User(username='test', email='test@example.com'), + } + ) + ) assert 'SnapABug.setUserEmail("test@example.com");' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = SnapEngageNode().render(Context({ - 'user': AnonymousUser(), - })) + r = SnapEngageNode().render( + Context( + { + 'user': AnonymousUser(), + } + ) + ) assert 'SnapABug.setUserEmail(' not in r def test_language(self): diff --git a/tests/unit/test_tag_spring_metrics.py b/tests/unit/test_tag_spring_metrics.py index c362721..c145216 100644 --- a/tests/unit/test_tag_spring_metrics.py +++ b/tests/unit/test_tag_spring_metrics.py @@ -39,9 +39,13 @@ class SpringMetricsTagTestCase(TagTestCase): @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = SpringMetricsNode().render(Context({ - 'user': User(email='test@test.com'), - })) + r = SpringMetricsNode().render( + Context( + { + 'user': User(email='test@test.com'), + } + ) + ) assert "_springMetq.push(['setdata', {'email': 'test@test.com'}]);" in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) @@ -50,10 +54,14 @@ class SpringMetricsTagTestCase(TagTestCase): assert "_springMetq.push(['setdata', {'email':" not in r def test_custom(self): - r = SpringMetricsNode().render(Context({ - 'spring_metrics_var1': 'val1', - 'spring_metrics_var2': 'val2', - })) + r = SpringMetricsNode().render( + Context( + { + 'spring_metrics_var1': 'val1', + 'spring_metrics_var2': 'val2', + } + ) + ) assert "_springMetq.push(['setdata', {'var1': 'val1'}]);" in r assert "_springMetq.push(['setdata', {'var2': 'val2'}]);" in r diff --git a/tests/unit/test_tag_uservoice.py b/tests/unit/test_tag_uservoice.py index 1d60eea..5fa91ee 100644 --- a/tests/unit/test_tag_uservoice.py +++ b/tests/unit/test_tag_uservoice.py @@ -19,11 +19,11 @@ class UserVoiceTagTestCase(TagTestCase): def test_node(self): r = UserVoiceNode().render(Context()) - assert "widget.uservoice.com/abcdefghijklmnopqrst.js" in r + assert 'widget.uservoice.com/abcdefghijklmnopqrst.js' in r def test_tag(self): r = self.render_tag('uservoice', 'uservoice') - assert "widget.uservoice.com/abcdefghijklmnopqrst.js" in r + assert 'widget.uservoice.com/abcdefghijklmnopqrst.js' in r @override_settings(USERVOICE_WIDGET_KEY=None) def test_no_key(self): @@ -43,7 +43,7 @@ class UserVoiceTagTestCase(TagTestCase): def test_overridden_key(self): vars = {'uservoice_widget_key': 'defghijklmnopqrstuvw'} r = UserVoiceNode().render(Context(vars)) - assert "widget.uservoice.com/defghijklmnopqrstuvw.js" in r + assert 'widget.uservoice.com/defghijklmnopqrstuvw.js' in r @override_settings(USERVOICE_WIDGET_OPTIONS={'key1': 'val1'}) def test_options(self): diff --git a/tests/unit/test_tag_woopra.py b/tests/unit/test_tag_woopra.py index dd1536f..fa97367 100644 --- a/tests/unit/test_tag_woopra.py +++ b/tests/unit/test_tag_woopra.py @@ -40,23 +40,35 @@ class WoopraTagTestCase(TagTestCase): @override_settings(WOOPRA_IDLE_TIMEOUT=1234) def test_idle_timeout(self): r = WoopraNode().render(Context({})) - assert 'var woo_settings = {"domain": "example.com", "idle_timeout": "1234"};' in r + assert ( + 'var woo_settings = {"domain": "example.com", "idle_timeout": "1234"};' in r + ) def test_custom(self): - r = WoopraNode().render(Context({ - 'woopra_var1': 'val1', - 'woopra_var2': 'val2', - })) + r = WoopraNode().render( + Context( + { + 'woopra_var1': 'val1', + 'woopra_var2': 'val2', + } + ) + ) assert 'var woo_visitor = {"var1": "val1", "var2": "val2"};' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_name_and_email(self): - r = WoopraNode().render(Context({ - 'user': User(username='test', - first_name='Firstname', - last_name='Lastname', - email="test@example.com"), - })) + r = WoopraNode().render( + Context( + { + 'user': User( + username='test', + first_name='Firstname', + last_name='Lastname', + email='test@example.com', + ), + } + ) + ) assert 'var woo_visitor = ' '{"email": "test@example.com", "name": "Firstname Lastname"};' in r @@ -67,18 +79,26 @@ class WoopraTagTestCase(TagTestCase): @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_no_identify_when_explicit_name(self): - r = WoopraNode().render(Context({ - 'woopra_name': 'explicit', - 'user': User(username='implicit'), - })) + r = WoopraNode().render( + Context( + { + 'woopra_name': 'explicit', + 'user': User(username='implicit'), + } + ) + ) assert 'var woo_visitor = {"name": "explicit"};' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_no_identify_when_explicit_email(self): - r = WoopraNode().render(Context({ - 'woopra_email': 'explicit', - 'user': User(username='implicit'), - })) + r = WoopraNode().render( + Context( + { + 'woopra_email': 'explicit', + 'user': User(username='implicit'), + } + ) + ) assert 'var woo_visitor = {"email": "explicit"};' in r @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) diff --git a/tests/unit/test_tag_yandex_metrica.py b/tests/unit/test_tag_yandex_metrica.py index a30b58a..b28dd8f 100644 --- a/tests/unit/test_tag_yandex_metrica.py +++ b/tests/unit/test_tag_yandex_metrica.py @@ -2,7 +2,6 @@ Tests for the Yandex.Metrica template tags and filters. """ - import pytest from django.http import HttpRequest from django.template import Context @@ -21,11 +20,11 @@ class YandexMetricaTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('yandex_metrica', 'yandex_metrica') - assert "w.yaCounter12345678 = new Ya.Metrika" in r + assert 'w.yaCounter12345678 = new Ya.Metrika' in r def test_node(self): r = YandexMetricaNode().render(Context({})) - assert "w.yaCounter12345678 = new Ya.Metrika" in r + assert 'w.yaCounter12345678 = new Ya.Metrika' in r @override_settings(YANDEX_METRICA_COUNTER_ID=None) def test_no_site_id(self): diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 816acda..8816d73 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -21,15 +21,14 @@ from analytical.utils import ( class SettingDeletedTestCase(TestCase): - @override_settings(USER_ID=None) def test_get_required_setting(self): """ Make sure using get_required_setting fails in the right place. """ - with pytest.raises(AnalyticalException, match="USER_ID setting is not set"): - get_required_setting("USER_ID", r"\d+", "invalid USER_ID") + with pytest.raises(AnalyticalException, match='USER_ID setting is not set'): + get_required_setting('USER_ID', r'\d+', 'invalid USER_ID') class MyUser(AbstractBaseUser): @@ -47,20 +46,30 @@ class GetIdentityTestCase(TestCase): assert get_id == 'fake_id' def test_custom_identity_specific_provider(self): - get_id = get_identity(Context({ - 'foo_provider_identity': 'bar', - 'analytical_identity': 'baz', - }), prefix='foo_provider') + get_id = get_identity( + Context( + { + 'foo_provider_identity': 'bar', + 'analytical_identity': 'baz', + } + ), + prefix='foo_provider', + ) assert get_id == 'bar' def test_custom_identity_general(self): - get_id = get_identity(Context({ - 'analytical_identity': 'baz', - }), prefix='foo_provider') + get_id = get_identity( + Context( + { + 'analytical_identity': 'baz', + } + ), + prefix='foo_provider', + ) assert get_id == 'baz' -@override_settings(ANALYTICAL_DOMAIN="example.org") +@override_settings(ANALYTICAL_DOMAIN='example.org') class GetDomainTestCase(TestCase): def test_get_service_domain_from_context(self): context = Context({'test_domain': 'example.com'}) @@ -70,7 +79,7 @@ class GetDomainTestCase(TestCase): context = Context({'analytical_domain': 'example.com'}) assert get_domain(context, 'test') == 'example.com' - @override_settings(TEST_DOMAIN="example.net") + @override_settings(TEST_DOMAIN='example.net') def test_get_service_domain_from_settings(self): context = Context() assert get_domain(context, 'test') == 'example.net' @@ -92,7 +101,6 @@ class GetDomainTestCase(TestCase): class InternalIpTestCase(TestCase): - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) def test_render_no_internal_ip(self): context = Context() diff --git a/tests/unit/utils.py b/tests/unit/utils.py index 6008e08..1b3ecd6 100644 --- a/tests/unit/utils.py +++ b/tests/unit/utils.py @@ -16,7 +16,7 @@ class TagTestCase(TestCase): def render_tag(self, library, tag, vars=None, request=None): if vars is None: vars = {} - t = Template("{%% load %s %%}{%% %s %%}" % (library, tag)) + t = Template('{%% load %s %%}{%% %s %%}' % (library, tag)) if request is not None: context = RequestContext(request, vars) else: