sort_keys all the things!

This commit is contained in:
skoczen 2014-04-28 15:52:36 -07:00
parent a94f0d8bb0
commit 559cd3677f
15 changed files with 38 additions and 58 deletions

View file

@ -86,7 +86,7 @@ class ChartbeatBottomNode(Node):
domain = _get_domain(context)
if domain is not None:
config['domain'] = domain
html = SETUP_CODE % {'config': json.dumps(config)}
html = SETUP_CODE % {'config': json.dumps(config, sort_keys=True)}
if is_internal_ip(context, 'CHARTBEAT'):
html = disable_html(html, 'Chartbeat')
return html

View file

@ -66,7 +66,7 @@ class ClickyNode(Node):
custom.setdefault('session', {})['username'] = identity
html = TRACKING_CODE % {'site_id': self.site_id,
'custom': json.dumps(custom)}
'custom': json.dumps(custom, sort_keys=True)}
if is_internal_ip(context, 'CLICKY'):
html = disable_html(html, 'Clicky')
return html

View file

@ -75,7 +75,7 @@ class IntercomNode(Node):
user = get_user_from_context(context)
vars = self._get_custom_attrs(context)
vars["app_id"] = self.app_id
html = TRACKING_CODE % {"settings_json": json.dumps(vars)}
html = TRACKING_CODE % {"settings_json": json.dumps(vars, sort_keys=True)}
if is_internal_ip(context, 'INTERCOM') or not user or not user.is_authenticated():
# Intercom is disabled for non-logged in users.

View file

@ -78,13 +78,13 @@ class KissMetricsNode(Node):
try:
name, properties = context[EVENT_CONTEXT_KEY]
commands.append(EVENT_CODE % {'name': name,
'properties': json.dumps(properties)})
'properties': json.dumps(properties, sort_keys=True)})
except KeyError:
pass
try:
properties = context[PROPERTY_CONTEXT_KEY]
commands.append(PROPERTY_CODE % {
'properties': json.dumps(properties)})
'properties': json.dumps(properties, sort_keys=True)})
except KeyError:
pass
html = TRACKING_CODE % {'api_key': self.api_key,

View file

@ -56,7 +56,7 @@ class MixpanelNode(Node):
try:
name, properties = context[EVENT_CONTEXT_KEY]
commands.append(EVENT_CODE % {'name': name,
'properties': json.dumps(properties)})
'properties': json.dumps(properties, sort_keys=True)})
except KeyError:
pass
html = TRACKING_CODE % {'token': self.token,

View file

@ -64,7 +64,7 @@ class OlarkNode(Node):
extra_code.append(NICKNAME_CODE % identity)
try:
extra_code.append(STATUS_CODE %
json.dumps(context[STATUS_CONTEXT_KEY]))
json.dumps(context[STATUS_CONTEXT_KEY], sort_keys=True))
except KeyError:
pass
extra_code.extend(self._get_configuration(context))

View file

@ -65,7 +65,7 @@ class ReinvigorateNode(Node):
email = get_identity(context, 'reinvigorate', lambda u: u.email)
if email is not None:
re_vars['context'] = email
tags = " ".join("var re_%s_tag = %s;" % (tag, json.dumps(value))
tags = " ".join("var re_%s_tag = %s;" % (tag, json.dumps(value, sort_keys=True))
for tag, value in re_vars.items())
html = TRACKING_CODE % {'tracking_id': self.tracking_id,

View file

@ -62,7 +62,7 @@ class UserVoiceNode(Node):
# Enable SSO
pass
html = TRACKING_CODE % {'widget_key': widget_key,
'options': json.dumps(options)}
'options': json.dumps(options, sort_keys=True)}
return html
@ -103,7 +103,7 @@ class UserVoiceKeyLinkNode(Node):
vars = {}
if self.widget_key:
vars['widget_key'] = self.widget_key.resolve(context)
return LINK_CODE % json.dumps(vars)
return LINK_CODE % json.dumps(vars, sort_keys=True)
def contribute_to_analytical(add_node):

View file

@ -57,8 +57,8 @@ class WoopraNode(Node):
visitor = self._get_visitor(context)
html = TRACKING_CODE % {
'settings': json.dumps(settings),
'visitor': json.dumps(visitor),
'settings': json.dumps(settings, sort_keys=True),
'visitor': json.dumps(visitor, sort_keys=True),
}
if is_internal_ip(context, 'WOOPRA'):
html = disable_html(html, 'Woopra')

View file

@ -54,12 +54,8 @@ class ClickyTagTestCase(TagTestCase):
def test_custom(self):
r = ClickyNode().render(Context({'clicky_var1': 'val1',
'clicky_var2': 'val2'}))
self.assertTrue(
(re.search('var clicky_custom = {.*'
'"var1": "val1", "var2": "val2".*};', r) or
re.search('var clicky_custom = {.*'
'"var2": "val2", "var1": "val1".*};', r)), r
)
self.assertTrue(re.search('var clicky_custom = {.*'
'"var1": "val1", "var2": "val2".*};', r), r)
@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip(self):

View file

@ -34,13 +34,10 @@ class IntercomTagTestCase(TagTestCase):
date_joined=now)
}))
# Because the json isn't predictably ordered, we can't just test the whole thing verbatim.
self.assertIn("""<script id="IntercomSettingsScriptTag">
window.intercomSettings = {""", rendered_tag)
self.assertIn('"app_id": "1234567890abcdef0123456789"', rendered_tag)
self.assertIn('"full_name": "Firstname Lastname"', rendered_tag)
self.assertIn('"email": "test@example.com"', rendered_tag)
self.assertIn('"created_at": 1397074500', rendered_tag)
self.assertIn("""</script>
self.assertEquals("""
<script id="IntercomSettingsScriptTag">
window.intercomSettings = {"app_id": "1234567890abcdef0123456789", "created_at": 1397074500, "email": "test@example.com", "full_name": "Firstname Lastname"};
</script>
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://static.intercomcdn.com/intercom.v1.js';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
""", rendered_tag)
@ -57,19 +54,17 @@ class IntercomTagTestCase(TagTestCase):
r = IntercomNode().render(Context({'user': User(username='test',
first_name='Firstname', last_name='Lastname',
email="test@example.com", date_joined=now)}))
self.assertTrue("window.intercomSettings = {" in r, r)
self.assertTrue('"app_id": "1234567890abcdef0123456789"' in r)
self.assertTrue('"full_name": "Firstname Lastname"' in r)
self.assertTrue('"email": "test@example.com"' in r)
self.assertTrue('"created_at": 1397074500' in r)
self.assertTrue(
"""window.intercomSettings = {"app_id": "1234567890abcdef0123456789", "created_at": 1397074500, "email": "test@example.com", "full_name": "Firstname Lastname"};"""\
in r
)
def test_custom(self):
r = IntercomNode().render(Context({
'intercom_var1': 'val1',
'intercom_var2': 'val2'
}))
self.assertTrue('"var1": "val1"' in r)
self.assertTrue('"var2": "val2"' in r)
self.assertTrue('var1": "val1", "var2": "val2"' in r)
def test_identify_name_and_email(self):
r = IntercomNode().render(Context({
@ -78,8 +73,7 @@ class IntercomTagTestCase(TagTestCase):
last_name='Lastname',
email="test@example.com")
}))
self.assertTrue('"full_name": "Firstname Lastname"' in r)
self.assertTrue('"email": "test@example.com"' in r)
self.assertTrue('"email": "test@example.com", "full_name": "Firstname Lastname"' in r)
def test_identify_username_no_email(self):
r = IntercomNode().render(Context({'user': User(username='test')}))

View file

@ -55,19 +55,14 @@ class KissMetricsTagTestCase(TagTestCase):
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 or\
"_kmq.push(['record', 'test_event', "
'{"prop2": "val2", "prop1": "val1"}]);' in r), r)
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 or
'_kmq.push([\'set\', {"prop2": "val2", "prop1": "val1"}]);' in r),
r)
self.assertTrue("_kmq.push([\'set\', "
'{"prop1": "val1", "prop2": "val2"}]);' in r, r)
def test_alias(self):
r = KissMetricsNode().render(Context({'kiss_metrics_alias':

View file

@ -54,9 +54,8 @@ class MixpanelTagTestCase(TagTestCase):
def test_event(self):
r = MixpanelNode().render(Context({'mixpanel_event':
('test_event', {'prop1': 'val1', 'prop2': 'val2'})}))
self.assertTrue(
('mixpanel.track(\'test_event\', {"prop1": "val1", "prop2": "val2"});' in r or
'mixpanel.track(\'test_event\', {"prop2": "val2", "prop1": "val1"});' in r), r)
self.assertTrue("mixpanel.track(\'test_event\', "
'{"prop1": "val1", "prop2": "val2"});' in r, r)
@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip(self):

View file

@ -89,6 +89,5 @@ class UserVoiceTagTestCase(TagTestCase):
}
}
r = UserVoiceNode().render(Context(vars))
self.assertTrue(
('"custom_fields": {"field2": "val2", "field1": "val1"}' in r or
'"custom_fields": {"field1": "val1", "field2": "val2"}' in r ), r)
self.assertTrue('"custom_fields": {"field1": "val1", "field2": "val2"}'
in r , r)

View file

@ -37,25 +37,22 @@ class WoopraTagTestCase(TagTestCase):
@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 or
'var woo_settings = {"idle_timeout": "1234", "domain": "example.com"};' 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'}))
self.assertTrue(
('var woo_visitor = {"var1": "val1", "var2": "val2"};' in r or
'var woo_visitor = {"var2": "val2", "var1": "val1"};' in r), r)
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 = {"name": "Firstname Lastname", "email": "test@example.com"};' in r or
'var woo_visitor = {"email": "test@example.com", "name": "Firstname Lastname"};' in r), r)
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):