diff --git a/analytical/templatetags/analytical.py b/analytical/templatetags/analytical.py index bc9c262..2c17471 100644 --- a/analytical/templatetags/analytical.py +++ b/analytical/templatetags/analytical.py @@ -3,45 +3,44 @@ Analytical template tags and filters. """ import logging +from importlib import import_module from django import template from django.template import Node, TemplateSyntaxError -from importlib import import_module from analytical.utils import AnalyticalException - -TAG_LOCATIONS = ['head_top', 'head_bottom', 'body_top', 'body_bottom'] -TAG_POSITIONS = ['first', None, 'last'] +TAG_LOCATIONS = ["head_top", "head_bottom", "body_top", "body_bottom"] +TAG_POSITIONS = ["first", None, "last"] TAG_MODULES = [ - 'analytical.chartbeat', - 'analytical.clickmap', - 'analytical.clicky', - 'analytical.crazy_egg', - 'analytical.facebook_pixel', - 'analytical.gauges', - 'analytical.google_analytics', - 'analytical.google_analytics_js', - 'analytical.google_analytics_gtag', - 'analytical.gosquared', - 'analytical.hotjar', - 'analytical.hubspot', - 'analytical.intercom', - 'analytical.kiss_insights', - 'analytical.kiss_metrics', - 'analytical.luckyorange', - 'analytical.matomo', - 'analytical.mixpanel', - 'analytical.olark', - 'analytical.optimizely', - 'analytical.performable', - 'analytical.piwik', - 'analytical.rating_mailru', - 'analytical.snapengage', - 'analytical.spring_metrics', - 'analytical.uservoice', - 'analytical.woopra', - 'analytical.yandex_metrica', + "analytical.chartbeat", + "analytical.clickmap", + "analytical.clicky", + "analytical.crazy_egg", + "analytical.facebook_pixel", + "analytical.gauges", + "analytical.google_analytics", + "analytical.google_analytics_js", + "analytical.google_analytics_gtag", + "analytical.gosquared", + "analytical.hotjar", + "analytical.hubspot", + "analytical.intercom", + "analytical.kiss_insights", + "analytical.kiss_metrics", + "analytical.luckyorange", + "analytical.matomo", + "analytical.mixpanel", + "analytical.olark", + "analytical.optimizely", + "analytical.performable", + "analytical.piwik", + "analytical.rating_mailru", + "analytical.snapengage", + "analytical.spring_metrics", + "analytical.uservoice", + "analytical.woopra", + "analytical.yandex_metrica", ] logger = logging.getLogger(__name__) @@ -59,7 +58,7 @@ def _location_tag(location): for loc in TAG_LOCATIONS: - register.tag('analytical_%s' % loc, _location_tag(loc)) + register.tag("analytical_%s" % loc, _location_tag(loc)) class AnalyticalNode(Node): @@ -83,13 +82,14 @@ 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) + app_name, lib_name = path.rsplit(".", 1) return import_module("%s.templatetags.%s" % (app_name, lib_name)) diff --git a/analytical/templatetags/chartbeat.py b/analytical/templatetags/chartbeat.py index 1bdb9ab..c7b88c2 100644 --- a/analytical/templatetags/chartbeat.py +++ b/analytical/templatetags/chartbeat.py @@ -9,11 +9,12 @@ from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import is_internal_ip, disable_html, get_required_setting +from analytical.utils import disable_html, get_required_setting, is_internal_ip - -USER_ID_RE = re.compile(r'^\d+$') -INIT_CODE = """""" +USER_ID_RE = re.compile(r"^\d+$") +INIT_CODE = ( + """""" +) SETUP_CODE = """ """ # noqa -DOMAIN_CONTEXT_KEY = 'chartbeat_domain' +DOMAIN_CONTEXT_KEY = "chartbeat_domain" register = Library() @@ -77,24 +78,25 @@ def chartbeat_bottom(parser, token): class ChartbeatBottomNode(Node): def __init__(self): - self.user_id = get_required_setting('CHARTBEAT_USER_ID', USER_ID_RE, - "must be (a string containing) a number") + self.user_id = get_required_setting( + "CHARTBEAT_USER_ID", USER_ID_RE, "must be (a string containing) a number" + ) def render(self, context): - config = {'uid': self.user_id} + config = {"uid": self.user_id} domain = _get_domain(context) if domain is not None: - config['domain'] = domain - html = SETUP_CODE % {'config': json.dumps(config, sort_keys=True)} - if is_internal_ip(context, 'CHARTBEAT'): - html = disable_html(html, 'Chartbeat') + config["domain"] = domain + html = SETUP_CODE % {"config": json.dumps(config, sort_keys=True)} + if is_internal_ip(context, "CHARTBEAT"): + html = disable_html(html, "Chartbeat") return html def contribute_to_analytical(add_node): ChartbeatBottomNode() # ensure properly configured - add_node('head_top', ChartbeatTopNode, 'first') - add_node('body_bottom', ChartbeatBottomNode, 'last') + add_node("head_top", ChartbeatTopNode, "first") + add_node("body_bottom", ChartbeatBottomNode, "last") def _get_domain(context): @@ -103,10 +105,11 @@ def _get_domain(context): if domain is not None: return domain else: - if 'django.contrib.sites' not in settings.INSTALLED_APPS: + if "django.contrib.sites" not in settings.INSTALLED_APPS: return - elif getattr(settings, 'CHARTBEAT_AUTO_DOMAIN', True): + elif getattr(settings, "CHARTBEAT_AUTO_DOMAIN", True): from django.contrib.sites.models import Site + try: return Site.objects.get_current().domain except (ImproperlyConfigured, Site.DoesNotExist): # pylint: disable=E1101 diff --git a/analytical/templatetags/clickmap.py b/analytical/templatetags/clickmap.py index 2cdaf80..3f939c1 100644 --- a/analytical/templatetags/clickmap.py +++ b/analytical/templatetags/clickmap.py @@ -6,10 +6,9 @@ import re from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import is_internal_ip, disable_html, get_required_setting +from analytical.utils import disable_html, get_required_setting, is_internal_ip - -CLICKMAP_TRACKER_ID_RE = re.compile(r'^\w+$') +CLICKMAP_TRACKER_ID_RE = re.compile(r"^\w+$") TRACKING_CODE = """ '.\ - format(placeholder_url='//dnn506yrbagrg.cloudfront.net/pages/scripts/' - '%(account_nr_1)s/%(account_nr_2)s.js') +ACCOUNT_NUMBER_RE = re.compile(r"^\d+$") +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,29 +40,33 @@ def crazy_egg(parser, token): 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" + "CRAZY_EGG_ACCOUNT_NUMBER", + ACCOUNT_NUMBER_RE, + "must be (a string containing) a number", ) def render(self, context): html = SETUP_CODE % { - 'account_nr_1': self.account_nr[:4], - 'account_nr_2': self.account_nr[4:], + "account_nr_1": self.account_nr[:4], + "account_nr_2": self.account_nr[4:], } - values = (context.get('crazy_egg_var%d' % i) for i in range(1, 6)) + 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) - if is_internal_ip(context, 'CRAZY_EGG'): - html = disable_html(html, 'Crazy Egg') + 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 def contribute_to_analytical(add_node): CrazyEggNode() # ensure properly configured - add_node('body_bottom', CrazyEggNode) + add_node("body_bottom", CrazyEggNode) diff --git a/analytical/templatetags/facebook_pixel.py b/analytical/templatetags/facebook_pixel.py index 9ccc9ad..6cf4781 100644 --- a/analytical/templatetags/facebook_pixel.py +++ b/analytical/templatetags/facebook_pixel.py @@ -6,8 +6,7 @@ import re from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import get_required_setting, is_internal_ip, disable_html - +from analytical.utils import disable_html, get_required_setting, is_internal_ip FACEBOOK_PIXEL_HEAD_CODE = """\ """ # noqa IDENTIFY_CODE = "_kiq.push(['identify', '%s']);" SHOW_SURVEY_CODE = "_kiq.push(['showSurvey', %s]);" -SHOW_SURVEY_CONTEXT_KEY = 'kiss_insights_show_survey' +SHOW_SURVEY_CONTEXT_KEY = "kiss_insights_show_survey" register = Library() @@ -42,15 +41,19 @@ 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 = [] - identity = get_identity(context, 'kiss_insights') + identity = get_identity(context, "kiss_insights") if identity is not None: commands.append(IDENTIFY_CODE % identity) try: @@ -58,13 +61,13 @@ class KissInsightsNode(Node): except KeyError: pass html = SETUP_CODE % { - 'account_number': self.account_number, - 'site_code': self.site_code, - 'commands': " ".join(commands), + "account_number": self.account_number, + "site_code": self.site_code, + "commands": " ".join(commands), } return html def contribute_to_analytical(add_node): KissInsightsNode() # ensure properly configured - add_node('body_top', KissInsightsNode) + add_node("body_top", KissInsightsNode) diff --git a/analytical/templatetags/kiss_metrics.py b/analytical/templatetags/kiss_metrics.py index bf2b4f8..615f779 100644 --- a/analytical/templatetags/kiss_metrics.py +++ b/analytical/templatetags/kiss_metrics.py @@ -7,11 +7,14 @@ import re from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import is_internal_ip, disable_html, get_identity, \ - get_required_setting +from analytical.utils import ( + disable_html, + get_identity, + get_required_setting, + is_internal_ip, +) - -API_KEY_RE = re.compile(r'^[0-9a-f]{40}$') +API_KEY_RE = re.compile(r"^[0-9a-f]{40}$") TRACKING_CODE = """ """ # noqa NICKNAME_CODE = "olark('api.chat.updateVisitorNickname', {snippet: '%s'});" -NICKNAME_CONTEXT_KEY = 'olark_nickname' +NICKNAME_CONTEXT_KEY = "olark_nickname" FULLNAME_CODE = "olark('api.visitor.updateFullName', {{fullName: '{0}'}});" -FULLNAME_CONTEXT_KEY = 'olark_fullname' +FULLNAME_CONTEXT_KEY = "olark_fullname" EMAIL_CODE = "olark('api.visitor.updateEmailAddress', {{emailAddress: '{0}'}});" -EMAIL_CONTEXT_KEY = 'olark_email' +EMAIL_CONTEXT_KEY = "olark_email" STATUS_CODE = "olark('api.chat.updateVisitorStatus', {snippet: %s});" -STATUS_CONTEXT_KEY = 'olark_status' +STATUS_CONTEXT_KEY = "olark_status" 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() @@ -57,15 +69,17 @@ 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 = [] try: extra_code.append(NICKNAME_CODE % context[NICKNAME_CONTEXT_KEY]) except KeyError: - identity = get_identity(context, 'olark', self._get_nickname) + identity = get_identity(context, "olark", self._get_nickname) if identity is not None: extra_code.append(NICKNAME_CODE % identity) try: @@ -77,14 +91,15 @@ 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), + "site_id": self.site_id, + "extra_code": " ".join(extra_code), } return html @@ -99,13 +114,13 @@ class OlarkNode(Node): code = [] for dict_ in context: for var, val in dict_.items(): - if var.startswith('olark_'): + if var.startswith("olark_"): key = var[6:] if key in MESSAGE_KEYS: - code.append(MESSAGE_CODE % {'key': key, 'msg': val}) + code.append(MESSAGE_CODE % {"key": key, "msg": val}) return code def contribute_to_analytical(add_node): OlarkNode() # ensure properly configured - add_node('body_bottom', OlarkNode) + add_node("body_bottom", OlarkNode) diff --git a/analytical/templatetags/optimizely.py b/analytical/templatetags/optimizely.py index d99ca07..d4a8d1b 100644 --- a/analytical/templatetags/optimizely.py +++ b/analytical/templatetags/optimizely.py @@ -6,10 +6,9 @@ import re from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import is_internal_ip, disable_html, get_required_setting +from analytical.utils import disable_html, get_required_setting, is_internal_ip - -ACCOUNT_NUMBER_RE = re.compile(r'^\d+$') +ACCOUNT_NUMBER_RE = re.compile(r"^\d+$") SETUP_CODE = """""" @@ -34,16 +33,18 @@ 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} - if is_internal_ip(context, 'OPTIMIZELY'): - html = disable_html(html, 'Optimizely') + html = SETUP_CODE % {"account_number": self.account_number} + if is_internal_ip(context, "OPTIMIZELY"): + html = disable_html(html, "Optimizely") return html def contribute_to_analytical(add_node): OptimizelyNode() # ensure properly configured - add_node('head_top', OptimizelyNode) + add_node("head_top", OptimizelyNode) diff --git a/analytical/templatetags/performable.py b/analytical/templatetags/performable.py index 39e6c16..bcf2487 100644 --- a/analytical/templatetags/performable.py +++ b/analytical/templatetags/performable.py @@ -7,11 +7,14 @@ import re from django.template import Library, Node, TemplateSyntaxError from django.utils.safestring import mark_safe -from analytical.utils import is_internal_ip, disable_html, get_identity, \ - get_required_setting +from analytical.utils import ( + disable_html, + get_identity, + get_required_setting, + is_internal_ip, +) - -API_KEY_RE = re.compile(r'^\w+$') +API_KEY_RE = re.compile(r"^\w+$") SETUP_CODE = """ """ # noqa @@ -53,16 +56,16 @@ 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') + 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) - if is_internal_ip(context, 'PERFORMABLE'): - html = disable_html(html, 'Performable') + if is_internal_ip(context, "PERFORMABLE"): + html = disable_html(html, "Performable") return html @@ -71,12 +74,15 @@ 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): PerformableNode() # ensure properly configured - add_node('body_bottom', PerformableNode) + add_node("body_bottom", PerformableNode) diff --git a/analytical/templatetags/piwik.py b/analytical/templatetags/piwik.py index 8855a61..38522b7 100644 --- a/analytical/templatetags/piwik.py +++ b/analytical/templatetags/piwik.py @@ -2,23 +2,26 @@ Piwik template tags and filters. """ +import re +import warnings from collections import namedtuple from itertools import chain -import re from django.conf import settings from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import (is_internal_ip, disable_html, - get_required_setting, get_identity) - -import warnings +from analytical.utils import ( + disable_html, + get_identity, + get_required_setting, + is_internal_ip, +) # domain name (characters separated by a dot), optional port, optional URI path, no slash -DOMAINPATH_RE = re.compile(r'^(([^./?#@:]+\.)*[^./?#@:]+)+(:[0-9]+)?(/[^/?#@:]+)*$') +DOMAINPATH_RE = re.compile(r"^(([^./?#@:]+\.)*[^./?#@:]+)+(:[0-9]+)?(/[^/?#@:]+)*$") # numeric ID -SITEID_RE = re.compile(r'^\d+$') +SITEID_RE = re.compile(r"^\d+$") TRACKING_CODE = """ """ # noqa DOMAIN_CODE = 'SnapABug.setDomain("%s");' -SECURE_CONNECTION_CODE = 'SnapABug.setSecureConnexion();' +SECURE_CONNECTION_CODE = "SnapABug.setSecureConnexion();" INIT_CODE = 'SnapABug.init("%s");' -ADDBUTTON_CODE = 'SnapABug.addButton("%(id)s","%(location)s","%(offset)s"%(dynamic_tail)s);' +ADDBUTTON_CODE = ( + 'SnapABug.addButton("%(id)s","%(location)s","%(offset)s"%(dynamic_tail)s);' +) SETBUTTON_CODE = 'SnapABug.setButton("%s");' SETEMAIL_CODE = 'SnapABug.setUserEmail("%s"%s);' SETLOCALE_CODE = 'SnapABug.setLocale("%s");' FORM_POSITION_CODE = 'SnapABug.setChatFormPosition("%s");' -FORM_TOP_POSITION_CODE = 'SnapABug.setFormTopPosition(%d);' +FORM_TOP_POSITION_CODE = "SnapABug.setFormTopPosition(%d);" BUTTONEFFECT_CODE = 'SnapABug.setButtonEffect("%s");' -DISABLE_OFFLINE_CODE = 'SnapABug.allowOffline(false);' -DISABLE_SCREENSHOT_CODE = 'SnapABug.allowScreenshot(false);' -DISABLE_OFFLINE_SCREENSHOT_CODE = 'SnapABug.showScreenshotOption(false);' -DISABLE_PROACTIVE_CHAT_CODE = 'SnapABug.allowProactiveChat(false);' -DISABLE_SOUNDS_CODE = 'SnapABug.allowChatSound(false);' +DISABLE_OFFLINE_CODE = "SnapABug.allowOffline(false);" +DISABLE_SCREENSHOT_CODE = "SnapABug.allowScreenshot(false);" +DISABLE_OFFLINE_SCREENSHOT_CODE = "SnapABug.showScreenshotOption(false);" +DISABLE_PROACTIVE_CHAT_CODE = "SnapABug.allowProactiveChat(false);" +DISABLE_SOUNDS_CODE = "SnapABug.allowChatSound(false);" register = Library() @@ -67,83 +71,95 @@ def snapengage(parser, token): class SnapEngageNode(Node): def __init__(self): self.widget_id = get_required_setting( - 'SNAPENGAGE_WIDGET_ID', WIDGET_ID_RE, - "must be a string looking like this: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'") + "SNAPENGAGE_WIDGET_ID", + WIDGET_ID_RE, + "must be a string looking like this: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'", + ) def render(self, context): settings_code = [] - domain = self._get_setting(context, 'snapengage_domain', - 'SNAPENGAGE_DOMAIN') + domain = self._get_setting(context, "snapengage_domain", "SNAPENGAGE_DOMAIN") if domain is not None: settings_code.append(DOMAIN_CODE % domain) - secure_connection = self._get_setting(context, - 'snapengage_secure_connection', - 'SNAPENGAGE_SECURE_CONNECTION', - False) + secure_connection = self._get_setting( + context, + "snapengage_secure_connection", + "SNAPENGAGE_SECURE_CONNECTION", + False, + ) if secure_connection: settings_code.append(SECURE_CONNECTION_CODE) - email = context.get('snapengage_email') + email = context.get("snapengage_email") if email is None: - email = get_identity(context, 'snapengage', lambda u: u.email) + email = get_identity(context, "snapengage", lambda u: u.email) if email is not None: - if self._get_setting(context, 'snapengage_readonly_email', - 'SNAPENGAGE_READONLY_EMAIL', False): - readonly_tail = ',true' + if self._get_setting( + context, "snapengage_readonly_email", "SNAPENGAGE_READONLY_EMAIL", False + ): + readonly_tail = ",true" else: - readonly_tail = '' + readonly_tail = "" settings_code.append(SETEMAIL_CODE % (email, readonly_tail)) - locale = self._get_setting(context, 'snapengage_locale', - 'SNAPENGAGE_LOCALE') + locale = self._get_setting(context, "snapengage_locale", "SNAPENGAGE_LOCALE") if locale is None: locale = translation.to_locale(translation.get_language()) settings_code.append(SETLOCALE_CODE % locale) - form_position = self._get_setting(context, - 'snapengage_form_position', 'SNAPENGAGE_FORM_POSITION') + form_position = self._get_setting( + context, "snapengage_form_position", "SNAPENGAGE_FORM_POSITION" + ) if form_position is not None: settings_code.append(FORM_POSITION_CODE % form_position) - form_top_position = self._get_setting(context, - 'snapengage_form_top_position', - 'SNAPENGAGE_FORM_TOP_POSITION') + form_top_position = self._get_setting( + context, "snapengage_form_top_position", "SNAPENGAGE_FORM_TOP_POSITION" + ) if form_top_position is not None: settings_code.append(FORM_TOP_POSITION_CODE % form_top_position) - show_offline = self._get_setting(context, 'snapengage_show_offline', - 'SNAPENGAGE_SHOW_OFFLINE', True) + show_offline = self._get_setting( + context, "snapengage_show_offline", "SNAPENGAGE_SHOW_OFFLINE", True + ) if not show_offline: settings_code.append(DISABLE_OFFLINE_CODE) - screenshots = self._get_setting(context, 'snapengage_screenshots', - 'SNAPENGAGE_SCREENSHOTS', True) + screenshots = self._get_setting( + context, "snapengage_screenshots", "SNAPENGAGE_SCREENSHOTS", True + ) if not screenshots: settings_code.append(DISABLE_SCREENSHOT_CODE) - offline_screenshots = self._get_setting(context, - 'snapengage_offline_screenshots', - 'SNAPENGAGE_OFFLINE_SCREENSHOTS', True) + offline_screenshots = self._get_setting( + context, + "snapengage_offline_screenshots", + "SNAPENGAGE_OFFLINE_SCREENSHOTS", + True, + ) if not offline_screenshots: settings_code.append(DISABLE_OFFLINE_SCREENSHOT_CODE) - if not context.get('snapengage_proactive_chat', True): + if not context.get("snapengage_proactive_chat", True): settings_code.append(DISABLE_PROACTIVE_CHAT_CODE) - sounds = self._get_setting(context, 'snapengage_sounds', - 'SNAPENGAGE_SOUNDS', True) + sounds = self._get_setting( + context, "snapengage_sounds", "SNAPENGAGE_SOUNDS", True + ) if not sounds: settings_code.append(DISABLE_SOUNDS_CODE) - button_effect = self._get_setting(context, 'snapengage_button_effect', - 'SNAPENGAGE_BUTTON_EFFECT') + button_effect = self._get_setting( + context, "snapengage_button_effect", "SNAPENGAGE_BUTTON_EFFECT" + ) if button_effect is not None: settings_code.append(BUTTONEFFECT_CODE % button_effect) - button = self._get_setting(context, 'snapengage_button', - 'SNAPENGAGE_BUTTON', BUTTON_STYLE_DEFAULT) + button = self._get_setting( + context, "snapengage_button", "SNAPENGAGE_BUTTON", BUTTON_STYLE_DEFAULT + ) if button == BUTTON_STYLE_NONE: settings_code.append(INIT_CODE % self.widget_id) else: @@ -152,21 +168,28 @@ class SnapEngageNode(Node): settings_code.append(SETBUTTON_CODE % button) button_location = self._get_setting( context, - 'snapengage_button_location', 'SNAPENGAGE_BUTTON_LOCATION', - BUTTON_LOCATION_LEFT) + "snapengage_button_location", + "SNAPENGAGE_BUTTON_LOCATION", + BUTTON_LOCATION_LEFT, + ) button_offset = self._get_setting( context, - 'snapengage_button_location_offset', - 'SNAPENGAGE_BUTTON_LOCATION_OFFSET', '55%') - settings_code.append(ADDBUTTON_CODE % { - 'id': self.widget_id, - 'location': button_location, - 'offset': button_offset, - 'dynamic_tail': ',true' if (button == BUTTON_STYLE_LIVE) else '', - }) + "snapengage_button_location_offset", + "SNAPENGAGE_BUTTON_LOCATION_OFFSET", + "55%", + ) + settings_code.append( + ADDBUTTON_CODE + % { + "id": self.widget_id, + "location": button_location, + "offset": button_offset, + "dynamic_tail": ",true" if (button == BUTTON_STYLE_LIVE) else "", + } + ) html = SETUP_CODE % { - 'widget_id': self.widget_id, - 'settings_code': " ".join(settings_code), + "widget_id": self.widget_id, + "settings_code": " ".join(settings_code), } return html @@ -182,4 +205,4 @@ class SnapEngageNode(Node): def contribute_to_analytical(add_node): SnapEngageNode() # ensure properly configured - add_node('body_bottom', SnapEngageNode) + add_node("body_bottom", SnapEngageNode) diff --git a/analytical/templatetags/spring_metrics.py b/analytical/templatetags/spring_metrics.py index d402846..a50e58f 100644 --- a/analytical/templatetags/spring_metrics.py +++ b/analytical/templatetags/spring_metrics.py @@ -6,11 +6,14 @@ import re from django.template import Library, Node, TemplateSyntaxError -from analytical.utils import get_identity, is_internal_ip, disable_html, \ - get_required_setting +from analytical.utils import ( + disable_html, + get_identity, + get_required_setting, + is_internal_ip, +) - -TRACKING_ID_RE = re.compile(r'^[0-9a-f]+$') +TRACKING_ID_RE = re.compile(r"^[0-9a-f]+$") TRACKING_CODE = """ -""", self.render_tag('gauges', 'gauges')) +""", + self.render_tag("gauges", "gauges"), + ) def test_node(self): self.assertEqual( - """ + """ -""", GaugesNode().render(Context())) +""", + GaugesNode().render(Context()), + ) @override_settings(GAUGES_SITE_ID=None) def test_no_account_number(self): self.assertRaises(AnalyticalException, GaugesNode) - @override_settings(GAUGES_SITE_ID='123abQ') + @override_settings(GAUGES_SITE_ID="123abQ") def test_wrong_account_number(self): self.assertRaises(AnalyticalException, GaugesNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = GaugesNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue(r.startswith(""), r) diff --git a/tests/unit/test_tag_google_analytics.py b/tests/unit/test_tag_google_analytics.py index da73996..bba8de4 100644 --- a/tests/unit/test_tag_google_analytics.py +++ b/tests/unit/test_tag_google_analytics.py @@ -5,23 +5,31 @@ Tests for the Google Analytics template tags and filters. from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase, TestCase -from analytical.templatetags.google_analytics import GoogleAnalyticsNode, \ - TRACK_SINGLE_DOMAIN, TRACK_MULTIPLE_DOMAINS, TRACK_MULTIPLE_SUBDOMAINS,\ - SCOPE_VISITOR, SCOPE_SESSION, SCOPE_PAGE -from utils import TestCase, TagTestCase +from analytical.templatetags.google_analytics import ( + SCOPE_PAGE, + SCOPE_SESSION, + SCOPE_VISITOR, + TRACK_MULTIPLE_DOMAINS, + TRACK_MULTIPLE_SUBDOMAINS, + TRACK_SINGLE_DOMAIN, + GoogleAnalyticsNode, +) 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. """ def test_tag(self): - r = self.render_tag('google_analytics', 'google_analytics') + r = self.render_tag("google_analytics", "google_analytics") self.assertTrue("_gaq.push(['_setAccount', 'UA-123456-7']);" in r, r) self.assertTrue("_gaq.push(['_trackPageview']);" in r, r) @@ -34,19 +42,23 @@ class GoogleAnalyticsTagTestCase(TagTestCase): def test_no_property_id(self): self.assertRaises(AnalyticalException, GoogleAnalyticsNode) - @override_settings(GOOGLE_ANALYTICS_PROPERTY_ID='wrong') + @override_settings(GOOGLE_ANALYTICS_PROPERTY_ID="wrong") def test_wrong_property_id(self): self.assertRaises(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()) self.assertTrue("_gaq.push(['_setDomainName', 'example.com']);" in r, r) self.assertTrue("_gaq.push(['_setAllowHash', false]);" in r, 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()) self.assertTrue("_gaq.push(['_setDomainName', 'example.com']);" in r, r) @@ -54,12 +66,14 @@ class GoogleAnalyticsTagTestCase(TagTestCase): self.assertTrue("_gaq.push(['_setAllowLinker', true]);" in r, 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) self.assertTrue("_gaq.push(['_setCustomVar', 1, 'test1', 'foo', 3]);" in r, r) self.assertTrue("_gaq.push(['_setCustomVar', 2, 'test2', 'bar', 1]);" in r, r) @@ -79,21 +93,22 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("stats.g.doubleclick.net/dc.js" in r, r) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = GoogleAnalyticsNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) @override_settings(GOOGLE_ANALYTICS_ANONYMIZE_IP=True) def test_anonymize_ip(self): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_gat._anonymizeIp']);" in r, r) - self.assertTrue(r.index('_gat._anonymizeIp') < r.index('_trackPageview'), r) + self.assertTrue(r.index("_gat._anonymizeIp") < r.index("_trackPageview"), r) @override_settings(GOOGLE_ANALYTICS_ANONYMIZE_IP=False) def test_anonymize_ip_not_present(self): @@ -105,7 +120,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setSampleRate', '0.00']);" in r, r) - @override_settings(GOOGLE_ANALYTICS_SAMPLE_RATE='100.00') + @override_settings(GOOGLE_ANALYTICS_SAMPLE_RATE="100.00") def test_set_sample_rate_max(self): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setSampleRate', '100.00']);" in r, r) @@ -125,7 +140,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setSiteSpeedSampleRate', '0.00']);" in r, r) - @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE='100.00') + @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE="100.00") def test_set_site_speed_sample_rate_max(self): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setSiteSpeedSampleRate', '100.00']);" in r, r) @@ -145,7 +160,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setSessionCookieTimeout', '0']);" in r, r) - @override_settings(GOOGLE_ANALYTICS_SESSION_COOKIE_TIMEOUT='10000') + @override_settings(GOOGLE_ANALYTICS_SESSION_COOKIE_TIMEOUT="10000") def test_set_session_cookie_timeout_as_string(self): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setSessionCookieTimeout', '10000']);" in r, r) @@ -160,7 +175,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setVisitorCookieTimeout', '0']);" in r, r) - @override_settings(GOOGLE_ANALYTICS_VISITOR_COOKIE_TIMEOUT='10000') + @override_settings(GOOGLE_ANALYTICS_VISITOR_COOKIE_TIMEOUT="10000") def test_set_visitor_cookie_timeout_as_string(self): r = GoogleAnalyticsNode().render(Context()) self.assertTrue("_gaq.push(['_setVisitorCookieTimeout', '10000']);" in r, r) @@ -171,10 +186,12 @@ class GoogleAnalyticsTagTestCase(TagTestCase): self.assertRaises(AnalyticalException, 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 c81368f..157f926 100644 --- a/tests/unit/test_tag_google_analytics_gtag.py +++ b/tests/unit/test_tag_google_analytics_gtag.py @@ -6,23 +6,25 @@ from django.contrib.auth.models import User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.google_analytics_gtag import GoogleAnalyticsGTagNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='UA-123456-7') +@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID="UA-123456-7") class GoogleAnalyticsTagTestCase(TagTestCase): """ Tests for the ``google_analytics_js`` template tag. """ def test_tag(self): - r = self.render_tag('google_analytics_gtag', 'google_analytics_gtag') + r = self.render_tag("google_analytics_gtag", "google_analytics_gtag") self.assertTrue( '' - in r, r) + in r, + r, + ) self.assertTrue("gtag('js', new Date());" in r, r) self.assertTrue("gtag('config', 'UA-123456-7');" in r, r) @@ -30,7 +32,9 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsGTagNode().render(Context()) self.assertTrue( '' - in r, r) + in r, + r, + ) self.assertTrue("gtag('js', new Date());" in r, r) self.assertTrue("gtag('config', 'UA-123456-7');" in r, r) @@ -38,51 +42,64 @@ class GoogleAnalyticsTagTestCase(TagTestCase): def test_no_property_id(self): self.assertRaises(AnalyticalException, GoogleAnalyticsGTagNode) - @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='wrong') + @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID="wrong") def test_wrong_property_id(self): self.assertRaises(AnalyticalException, GoogleAnalyticsGTagNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = GoogleAnalyticsGTagNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = GoogleAnalyticsGTagNode().render(Context({'user': User(username='test')})) + r = GoogleAnalyticsGTagNode().render(Context({"user": User(username="test")})) self.assertTrue("gtag('set', {'user_id': 'test'});" in r, r) - @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='G-12345678') + @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID="G-12345678") def test_tag_with_measurement_id(self): - r = self.render_tag('google_analytics_gtag', 'google_analytics_gtag') + r = self.render_tag("google_analytics_gtag", "google_analytics_gtag") self.assertTrue( - ('') - in r, r) + ( + '' + ) + in r, + r, + ) self.assertTrue("gtag('js', new Date());" in r, r) self.assertTrue("gtag('config', 'G-12345678');" in r, r) - @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='AW-1234567890') + @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID="AW-1234567890") def test_tag_with_conversion_id(self): - r = self.render_tag('google_analytics_gtag', 'google_analytics_gtag') + r = self.render_tag("google_analytics_gtag", "google_analytics_gtag") self.assertTrue( - ('') - in r, r) + ( + '' + ) + in r, + r, + ) self.assertTrue("gtag('js', new Date());" in r, r) self.assertTrue("gtag('config', 'AW-1234567890');" in r, r) - @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='DC-12345678') + @override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID="DC-12345678") def test_tag_with_advertiser_id(self): - r = self.render_tag('google_analytics_gtag', 'google_analytics_gtag') + r = self.render_tag("google_analytics_gtag", "google_analytics_gtag") self.assertTrue( - ('') - in r, r) + ( + '' + ) + in r, + r, + ) self.assertTrue("gtag('js', new Date());" in r, r) self.assertTrue("gtag('config', 'DC-12345678');" in r, r) diff --git a/tests/unit/test_tag_google_analytics_js.py b/tests/unit/test_tag_google_analytics_js.py index 1009fbb..c95325f 100644 --- a/tests/unit/test_tag_google_analytics_js.py +++ b/tests/unit/test_tag_google_analytics_js.py @@ -5,35 +5,49 @@ Tests for the Google Analytics template tags and filters, using the new analytic from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase, TestCase -from analytical.templatetags.google_analytics_js import GoogleAnalyticsJsNode, \ - TRACK_SINGLE_DOMAIN, TRACK_MULTIPLE_DOMAINS, TRACK_MULTIPLE_SUBDOMAINS -from utils import TestCase, TagTestCase +from analytical.templatetags.google_analytics_js import ( + TRACK_MULTIPLE_DOMAINS, + TRACK_MULTIPLE_SUBDOMAINS, + TRACK_SINGLE_DOMAIN, + GoogleAnalyticsJsNode, +) 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. """ def test_tag(self): - r = self.render_tag('google_analytics_js', 'google_analytics_js') - self.assertTrue("""(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + r = self.render_tag("google_analytics_js", "google_analytics_js") + self.assertTrue( + """(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, r) +})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');""" + in r, + r, + ) self.assertTrue("ga('create', 'UA-123456-7', 'auto', {});" in r, r) self.assertTrue("ga('send', 'pageview');" in r, r) def test_node(self): r = GoogleAnalyticsJsNode().render(Context()) - self.assertTrue("""(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + self.assertTrue( + """(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, r) +})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');""" + in r, + r, + ) self.assertTrue("ga('create', 'UA-123456-7', 'auto', {});" in r, r) self.assertTrue("ga('send', 'pageview');" in r, r) @@ -41,32 +55,41 @@ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) def test_no_property_id(self): self.assertRaises(AnalyticalException, GoogleAnalyticsJsNode) - @override_settings(GOOGLE_ANALYTICS_JS_PROPERTY_ID='wrong') + @override_settings(GOOGLE_ANALYTICS_JS_PROPERTY_ID="wrong") def test_wrong_property_id(self): self.assertRaises(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()) self.assertTrue( - """ga('create', 'UA-123456-7', 'auto', {"legacyCookieDomain": "example.com"}""" in r, r) + """ga('create', 'UA-123456-7', 'auto', {"legacyCookieDomain": "example.com"}""" + in r, + 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()) self.assertTrue("ga('create', 'UA-123456-7', 'auto', {" in r, r) self.assertTrue('"legacyCookieDomain": "example.com"' in r, r) - self.assertTrue('"allowLinker\": true' in r, r) + self.assertTrue('"allowLinker": true' in r, 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) self.assertTrue("ga('set', 'test1', 'foo');" in r, r) self.assertTrue("ga('set', 'test2', 'bar');" in r, r) @@ -76,19 +99,24 @@ 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()) - self.assertTrue("""ga('create', 'UA-123456-7', 'auto', {}); + self.assertTrue( + """ga('create', 'UA-123456-7', 'auto', {}); ga('require', 'displayfeatures'); -ga('send', 'pageview');""" in r, r) +ga('send', 'pageview');""" + in r, + r, + ) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = GoogleAnalyticsJsNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) @override_settings(GOOGLE_ANALYTICS_ANONYMIZE_IP=True) def test_anonymize_ip(self): @@ -103,12 +131,16 @@ ga('send', 'pageview');""" in r, r) @override_settings(GOOGLE_ANALYTICS_SAMPLE_RATE=0.0) def test_set_sample_rate_min(self): r = GoogleAnalyticsJsNode().render(Context()) - self.assertTrue("""ga('create', 'UA-123456-7', 'auto', {"sampleRate": 0});""" in r, r) + self.assertTrue( + """ga('create', 'UA-123456-7', 'auto', {"sampleRate": 0});""" in r, r + ) - @override_settings(GOOGLE_ANALYTICS_SAMPLE_RATE='100.00') + @override_settings(GOOGLE_ANALYTICS_SAMPLE_RATE="100.00") def test_set_sample_rate_max(self): r = GoogleAnalyticsJsNode().render(Context()) - self.assertTrue("""ga('create', 'UA-123456-7', 'auto', {"sampleRate": 100});""" in r, r) + self.assertTrue( + """ga('create', 'UA-123456-7', 'auto', {"sampleRate": 100});""" in r, r + ) @override_settings(GOOGLE_ANALYTICS_SAMPLE_RATE=-1) def test_exception_whenset_sample_rate_too_small(self): @@ -124,13 +156,18 @@ ga('send', 'pageview');""" in r, r) def test_set_site_speed_sample_rate_min(self): r = GoogleAnalyticsJsNode().render(Context()) self.assertTrue( - """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 0});""" in r, r) + """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 0});""" in r, + r, + ) - @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE='100.00') + @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE="100.00") def test_set_site_speed_sample_rate_max(self): r = GoogleAnalyticsJsNode().render(Context()) self.assertTrue( - """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 100});""" in r, r) + """ga('create', 'UA-123456-7', 'auto', {"siteSpeedSampleRate": 100});""" + in r, + r, + ) @override_settings(GOOGLE_ANALYTICS_SITE_SPEED_SAMPLE_RATE=-1) def test_exception_whenset_site_speed_sample_rate_too_small(self): @@ -145,13 +182,16 @@ ga('send', 'pageview');""" in r, r) @override_settings(GOOGLE_ANALYTICS_COOKIE_EXPIRATION=0) def test_set_cookie_expiration_min(self): r = GoogleAnalyticsJsNode().render(Context()) - self.assertTrue("""ga('create', 'UA-123456-7', 'auto', {"cookieExpires": 0});""" in r, r) + self.assertTrue( + """ga('create', 'UA-123456-7', 'auto', {"cookieExpires": 0});""" in r, r + ) - @override_settings(GOOGLE_ANALYTICS_COOKIE_EXPIRATION='10000') + @override_settings(GOOGLE_ANALYTICS_COOKIE_EXPIRATION="10000") def test_set_cookie_expiration_as_string(self): r = GoogleAnalyticsJsNode().render(Context()) self.assertTrue( - """ga('create', 'UA-123456-7', 'auto', {"cookieExpires": 10000});""" in r, r) + """ga('create', 'UA-123456-7', 'auto', {"cookieExpires": 10000});""" in r, r + ) @override_settings(GOOGLE_ANALYTICS_COOKIE_EXPIRATION=-1) def test_exception_when_set_cookie_expiration_too_small(self): @@ -159,10 +199,12 @@ ga('send', 'pageview');""" in r, r) self.assertRaises(AnalyticalException, 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 444420f..e06581c 100644 --- a/tests/unit/test_tag_gosquared.py +++ b/tests/unit/test_tag_gosquared.py @@ -2,24 +2,24 @@ Tests for the GoSquared template tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.gosquared import GoSquaredNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(GOSQUARED_SITE_TOKEN='ABC-123456-D') +@override_settings(GOSQUARED_SITE_TOKEN="ABC-123456-D") class GoSquaredTagTestCase(TagTestCase): """ Tests for the ``gosquared`` template tag. """ def test_tag(self): - r = self.render_tag('gosquared', 'gosquared') + r = self.render_tag("gosquared", "gosquared") self.assertTrue('GoSquared.acct = "ABC-123456-D";' in r, r) def test_node(self): @@ -30,36 +30,45 @@ class GoSquaredTagTestCase(TagTestCase): def test_no_token(self): self.assertRaises(AnalyticalException, GoSquaredNode) - @override_settings(GOSQUARED_SITE_TOKEN='this is not a token') + @override_settings(GOSQUARED_SITE_TOKEN="this is not a token") def test_wrong_token(self): self.assertRaises(AnalyticalException, GoSquaredNode) @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"), + } + ) + ) self.assertTrue('GoSquared.UserName = "Test User";' in r, 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", + } + ) + ) self.assertTrue('GoSquared.UserName = "test_identity";' in r, r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = GoSquaredNode().render(Context({'user': AnonymousUser()})) - self.assertFalse('GoSquared.UserName = ' in r, r) + r = GoSquaredNode().render(Context({"user": AnonymousUser()})) + self.assertFalse("GoSquared.UserName = " in r, r) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = GoSquaredNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_tag_hotjar.py b/tests/unit/test_tag_hotjar.py index d5978b8..a4d3ddd 100644 --- a/tests/unit/test_tag_hotjar.py +++ b/tests/unit/test_tag_hotjar.py @@ -4,13 +4,12 @@ Tests for the Hotjar template tags. from django.http import HttpRequest from django.template import Context, Template, TemplateSyntaxError from django.test import override_settings +from utils import TagTestCase from analytical.templatetags.analytical import _load_template_nodes from analytical.templatetags.hotjar import HotjarNode -from utils import TagTestCase from analytical.utils import AnalyticalException - expected_html = """\ -""" % {'user_id': user.pk}, rendered_tag) # noqa +""" # noqa + % {"user_id": user.pk}, + rendered_tag, + ) @override_settings(INTERCOM_APP_ID=None) def test_no_account_number(self): self.assertRaises(AnalyticalException, IntercomNode) - @override_settings(INTERCOM_APP_ID='123abQ') + @override_settings(INTERCOM_APP_ID="123abQ") def test_wrong_account_number(self): self.assertRaises(AnalyticalException, IntercomNode) def test_identify_name_email_and_created_at(self): now = datetime.datetime(2014, 4, 9, 15, 15, 0) user = User.objects.create( - username='test', - first_name='Firstname', - last_name='Lastname', + username="test", + first_name="Firstname", + last_name="Lastname", email="test@example.com", date_joined=now, ) - r = IntercomNode().render(Context({ - 'user': user, - })) - self.assertTrue('window.intercomSettings = {' - '"app_id": "abc123xyz", "created_at": 1397074500, ' - '"email": "test@example.com", "name": "Firstname Lastname", ' - '"user_id": %(user_id)s' - '};' % {'user_id': user.pk} in r, msg=r) + r = IntercomNode().render( + Context( + { + "user": user, + } + ) + ) + self.assertTrue( + "window.intercomSettings = {" + '"app_id": "abc123xyz", "created_at": 1397074500, ' + '"email": "test@example.com", "name": "Firstname Lastname", ' + '"user_id": %(user_id)s' + "};" % {"user_id": user.pk} in r, + msg=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"}) + ) self.assertTrue('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"), - })) - self.assertTrue('"email": "test@example.com", "name": "Firstname Lastname"' in r) + r = IntercomNode().render( + Context( + { + "user": User( + username="test", + first_name="Firstname", + last_name="Lastname", + email="test@example.com", + ), + } + ) + ) + self.assertTrue( + '"email": "test@example.com", "name": "Firstname Lastname"' in r + ) def test_identify_username_no_email(self): - r = IntercomNode().render(Context({'user': User(username='test')})) + r = IntercomNode().render(Context({"user": User(username="test")})) self.assertTrue('"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"), + } + ) + ) self.assertTrue('"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"), + } + ) + ) self.assertTrue('"email": "explicit"' in r, r) - @override_settings(INTERCOM_HMAC_SECRET_KEY='secret') + @override_settings(INTERCOM_HMAC_SECRET_KEY="secret") def test_user_hash__without_user_details(self): """ No `user_hash` without `user_id` or `email`. """ attrs = IntercomNode()._get_custom_attrs(Context()) - self.assertEqual({ - 'created_at': None, - }, attrs) + self.assertEqual( + { + "created_at": None, + }, + attrs, + ) - @override_settings(INTERCOM_HMAC_SECRET_KEY='secret') + @override_settings(INTERCOM_HMAC_SECRET_KEY="secret") def test_user_hash__with_user(self): """ 'user_hash' of default `user_id`. """ user = User.objects.create( - email='test@example.com', + email="test@example.com", ) # type: User - attrs = IntercomNode()._get_custom_attrs(Context({'user': user})) - self.assertEqual({ - 'created_at': int(user.date_joined.timestamp()), - 'email': 'test@example.com', - 'name': '', - 'user_hash': intercom_user_hash(str(user.pk)), - 'user_id': user.pk, - }, attrs) + attrs = IntercomNode()._get_custom_attrs(Context({"user": user})) + self.assertEqual( + { + "created_at": int(user.date_joined.timestamp()), + "email": "test@example.com", + "name": "", + "user_hash": intercom_user_hash(str(user.pk)), + "user_id": user.pk, + }, + attrs, + ) - @override_settings(INTERCOM_HMAC_SECRET_KEY='secret') + @override_settings(INTERCOM_HMAC_SECRET_KEY="secret") def test_user_hash__with_explicit_user_id(self): """ 'user_hash' of context-provided `user_id`. """ - attrs = IntercomNode()._get_custom_attrs(Context({ - 'intercom_email': 'test@example.com', - 'intercom_user_id': '5', - })) - self.assertEqual({ - 'created_at': None, - 'email': 'test@example.com', - # HMAC for user_id: - 'user_hash': 'd3123a7052b42272d9b520235008c248a5aff3221cc0c530b754702ad91ab102', - 'user_id': '5', - }, attrs) + attrs = IntercomNode()._get_custom_attrs( + Context( + { + "intercom_email": "test@example.com", + "intercom_user_id": "5", + } + ) + ) + self.assertEqual( + { + "created_at": None, + "email": "test@example.com", + # HMAC for user_id: + "user_hash": "d3123a7052b42272d9b520235008c248a5aff3221cc0c530b754702ad91ab102", + "user_id": "5", + }, + attrs, + ) - @override_settings(INTERCOM_HMAC_SECRET_KEY='secret') + @override_settings(INTERCOM_HMAC_SECRET_KEY="secret") def test_user_hash__with_explicit_email(self): """ 'user_hash' of context-provided `email`. """ - attrs = IntercomNode()._get_custom_attrs(Context({ - 'intercom_email': 'test@example.com', - })) - self.assertEqual({ - 'created_at': None, - 'email': 'test@example.com', - # HMAC for email: - 'user_hash': '49e43229ee99dca2565241719b8341b04e71dd4de0628f991b5bea30a526e153', - }, attrs) + attrs = IntercomNode()._get_custom_attrs( + Context( + { + "intercom_email": "test@example.com", + } + ) + ) + self.assertEqual( + { + "created_at": None, + "email": "test@example.com", + # HMAC for email: + "user_hash": "49e43229ee99dca2565241719b8341b04e71dd4de0628f991b5bea30a526e153", + }, + attrs, + ) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = IntercomNode().render(context) - self.assertTrue(r.startswith(''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_tag_kiss_insights.py b/tests/unit/test_tag_kiss_insights.py index dc627d1..94d0252 100644 --- a/tests/unit/test_tag_kiss_insights.py +++ b/tests/unit/test_tag_kiss_insights.py @@ -2,23 +2,23 @@ Tests for the KISSinsights template tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.kiss_insights import KissInsightsNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(KISS_INSIGHTS_ACCOUNT_NUMBER='12345', KISS_INSIGHTS_SITE_CODE='abc') +@override_settings(KISS_INSIGHTS_ACCOUNT_NUMBER="12345", KISS_INSIGHTS_SITE_CODE="abc") class KissInsightsTagTestCase(TagTestCase): """ Tests for the ``kiss_insights`` template tag. """ def test_tag(self): - r = self.render_tag('kiss_insights', 'kiss_insights') + r = self.render_tag("kiss_insights", "kiss_insights") self.assertTrue("//s3.amazonaws.com/ki.js/12345/abc.js" in r, r) def test_node(self): @@ -33,24 +33,24 @@ class KissInsightsTagTestCase(TagTestCase): def test_no_site_code(self): self.assertRaises(AnalyticalException, KissInsightsNode) - @override_settings(KISS_INSIGHTS_ACCOUNT_NUMBER='abcde') + @override_settings(KISS_INSIGHTS_ACCOUNT_NUMBER="abcde") def test_wrong_account_number(self): self.assertRaises(AnalyticalException, KissInsightsNode) - @override_settings(KISS_INSIGHTS_SITE_CODE='abc def') + @override_settings(KISS_INSIGHTS_SITE_CODE="abc def") def test_wrong_site_id(self): self.assertRaises(AnalyticalException, KissInsightsNode) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = KissInsightsNode().render(Context({'user': User(username='test')})) + r = KissInsightsNode().render(Context({"user": User(username="test")})) self.assertTrue("_kiq.push(['identify', 'test']);" in r, r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = KissInsightsNode().render(Context({'user': AnonymousUser()})) + r = KissInsightsNode().render(Context({"user": AnonymousUser()})) self.assertFalse("_kiq.push(['identify', " in r, r) def test_show_survey(self): - r = KissInsightsNode().render(Context({'kiss_insights_show_survey': 1234})) + r = KissInsightsNode().render(Context({"kiss_insights_show_survey": 1234})) self.assertTrue("_kiq.push(['showSurvey', 1234]);" in r, r) diff --git a/tests/unit/test_tag_kiss_metrics.py b/tests/unit/test_tag_kiss_metrics.py index d3e885f..e19f189 100644 --- a/tests/unit/test_tag_kiss_metrics.py +++ b/tests/unit/test_tag_kiss_metrics.py @@ -2,80 +2,106 @@ Tests for the KISSmetrics tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.kiss_metrics import KissMetricsNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(KISS_METRICS_API_KEY='0123456789abcdef0123456789abcdef01234567') +@override_settings(KISS_METRICS_API_KEY="0123456789abcdef0123456789abcdef01234567") class KissMetricsTagTestCase(TagTestCase): """ Tests for the ``kiss_metrics`` template tag. """ def test_tag(self): - r = self.render_tag('kiss_metrics', 'kiss_metrics') - self.assertTrue("//doug1izaerwt3.cloudfront.net/" - "0123456789abcdef0123456789abcdef01234567.1.js" in r, r) + r = self.render_tag("kiss_metrics", "kiss_metrics") + self.assertTrue( + "//doug1izaerwt3.cloudfront.net/" + "0123456789abcdef0123456789abcdef01234567.1.js" in r, + r, + ) def test_node(self): r = KissMetricsNode().render(Context()) - self.assertTrue("//doug1izaerwt3.cloudfront.net/" - "0123456789abcdef0123456789abcdef01234567.1.js" in r, r) + self.assertTrue( + "//doug1izaerwt3.cloudfront.net/" + "0123456789abcdef0123456789abcdef01234567.1.js" in r, + r, + ) @override_settings(KISS_METRICS_API_KEY=None) def test_no_api_key(self): self.assertRaises(AnalyticalException, KissMetricsNode) - @override_settings(KISS_METRICS_API_KEY='0123456789abcdef0123456789abcdef0123456') + @override_settings(KISS_METRICS_API_KEY="0123456789abcdef0123456789abcdef0123456") def test_api_key_too_short(self): self.assertRaises(AnalyticalException, KissMetricsNode) - @override_settings(KISS_METRICS_API_KEY='0123456789abcdef0123456789abcdef012345678') + @override_settings(KISS_METRICS_API_KEY="0123456789abcdef0123456789abcdef012345678") def test_api_key_too_long(self): self.assertRaises(AnalyticalException, KissMetricsNode) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = KissMetricsNode().render(Context({'user': User(username='test')})) + r = KissMetricsNode().render(Context({"user": User(username="test")})) self.assertTrue("_kmq.push(['identify', 'test']);" in r, r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = KissMetricsNode().render(Context({'user': AnonymousUser()})) + r = KissMetricsNode().render(Context({"user": AnonymousUser()})) self.assertFalse("_kmq.push(['identify', " in r, r) def test_event(self): - r = KissMetricsNode().render(Context({ - 'kiss_metrics_event': ('test_event', {'prop1': 'val1', 'prop2': 'val2'}), - })) - self.assertTrue("_kmq.push(['record', 'test_event', " - '{"prop1": "val1", "prop2": "val2"}]);' in r, r) + r = KissMetricsNode().render( + Context( + { + "kiss_metrics_event": ( + "test_event", + {"prop1": "val1", "prop2": "val2"}, + ), + } + ) + ) + self.assertTrue( + "_kmq.push(['record', 'test_event', " + '{"prop1": "val1", "prop2": "val2"}]);' in r, + r, + ) def test_property(self): - r = KissMetricsNode().render(Context({ - 'kiss_metrics_properties': {'prop1': 'val1', 'prop2': 'val2'}, - })) - self.assertTrue("_kmq.push([\'set\', " - '{"prop1": "val1", "prop2": "val2"}]);' in r, r) + r = KissMetricsNode().render( + Context( + { + "kiss_metrics_properties": {"prop1": "val1", "prop2": "val2"}, + } + ) + ) + self.assertTrue( + "_kmq.push(['set', " '{"prop1": "val1", "prop2": "val2"}]);' in r, 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"}, + } + ) + ) self.assertTrue("_kmq.push(['alias', 'test', 'test_alias']);" in r, r) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = KissMetricsNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_tag_luckyorange.py b/tests/unit/test_tag_luckyorange.py index a4e082b..7357e7e 100644 --- a/tests/unit/test_tag_luckyorange.py +++ b/tests/unit/test_tag_luckyorange.py @@ -4,13 +4,12 @@ Tests for the Lucky Orange template tags. from django.http import HttpRequest from django.template import Context, Template, TemplateSyntaxError from django.test import override_settings +from utils import TagTestCase from analytical.templatetags.analytical import _load_template_nodes from analytical.templatetags.luckyorange import LuckyOrangeNode -from utils import TagTestCase from analytical.utils import AnalyticalException - expected_html = """\ ', - self.render_tag('optimizely', 'optimizely')) + '', + self.render_tag("optimizely", "optimizely"), + ) def test_node(self): self.assertEqual( - '', - OptimizelyNode().render(Context())) + '', + OptimizelyNode().render(Context()), + ) @override_settings(OPTIMIZELY_ACCOUNT_NUMBER=None) def test_no_account_number(self): self.assertRaises(AnalyticalException, OptimizelyNode) - @override_settings(OPTIMIZELY_ACCOUNT_NUMBER='123abc') + @override_settings(OPTIMIZELY_ACCOUNT_NUMBER="123abc") def test_wrong_account_number(self): self.assertRaises(AnalyticalException, OptimizelyNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = OptimizelyNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_tag_performable.py b/tests/unit/test_tag_performable.py index 24e20c8..713e3be 100644 --- a/tests/unit/test_tag_performable.py +++ b/tests/unit/test_tag_performable.py @@ -2,56 +2,57 @@ Tests for the Performable template tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.performable import PerformableNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(PERFORMABLE_API_KEY='123ABC') +@override_settings(PERFORMABLE_API_KEY="123ABC") class PerformableTagTestCase(TagTestCase): """ Tests for the ``performable`` template tag. """ def test_tag(self): - r = self.render_tag('performable', 'performable') - self.assertTrue('/performable/pax/123ABC.js' in r, r) + r = self.render_tag("performable", "performable") + self.assertTrue("/performable/pax/123ABC.js" in r, r) def test_node(self): r = PerformableNode().render(Context()) - self.assertTrue('/performable/pax/123ABC.js' in r, r) + self.assertTrue("/performable/pax/123ABC.js" in r, r) @override_settings(PERFORMABLE_API_KEY=None) def test_no_api_key(self): self.assertRaises(AnalyticalException, PerformableNode) - @override_settings(PERFORMABLE_API_KEY='123 ABC') + @override_settings(PERFORMABLE_API_KEY="123 ABC") def test_wrong_account_number(self): self.assertRaises(AnalyticalException, PerformableNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = PerformableNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = PerformableNode().render(Context({'user': User(username='test')})) + r = PerformableNode().render(Context({"user": User(username="test")})) self.assertTrue('_paq.push(["identify", {identity: "test"}]);' in r, r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = PerformableNode().render(Context({'user': AnonymousUser()})) + r = PerformableNode().render(Context({"user": AnonymousUser()})) self.assertFalse('_paq.push(["identify", ' in r, r) @@ -61,11 +62,9 @@ class PerformableEmbedTagTestCase(TagTestCase): """ def test_tag(self): - domain = 'example.com' - page = 'test' + domain = "example.com" + page = "test" tag = self.render_tag( - 'performable', 'performable_embed "%s" "%s"' % (domain, page) - ) - self.assertIn( - "$f.initialize({'host': 'example.com', 'page': 'test'});", tag + "performable", 'performable_embed "%s" "%s"' % (domain, page) ) + self.assertIn("$f.initialize({'host': 'example.com', 'page': 'test'});", tag) diff --git a/tests/unit/test_tag_piwik.py b/tests/unit/test_tag_piwik.py index 38aa317..f115221 100644 --- a/tests/unit/test_tag_piwik.py +++ b/tests/unit/test_tag_piwik.py @@ -6,48 +6,43 @@ from django.contrib.auth.models import User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.piwik import PiwikNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(PIWIK_DOMAIN_PATH='example.com', PIWIK_SITE_ID='345') +@override_settings(PIWIK_DOMAIN_PATH="example.com", PIWIK_SITE_ID="345") class PiwikTagTestCase(TagTestCase): """ Tests for the ``piwik`` template tag. """ def test_tag(self): - r = self.render_tag('piwik', 'piwik') + r = self.render_tag("piwik", "piwik") self.assertTrue('"//example.com/"' in r, r) self.assertTrue("_paq.push(['setSiteId', 345]);" in r, r) - self.assertTrue('img src="//example.com/piwik.php?idsite=345"' - in r, r) + self.assertTrue('img src="//example.com/piwik.php?idsite=345"' in r, r) def test_node(self): r = PiwikNode().render(Context({})) self.assertTrue('"//example.com/";' in r, r) self.assertTrue("_paq.push(['setSiteId', 345]);" in r, r) - self.assertTrue('img src="//example.com/piwik.php?idsite=345"' - in r, r) + self.assertTrue('img src="//example.com/piwik.php?idsite=345"' in r, r) - @override_settings(PIWIK_DOMAIN_PATH='example.com/piwik', - PIWIK_SITE_ID='345') + @override_settings(PIWIK_DOMAIN_PATH="example.com/piwik", PIWIK_SITE_ID="345") def test_domain_path_valid(self): - r = self.render_tag('piwik', 'piwik') + r = self.render_tag("piwik", "piwik") self.assertTrue('"//example.com/piwik/"' in r, r) - @override_settings(PIWIK_DOMAIN_PATH='example.com:1234', - PIWIK_SITE_ID='345') + @override_settings(PIWIK_DOMAIN_PATH="example.com:1234", PIWIK_SITE_ID="345") def test_domain_port_valid(self): - r = self.render_tag('piwik', 'piwik') + r = self.render_tag("piwik", "piwik") self.assertTrue('"//example.com:1234/";' in r, r) - @override_settings(PIWIK_DOMAIN_PATH='example.com:1234/piwik', - PIWIK_SITE_ID='345') + @override_settings(PIWIK_DOMAIN_PATH="example.com:1234/piwik", PIWIK_SITE_ID="345") def test_domain_port_path_valid(self): - r = self.render_tag('piwik', 'piwik') + r = self.render_tag("piwik", "piwik") self.assertTrue('"//example.com:1234/piwik/"' in r, r) @override_settings(PIWIK_DOMAIN_PATH=None) @@ -58,91 +53,98 @@ class PiwikTagTestCase(TagTestCase): def test_no_siteid(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_SITE_ID='x') + @override_settings(PIWIK_SITE_ID="x") def test_siteid_not_a_number(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_DOMAIN_PATH='http://www.example.com') + @override_settings(PIWIK_DOMAIN_PATH="http://www.example.com") def test_domain_protocol_invalid(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_DOMAIN_PATH='example.com/') + @override_settings(PIWIK_DOMAIN_PATH="example.com/") def test_domain_slash_invalid(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_DOMAIN_PATH='example.com:123:456') + @override_settings(PIWIK_DOMAIN_PATH="example.com:123:456") def test_domain_multi_port(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_DOMAIN_PATH='example.com:') + @override_settings(PIWIK_DOMAIN_PATH="example.com:") def test_domain_incomplete_port(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_DOMAIN_PATH='example.com:/piwik') + @override_settings(PIWIK_DOMAIN_PATH="example.com:/piwik") def test_domain_uri_incomplete_port(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(PIWIK_DOMAIN_PATH='example.com:12df') + @override_settings(PIWIK_DOMAIN_PATH="example.com:12df") def test_domain_port_invalid(self): self.assertRaises(AnalyticalException, PiwikNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = PiwikNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue(r.startswith(""), r) def test_uservars(self): - context = Context({'piwik_vars': [(1, 'foo', 'foo_val'), - (2, 'bar', 'bar_val', 'page'), - (3, 'spam', 'spam_val', 'visit')]}) + context = Context( + { + "piwik_vars": [ + (1, "foo", "foo_val"), + (2, "bar", "bar_val", "page"), + (3, "spam", "spam_val", "visit"), + ] + } + ) r = PiwikNode().render(context) - msg = 'Incorrect Piwik custom variable rendering. Expected:\n%s\nIn:\n%s' - 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"]);']: + msg = "Incorrect Piwik custom variable rendering. Expected:\n%s\nIn:\n%s" + 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"]);', + ]: self.assertIn(var_code, r, msg % (var_code, 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 = PiwikNode().render(context) - msg = 'Incorrect Piwik user tracking rendering.\nNot found:\n%s\nIn:\n%s' + msg = "Incorrect Piwik user tracking rendering.\nNot found:\n%s\nIn:\n%s" var_code = '_paq.push(["setUserId", "BDFL"]);' self.assertIn(var_code, r, msg % (var_code, r)) def test_piwik_usertrack(self): - context = Context({ - 'piwik_identity': 'BDFL' - }) + context = Context({"piwik_identity": "BDFL"}) r = PiwikNode().render(context) - msg = 'Incorrect Piwik user tracking rendering.\nNot found:\n%s\nIn:\n%s' + msg = "Incorrect Piwik user tracking rendering.\nNot found:\n%s\nIn:\n%s" var_code = '_paq.push(["setUserId", "BDFL"]);' self.assertIn(var_code, r, msg % (var_code, r)) def test_analytical_usertrack(self): - context = Context({ - 'analytical_identity': 'BDFL' - }) + context = Context({"analytical_identity": "BDFL"}) r = PiwikNode().render(context) - msg = 'Incorrect Piwik user tracking rendering.\nNot found:\n%s\nIn:\n%s' + msg = "Incorrect Piwik user tracking rendering.\nNot found:\n%s\nIn:\n%s" var_code = '_paq.push(["setUserId", "BDFL"]);' self.assertIn(var_code, r, msg % (var_code, 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'), - 'piwik_identity': None - }) + context = Context( + { + "user": User( + username="BDFL", first_name="Guido", last_name="van Rossum" + ), + "piwik_identity": None, + } + ) r = PiwikNode().render(context) - msg = 'Incorrect Piwik user tracking rendering.\nFound:\n%s\nIn:\n%s' + msg = "Incorrect Piwik user tracking rendering.\nFound:\n%s\nIn:\n%s" var_code = '_paq.push(["setUserId", "BDFL"]);' self.assertNotIn(var_code, r, msg % (var_code, r)) diff --git a/tests/unit/test_tag_rating_mailru.py b/tests/unit/test_tag_rating_mailru.py index d8f9459..b73a1a7 100644 --- a/tests/unit/test_tag_rating_mailru.py +++ b/tests/unit/test_tag_rating_mailru.py @@ -5,20 +5,20 @@ Tests for the Rating@Mail.ru template tags and filters. from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.rating_mailru import RatingMailruNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(RATING_MAILRU_COUNTER_ID='1234567') +@override_settings(RATING_MAILRU_COUNTER_ID="1234567") class RatingMailruTagTestCase(TagTestCase): """ Tests for the ``rating_mailru`` template tag. """ def test_tag(self): - r = self.render_tag('rating_mailru', 'rating_mailru') + r = self.render_tag("rating_mailru", "rating_mailru") self.assertTrue("counter?id=1234567;js=na" in r, r) def test_node(self): @@ -29,16 +29,17 @@ class RatingMailruTagTestCase(TagTestCase): def test_no_site_id(self): self.assertRaises(AnalyticalException, RatingMailruNode) - @override_settings(RATING_MAILRU_COUNTER_ID='1234abc') + @override_settings(RATING_MAILRU_COUNTER_ID="1234abc") def test_wrong_site_id(self): self.assertRaises(AnalyticalException, RatingMailruNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = RatingMailruNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_tag_snapengage.py b/tests/unit/test_tag_snapengage.py index 215ebe2..44bcce6 100644 --- a/tests/unit/test_tag_snapengage.py +++ b/tests/unit/test_tag_snapengage.py @@ -2,20 +2,26 @@ Tests for the SnapEngage template tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.template import Context from django.test.utils import override_settings from django.utils import translation - -from analytical.templatetags.snapengage import SnapEngageNode, \ - BUTTON_STYLE_LIVE, BUTTON_STYLE_DEFAULT, BUTTON_STYLE_NONE, \ - BUTTON_LOCATION_LEFT, BUTTON_LOCATION_RIGHT, BUTTON_LOCATION_TOP, \ - BUTTON_LOCATION_BOTTOM, FORM_POSITION_TOP_LEFT from utils import TagTestCase + +from analytical.templatetags.snapengage import ( + BUTTON_LOCATION_BOTTOM, + BUTTON_LOCATION_LEFT, + BUTTON_LOCATION_RIGHT, + BUTTON_LOCATION_TOP, + BUTTON_STYLE_DEFAULT, + BUTTON_STYLE_LIVE, + BUTTON_STYLE_NONE, + FORM_POSITION_TOP_LEFT, + SnapEngageNode, +) from analytical.utils import AnalyticalException - -WIDGET_ID = 'ec329c69-0bf0-4db8-9b77-3f8150fb977e' +WIDGET_ID = "ec329c69-0bf0-4db8-9b77-3f8150fb977e" @override_settings( @@ -30,246 +36,343 @@ class SnapEngageTestCase(TagTestCase): """ def test_tag(self): - r = self.render_tag('snapengage', 'snapengage') + r = self.render_tag("snapengage", "snapengage") self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) def test_node(self): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) @override_settings(SNAPENGAGE_WIDGET_ID=None) def test_no_site_id(self): self.assertRaises(AnalyticalException, SnapEngageNode) - @override_settings(SNAPENGAGE_WIDGET_ID='abc') + @override_settings(SNAPENGAGE_WIDGET_ID="abc") def test_wrong_site_id(self): self.assertRaises(AnalyticalException, SnapEngageNode) def test_no_button(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button': BUTTON_STYLE_NONE, - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button": BUTTON_STYLE_NONE, + } + ) + ) self.assertTrue('SnapABug.init("ec329c69-0bf0-4db8-9b77-3f8150fb977e")' in r, r) with override_settings(SNAPENGAGE_BUTTON=BUTTON_STYLE_NONE): r = SnapEngageNode().render(Context()) self.assertTrue( - 'SnapABug.init("ec329c69-0bf0-4db8-9b77-3f8150fb977e")' in r, r) + 'SnapABug.init("ec329c69-0bf0-4db8-9b77-3f8150fb977e")' in r, r + ) def test_live_button(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button': BUTTON_STYLE_LIVE, - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button": BUTTON_STYLE_LIVE, + } + ) + ) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"55%",true);' in r, r) + '"55%",true);' in r, + r, + ) with override_settings(SNAPENGAGE_BUTTON=BUTTON_STYLE_LIVE): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"55%",true);' in r, r) + '"55%",true);' in r, + r, + ) def test_custom_button(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button': "http://www.example.com/button.png", - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button": "http://www.example.com/button.png", + } + ) + ) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) self.assertTrue( - 'SnapABug.setButton("http://www.example.com/button.png");' in r, r) - with override_settings( - SNAPENGAGE_BUTTON="http://www.example.com/button.png"): + 'SnapABug.setButton("http://www.example.com/button.png");' in r, r + ) + with override_settings(SNAPENGAGE_BUTTON="http://www.example.com/button.png"): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) self.assertTrue( - 'SnapABug.setButton("http://www.example.com/button.png");' in r, - r) + 'SnapABug.setButton("http://www.example.com/button.png");' in r, r + ) def test_button_location_right(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location': BUTTON_LOCATION_RIGHT, - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button_location": BUTTON_LOCATION_RIGHT, + } + ) + ) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","1",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) with override_settings(SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_RIGHT): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","1",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) def test_button_location_top(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location': BUTTON_LOCATION_TOP, - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button_location": BUTTON_LOCATION_TOP, + } + ) + ) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","2",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) with override_settings(SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_TOP): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","2",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) def test_button_location_bottom(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location': BUTTON_LOCATION_BOTTOM, - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button_location": BUTTON_LOCATION_BOTTOM, + } + ) + ) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","3",' - '"55%");' in r, r) - with override_settings( - SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_BOTTOM): + '"55%");' in r, + r, + ) + with override_settings(SNAPENGAGE_BUTTON_LOCATION=BUTTON_LOCATION_BOTTOM): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","3",' - '"55%");' in r, r) + '"55%");' in r, + r, + ) def test_button_offset(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_location_offset': "30%", - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button_location_offset": "30%", + } + ) + ) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"30%");' in r, r) + '"30%");' in r, + r, + ) with override_settings(SNAPENGAGE_BUTTON_LOCATION_OFFSET="30%"): r = SnapEngageNode().render(Context()) self.assertTrue( 'SnapABug.addButton("ec329c69-0bf0-4db8-9b77-3f8150fb977e","0",' - '"30%");' in r, r) + '"30%");' in r, + r, + ) def test_button_effect(self): - r = SnapEngageNode().render(Context({ - 'snapengage_button_effect': "-4px", - })) + r = SnapEngageNode().render( + Context( + { + "snapengage_button_effect": "-4px", + } + ) + ) self.assertTrue('SnapABug.setButtonEffect("-4px");' in r, r) with override_settings(SNAPENGAGE_BUTTON_EFFECT="-4px"): r = SnapEngageNode().render(Context()) self.assertTrue('SnapABug.setButtonEffect("-4px");' in r, 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, + } + ) + ) self.assertTrue('SnapABug.setChatFormPosition("tl");' in r, r) with override_settings(SNAPENGAGE_FORM_POSITION=FORM_POSITION_TOP_LEFT): r = SnapEngageNode().render(Context()) self.assertTrue('SnapABug.setChatFormPosition("tl");' in r, r) def test_form_top_position(self): - r = SnapEngageNode().render(Context({ - 'snapengage_form_top_position': 40, - })) - self.assertTrue('SnapABug.setFormTopPosition(40);' in r, r) + r = SnapEngageNode().render( + Context( + { + "snapengage_form_top_position": 40, + } + ) + ) + self.assertTrue("SnapABug.setFormTopPosition(40);" in r, r) with override_settings(SNAPENGAGE_FORM_TOP_POSITION=40): r = SnapEngageNode().render(Context()) - self.assertTrue('SnapABug.setFormTopPosition(40);' in r, r) + self.assertTrue("SnapABug.setFormTopPosition(40);" in r, r) def test_domain(self): - r = SnapEngageNode().render(Context({ - 'snapengage_domain': "example.com"})) + r = SnapEngageNode().render(Context({"snapengage_domain": "example.com"})) self.assertTrue('SnapABug.setDomain("example.com");' in r, r) with override_settings(SNAPENGAGE_DOMAIN="example.com"): r = SnapEngageNode().render(Context()) self.assertTrue('SnapABug.setDomain("example.com");' in r, r) def test_secure_connection(self): - r = SnapEngageNode().render(Context({ - 'snapengage_secure_connection': True})) - self.assertTrue('SnapABug.setSecureConnexion();' in r, r) + r = SnapEngageNode().render(Context({"snapengage_secure_connection": True})) + self.assertTrue("SnapABug.setSecureConnexion();" in r, r) with override_settings(SNAPENGAGE_SECURE_CONNECTION=True): r = SnapEngageNode().render(Context()) - self.assertTrue('SnapABug.setSecureConnexion();' in r, r) + self.assertTrue("SnapABug.setSecureConnexion();" in r, r) def test_show_offline(self): - r = SnapEngageNode().render(Context({ - 'snapengage_show_offline': False, - })) - self.assertTrue('SnapABug.allowOffline(false);' in r, r) + r = SnapEngageNode().render( + Context( + { + "snapengage_show_offline": False, + } + ) + ) + self.assertTrue("SnapABug.allowOffline(false);" in r, r) with override_settings(SNAPENGAGE_SHOW_OFFLINE=False): r = SnapEngageNode().render(Context()) - self.assertTrue('SnapABug.allowOffline(false);' in r, r) + self.assertTrue("SnapABug.allowOffline(false);" in r, r) def test_proactive_chat(self): - r = SnapEngageNode().render(Context({ - 'snapengage_proactive_chat': False})) - self.assertTrue('SnapABug.allowProactiveChat(false);' in r, r) + r = SnapEngageNode().render(Context({"snapengage_proactive_chat": False})) + self.assertTrue("SnapABug.allowProactiveChat(false);" in r, r) def test_screenshot(self): - r = SnapEngageNode().render(Context({ - 'snapengage_screenshots': False, - })) - self.assertTrue('SnapABug.allowScreenshot(false);' in r, r) + r = SnapEngageNode().render( + Context( + { + "snapengage_screenshots": False, + } + ) + ) + self.assertTrue("SnapABug.allowScreenshot(false);" in r, r) with override_settings(SNAPENGAGE_SCREENSHOTS=False): r = SnapEngageNode().render(Context()) - self.assertTrue('SnapABug.allowScreenshot(false);' in r, r) + self.assertTrue("SnapABug.allowScreenshot(false);" in r, r) def test_offline_screenshots(self): - r = SnapEngageNode().render(Context({ - 'snapengage_offline_screenshots': False, - })) - self.assertTrue('SnapABug.showScreenshotOption(false);' in r, r) + r = SnapEngageNode().render( + Context( + { + "snapengage_offline_screenshots": False, + } + ) + ) + self.assertTrue("SnapABug.showScreenshotOption(false);" in r, r) with override_settings(SNAPENGAGE_OFFLINE_SCREENSHOTS=False): r = SnapEngageNode().render(Context()) - self.assertTrue('SnapABug.showScreenshotOption(false);' in r, r) + self.assertTrue("SnapABug.showScreenshotOption(false);" in r, r) def test_sounds(self): - r = SnapEngageNode().render(Context({'snapengage_sounds': False})) - self.assertTrue('SnapABug.allowChatSound(false);' in r, r) + r = SnapEngageNode().render(Context({"snapengage_sounds": False})) + self.assertTrue("SnapABug.allowChatSound(false);" in r, r) with override_settings(SNAPENGAGE_SOUNDS=False): r = SnapEngageNode().render(Context()) - self.assertTrue('SnapABug.allowChatSound(false);' in r, r) + self.assertTrue("SnapABug.allowChatSound(false);" in r, r) @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", + } + ) + ) self.assertTrue('SnapABug.setUserEmail("test@example.com");' in r, 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, + } + ) + ) self.assertTrue('SnapABug.setUserEmail("test@example.com",true);' in r, 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", + } + ) + ) self.assertTrue('SnapABug.setUserEmail("test@example.com",true);' in r, 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"), + } + ) + ) self.assertTrue('SnapABug.setUserEmail("test@example.com");' in r, r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = SnapEngageNode().render(Context({ - 'user': AnonymousUser(), - })) - self.assertFalse('SnapABug.setUserEmail(' in r, r) + r = SnapEngageNode().render( + Context( + { + "user": AnonymousUser(), + } + ) + ) + self.assertFalse("SnapABug.setUserEmail(" in r, r) def test_language(self): - r = SnapEngageNode().render(Context({'snapengage_locale': 'fr'})) + r = SnapEngageNode().render(Context({"snapengage_locale": "fr"})) self.assertTrue('SnapABug.setLocale("fr");' in r, r) - with override_settings(SNAPENGAGE_LOCALE='fr'): + with override_settings(SNAPENGAGE_LOCALE="fr"): r = SnapEngageNode().render(Context()) self.assertTrue('SnapABug.setLocale("fr");' in r, r) def test_automatic_language(self): real_get_language = translation.get_language try: - translation.get_language = lambda: 'fr-ca' + translation.get_language = lambda: "fr-ca" r = SnapEngageNode().render(Context()) self.assertTrue('SnapABug.setLocale("fr_CA");' in r, r) finally: diff --git a/tests/unit/test_tag_spring_metrics.py b/tests/unit/test_tag_spring_metrics.py index ca00e71..9d650d1 100644 --- a/tests/unit/test_tag_spring_metrics.py +++ b/tests/unit/test_tag_spring_metrics.py @@ -2,24 +2,24 @@ Tests for the Spring Metrics template tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.spring_metrics import SpringMetricsNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(SPRING_METRICS_TRACKING_ID='12345678') +@override_settings(SPRING_METRICS_TRACKING_ID="12345678") class SpringMetricsTagTestCase(TagTestCase): """ Tests for the ``spring_metrics`` template tag. """ def test_tag(self): - r = self.render_tag('spring_metrics', 'spring_metrics') + r = self.render_tag("spring_metrics", "spring_metrics") self.assertTrue("_springMetq.push(['id', '12345678']);" in r, r) def test_node(self): @@ -30,36 +30,47 @@ class SpringMetricsTagTestCase(TagTestCase): def test_no_site_id(self): self.assertRaises(AnalyticalException, SpringMetricsNode) - @override_settings(SPRING_METRICS_TRACKING_ID='123xyz') + @override_settings(SPRING_METRICS_TRACKING_ID="123xyz") def test_wrong_site_id(self): self.assertRaises(AnalyticalException, SpringMetricsNode) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify(self): - r = SpringMetricsNode().render(Context({ - 'user': User(email='test@test.com'), - })) - self.assertTrue("_springMetq.push(['setdata', {'email': 'test@test.com'}]);" in r, r) + r = SpringMetricsNode().render( + Context( + { + "user": User(email="test@test.com"), + } + ) + ) + self.assertTrue( + "_springMetq.push(['setdata', {'email': 'test@test.com'}]);" in r, r + ) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = SpringMetricsNode().render(Context({'user': AnonymousUser()})) + r = SpringMetricsNode().render(Context({"user": AnonymousUser()})) self.assertFalse("_springMetq.push(['setdata', {'email':" in r, 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", + } + ) + ) self.assertTrue("_springMetq.push(['setdata', {'var1': 'val1'}]);" in r, r) self.assertTrue("_springMetq.push(['setdata', {'var2': 'val2'}]);" in r, r) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = SpringMetricsNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_tag_uservoice.py b/tests/unit/test_tag_uservoice.py index c740311..cfd91d8 100644 --- a/tests/unit/test_tag_uservoice.py +++ b/tests/unit/test_tag_uservoice.py @@ -4,13 +4,13 @@ Tests for the UserVoice tags and filters. from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.uservoice import UserVoiceNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(USERVOICE_WIDGET_KEY='abcdefghijklmnopqrst') +@override_settings(USERVOICE_WIDGET_KEY="abcdefghijklmnopqrst") class UserVoiceTagTestCase(TagTestCase): """ Tests for the ``uservoice`` template tag. @@ -27,34 +27,34 @@ class UserVoiceTagTestCase(TagTestCase): self.assertIn("widget.uservoice.com/abcdefghijklmnopqrst.js", r) def test_tag(self): - r = self.render_tag('uservoice', 'uservoice') + r = self.render_tag("uservoice", "uservoice") self.assertIn("widget.uservoice.com/abcdefghijklmnopqrst.js", r) @override_settings(USERVOICE_WIDGET_KEY=None) def test_no_key(self): self.assertRaises(AnalyticalException, UserVoiceNode) - @override_settings(USERVOICE_WIDGET_KEY='abcdefgh ijklmnopqrst') + @override_settings(USERVOICE_WIDGET_KEY="abcdefgh ijklmnopqrst") def test_invalid_key(self): self.assertRaises(AnalyticalException, UserVoiceNode) - @override_settings(USERVOICE_WIDGET_KEY='') + @override_settings(USERVOICE_WIDGET_KEY="") def test_empty_key(self): self.assertRaises(AnalyticalException, UserVoiceNode) def test_overridden_key(self): - vars = {'uservoice_widget_key': 'defghijklmnopqrstuvw'} + vars = {"uservoice_widget_key": "defghijklmnopqrstuvw"} r = UserVoiceNode().render(Context(vars)) self.assertIn("widget.uservoice.com/defghijklmnopqrstuvw.js", r) - @override_settings(USERVOICE_WIDGET_OPTIONS={'key1': 'val1'}) + @override_settings(USERVOICE_WIDGET_OPTIONS={"key1": "val1"}) def test_options(self): r = UserVoiceNode().render(Context()) self.assertIn("""UserVoice.push(['set', {"key1": "val1"}]);""", r) - @override_settings(USERVOICE_WIDGET_OPTIONS={'key1': 'val1'}) + @override_settings(USERVOICE_WIDGET_OPTIONS={"key1": "val1"}) def test_override_options(self): - data = {'uservoice_widget_options': {'key1': 'val2'}} + data = {"uservoice_widget_options": {"key1": "val2"}} r = UserVoiceNode().render(Context(data)) self.assertIn("""UserVoice.push(['set', {"key1": "val2"}]);""", r) @@ -69,5 +69,5 @@ class UserVoiceTagTestCase(TagTestCase): @override_settings(USERVOICE_ADD_TRIGGER=False) def test_auto_trigger_custom_win(self): - r = UserVoiceNode().render(Context({'uservoice_add_trigger': True})) + r = UserVoiceNode().render(Context({"uservoice_add_trigger": True})) self.assertTrue("UserVoice.push(['addTrigger', {}]);" in r, r) diff --git a/tests/unit/test_tag_woopra.py b/tests/unit/test_tag_woopra.py index 9dca7e9..c638ecb 100644 --- a/tests/unit/test_tag_woopra.py +++ b/tests/unit/test_tag_woopra.py @@ -2,24 +2,24 @@ Tests for the Woopra template tags and filters. """ -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.woopra import WoopraNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(WOOPRA_DOMAIN='example.com') +@override_settings(WOOPRA_DOMAIN="example.com") class WoopraTagTestCase(TagTestCase): """ Tests for the ``woopra`` template tag. """ def test_tag(self): - r = self.render_tag('woopra', 'woopra') + r = self.render_tag("woopra", "woopra") self.assertTrue('var woo_settings = {"domain": "example.com"};' in r, r) def test_node(self): @@ -30,66 +30,89 @@ class WoopraTagTestCase(TagTestCase): def test_no_domain(self): self.assertRaises(AnalyticalException, WoopraNode) - @override_settings(WOOPRA_DOMAIN='this is not a domain') + @override_settings(WOOPRA_DOMAIN="this is not a domain") def test_wrong_domain(self): self.assertRaises(AnalyticalException, WoopraNode) @override_settings(WOOPRA_IDLE_TIMEOUT=1234) def test_idle_timeout(self): r = WoopraNode().render(Context({})) - self.assertTrue('var woo_settings = ' - '{"domain": "example.com", "idle_timeout": "1234"};' in r, r) + self.assertTrue( + "var woo_settings = " + '{"domain": "example.com", "idle_timeout": "1234"};' in r, + 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", + } + ) + ) self.assertTrue('var woo_visitor = {"var1": "val1", "var2": "val2"};' in r, 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"), - })) - self.assertTrue('var woo_visitor = ' - '{"email": "test@example.com", "name": "Firstname Lastname"};' in r, r) + r = WoopraNode().render( + Context( + { + "user": User( + username="test", + first_name="Firstname", + last_name="Lastname", + email="test@example.com", + ), + } + ) + ) + self.assertTrue( + "var woo_visitor = " + '{"email": "test@example.com", "name": "Firstname Lastname"};' in r, + r, + ) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_username_no_email(self): - r = WoopraNode().render(Context({'user': User(username='test')})) + r = WoopraNode().render(Context({"user": User(username="test")})) self.assertTrue('var woo_visitor = {"name": "test"};' in r, r) @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"), + } + ) + ) self.assertTrue('var woo_visitor = {"name": "explicit"};' in r, 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"), + } + ) + ) self.assertTrue('var woo_visitor = {"email": "explicit"};' in r, r) @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_identify_anonymous_user(self): - r = WoopraNode().render(Context({'user': AnonymousUser()})) - self.assertTrue('var woo_visitor = {};' in r, r) + r = WoopraNode().render(Context({"user": AnonymousUser()})) + self.assertTrue("var woo_visitor = {};" in r, r) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = WoopraNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue(r.startswith(""), r) diff --git a/tests/unit/test_tag_yandex_metrica.py b/tests/unit/test_tag_yandex_metrica.py index 3b0619e..f06a33a 100644 --- a/tests/unit/test_tag_yandex_metrica.py +++ b/tests/unit/test_tag_yandex_metrica.py @@ -6,20 +6,20 @@ Tests for the Yandex.Metrica template tags and filters. from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TagTestCase from analytical.templatetags.yandex_metrica import YandexMetricaNode -from utils import TagTestCase from analytical.utils import AnalyticalException -@override_settings(YANDEX_METRICA_COUNTER_ID='12345678') +@override_settings(YANDEX_METRICA_COUNTER_ID="12345678") class YandexMetricaTagTestCase(TagTestCase): """ Tests for the ``yandex_metrica`` template tag. """ def test_tag(self): - r = self.render_tag('yandex_metrica', 'yandex_metrica') + r = self.render_tag("yandex_metrica", "yandex_metrica") self.assertTrue("w.yaCounter12345678 = new Ya.Metrika" in r, r) def test_node(self): @@ -30,16 +30,17 @@ class YandexMetricaTagTestCase(TagTestCase): def test_no_site_id(self): self.assertRaises(AnalyticalException, YandexMetricaNode) - @override_settings(YANDEX_METRICA_COUNTER_ID='1234abcd') + @override_settings(YANDEX_METRICA_COUNTER_ID="1234abcd") def test_wrong_site_id(self): self.assertRaises(AnalyticalException, YandexMetricaNode) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) r = YandexMetricaNode().render(context) - self.assertTrue(r.startswith( - ''), r) + self.assertTrue( + r.startswith(""), r) diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 22b2a88..6dbe158 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -8,6 +8,7 @@ from django.db import models from django.http import HttpRequest from django.template import Context from django.test.utils import override_settings +from utils import TestCase from analytical.utils import ( AnalyticalException, @@ -16,54 +17,54 @@ from analytical.utils import ( get_required_setting, is_internal_ip, ) -from utils import TestCase 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 self.assertRaisesRegex(AnalyticalException, "^USER_ID setting is not set$"): + with self.assertRaisesRegex( + AnalyticalException, "^USER_ID setting is not set$" + ): get_required_setting("USER_ID", r"\d+", "invalid USER_ID") class MyUser(AbstractBaseUser): identity = models.CharField(max_length=50) - USERNAME_FIELD = 'identity' + USERNAME_FIELD = "identity" class Meta: abstract = True - app_label = 'testapp' + app_label = "testapp" class GetIdentityTestCase(TestCase): def test_custom_username_field(self): - get_id = get_identity(Context({}), user=MyUser(identity='fake_id')) - self.assertEqual(get_id, 'fake_id') + get_id = get_identity(Context({}), user=MyUser(identity="fake_id")) + self.assertEqual(get_id, "fake_id") @override_settings(ANALYTICAL_DOMAIN="example.org") class GetDomainTestCase(TestCase): def test_get_service_domain_from_context(self): - context = Context({'test_domain': 'example.com'}) - self.assertEqual(get_domain(context, 'test'), 'example.com') + context = Context({"test_domain": "example.com"}) + self.assertEqual(get_domain(context, "test"), "example.com") def test_get_analytical_domain_from_context(self): - context = Context({'analytical_domain': 'example.com'}) - self.assertEqual(get_domain(context, 'test'), 'example.com') + context = Context({"analytical_domain": "example.com"}) + self.assertEqual(get_domain(context, "test"), "example.com") @override_settings(TEST_DOMAIN="example.net") def test_get_service_domain_from_settings(self): context = Context() - self.assertEqual(get_domain(context, 'test'), 'example.net') + self.assertEqual(get_domain(context, "test"), "example.net") def test_get_analytical_domain_from_settings(self): context = Context() - self.assertEqual(get_domain(context, 'test'), 'example.org') + self.assertEqual(get_domain(context, "test"), "example.org") # FIXME: enable Django apps dynamically and enable test again @@ -78,51 +79,50 @@ class GetDomainTestCase(TestCase): class InternalIpTestCase(TestCase): - - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_no_internal_ip(self): context = Context() self.assertFalse(is_internal_ip(context)) - @override_settings(INTERNAL_IPS=['1.1.1.1']) + @override_settings(INTERNAL_IPS=["1.1.1.1"]) @override_settings(ANALYTICAL_INTERNAL_IPS=[]) def test_render_analytical_internal_ips_override_when_empty(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) self.assertFalse(is_internal_ip(context)) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) self.assertTrue(is_internal_ip(context)) - @override_settings(TEST_INTERNAL_IPS=['1.1.1.1']) + @override_settings(TEST_INTERNAL_IPS=["1.1.1.1"]) def test_render_prefix_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) - self.assertTrue(is_internal_ip(context, 'TEST')) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) + self.assertTrue(is_internal_ip(context, "TEST")) - @override_settings(INTERNAL_IPS=['1.1.1.1']) + @override_settings(INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip_fallback(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "1.1.1.1" + context = Context({"request": req}) self.assertTrue(is_internal_ip(context)) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_internal_ip_forwarded_for(self): req = HttpRequest() - req.META['HTTP_X_FORWARDED_FOR'] = '1.1.1.1' - context = Context({'request': req}) + req.META["HTTP_X_FORWARDED_FOR"] = "1.1.1.1" + context = Context({"request": req}) self.assertTrue(is_internal_ip(context)) - @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) + @override_settings(ANALYTICAL_INTERNAL_IPS=["1.1.1.1"]) def test_render_different_internal_ip(self): req = HttpRequest() - req.META['REMOTE_ADDR'] = '2.2.2.2' - context = Context({'request': req}) + req.META["REMOTE_ADDR"] = "2.2.2.2" + context = Context({"request": req}) self.assertFalse(is_internal_ip(context)) diff --git a/tests/unit/utils.py b/tests/unit/utils.py index 75fc6fa..6008e08 100644 --- a/tests/unit/utils.py +++ b/tests/unit/utils.py @@ -2,7 +2,7 @@ Testing utilities. """ -from django.template import Template, Context, RequestContext +from django.template import Context, RequestContext, Template from django.test.testcases import TestCase diff --git a/tox.ini b/tox.ini index 850352f..e019db2 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ envlist = # Python/Django combinations that are officially supported py{36,37,38,39}-django{22,30,31} - py37-{flake8,bandit,readme,docs} + py37-{lint,bandit,readme,docs} [testenv] description = Unit tests @@ -36,10 +36,17 @@ deps = sphinx commands = sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html whitelist_externals = make -[testenv:py37-flake8] +[testenv:py37-lint] description = Static code analysis and code style -deps = flake8 -commands = flake8 +skip_install = True +deps = + flake8 + isort + black +commands = + flake8 + isort tests setup.py analytical --check --diff + black tests setup.py analytical --check [testenv:py37-readme] description = Ensure README renders on PyPI