diff --git a/test/spec/services/analyticsServicesSpec.js b/test/spec/services/analyticsServicesSpec.js index 935ace5900..0a03c3b638 100644 --- a/test/spec/services/analyticsServicesSpec.js +++ b/test/spec/services/analyticsServicesSpec.js @@ -1,9 +1,11 @@ 'use strict'; describe('Analytics Service', function () { - var analytics, user; + var analytics, user, clock; beforeEach(function() { + clock = sandbox.useFakeTimers(); + sandbox.stub(window, 'refresher', function(){return true}); user = specHelper.newUser(); user.contributor = {}; user.purchased = { plan: {} }; @@ -26,14 +28,16 @@ describe('Analytics Service', function () { sandbox.stub(window, 'ga'); }); - it('sets up user with Amplitude', function() { + it.only('sets up user with Amplitude', function() { analytics.register(); + clock.tick(); expect(amplitude.setUserId).to.have.been.calledOnce; expect(amplitude.setUserId).to.have.been.calledWith(user._id); }); it('sets up user with Google Analytics', function() { analytics.register(); + clock.tick(); expect(ga).to.have.been.calledOnce; expect(ga).to.have.been.calledWith('set', {userId: user._id}); }); @@ -48,6 +52,7 @@ describe('Analytics Service', function () { it('sets up tracking for amplitude', function() { analytics.login(); + clock.tick(); expect(amplitude.setUserId).to.have.been.calledOnce; expect(amplitude.setUserId).to.have.been.calledWith(user._id); @@ -55,6 +60,7 @@ describe('Analytics Service', function () { it('sets up tracking for google analytics', function() { analytics.login(); + clock.tick(); expect(ga).to.have.been.calledOnce; expect(ga).to.have.been.calledWith('set', {userId: user._id}); @@ -73,6 +79,7 @@ describe('Analytics Service', function () { it('tracks a simple user action with Amplitude', function() { var properties = {'hitType':'event','eventCategory':'behavior','eventAction':'cron'}; analytics.track(properties); + clock.tick(); expect(amplitude.logEvent).to.have.been.calledOnce; expect(amplitude.logEvent).to.have.been.calledWith('cron', properties); @@ -81,6 +88,7 @@ describe('Analytics Service', function () { it('tracks a simple user action with Google Analytics', function() { var properties = {'hitType':'event','eventCategory':'behavior','eventAction':'cron'}; analytics.track(properties); + clock.tick(); expect(ga).to.have.been.calledOnce; expect(ga).to.have.been.calledWith('send', properties); @@ -89,6 +97,7 @@ describe('Analytics Service', function () { it('tracks a user action with additional properties in Amplitude', function() { var properties = {'hitType':'event','eventCategory':'behavior','eventAction':'cron','booleanProperty':true,'numericProperty':17,'stringProperty':'bagel'}; analytics.track(properties); + clock.tick(); expect(amplitude.logEvent).to.have.been.calledOnce; expect(amplitude.logEvent).to.have.been.calledWith('cron', properties); @@ -97,6 +106,7 @@ describe('Analytics Service', function () { it('tracks a user action with additional properties in google analytics', function() { var properties = {'hitType':'event','eventCategory':'behavior','eventAction':'cron','booleanProperty':true,'numericProperty':17,'stringProperty':'bagel'}; analytics.track(properties); + clock.tick(); expect(ga).to.have.been.calledOnce; expect(ga).to.have.been.calledWith('send', properties); @@ -118,6 +128,7 @@ describe('Analytics Service', function () { analytics.track({'hitType':'pageview'}); analytics.track({'eventCategory':'green'}); analytics.track({'eventAction':'eat'}); + clock.tick(); }); it('logs errors to console', function() { @@ -136,6 +147,7 @@ describe('Analytics Service', function () { context('incorrect hit type', function() { beforeEach(function() { analytics.track({'hitType':'moogly','eventCategory':'green','eventAction':'eat'}); + clock.tick(); }); it('logs error to console', function () { @@ -181,6 +193,7 @@ describe('Analytics Service', function () { user.stats.mp = 41; analytics.updateUser(properties); + clock.tick(); }); it('calls Amplitude with provided properties and select user info', function() { @@ -219,6 +232,7 @@ describe('Analytics Service', function () { user.purchased.plan.planId = 'unique-plan-id'; analytics.updateUser(); + clock.tick(); }); it('calls Amplitude with select user info', function() { diff --git a/website/public/js/services/analyticsServices.js b/website/public/js/services/analyticsServices.js index 462397954c..53f7c42186 100644 --- a/website/public/js/services/analyticsServices.js +++ b/website/public/js/services/analyticsServices.js @@ -33,47 +33,57 @@ ga('create', window.env.GA_ID, 'auto'); function loadScripts() { - // Amplitude - var n = document.createElement("script"); - var s = document.getElementsByTagName("script")[0]; - n.type = "text/javascript"; - n.async = true; - n.src = "https://d24n15hnbwhuhn.cloudfront.net/libs/amplitude-2.2.0-min.gz.js"; - s.parentNode.insertBefore(n, s); + setTimeout(function() { + // Amplitude + var n = document.createElement("script"); + var s = document.getElementsByTagName("script")[0]; + n.type = "text/javascript"; + n.async = true; + n.src = "https://d24n15hnbwhuhn.cloudfront.net/libs/amplitude-2.2.0-min.gz.js"; + s.parentNode.insertBefore(n, s); - // Google Analytics - var a = document.createElement('script'); - var m = document.getElementsByTagName('script')[0]; - a.async = 1; - a.src = '//www.google-analytics.com/analytics.js'; - m.parentNode.insertBefore(a, m); + // Google Analytics + var a = document.createElement('script'); + var m = document.getElementsByTagName('script')[0]; + a.async = 1; + a.src = '//www.google-analytics.com/analytics.js'; + m.parentNode.insertBefore(a, m); + }); } function register() { - amplitude.setUserId(user._id); - ga('set', {'userId':user._id}); + setTimeout(function() { + amplitude.setUserId(user._id); + ga('set', {'userId':user._id}); + }); } function login() { - amplitude.setUserId(user._id); - ga('set', {'userId':user._id}); + setTimeout(function() { + amplitude.setUserId(user._id); + ga('set', {'userId':user._id}); + }); } function track(properties) { - if(_doesNotHaveRequiredFields(properties)) { return false; } - if(_doesNotHaveAllowedHitType(properties)) { return false; } + setTimeout(function() { + if(_doesNotHaveRequiredFields(properties)) { return false; } + if(_doesNotHaveAllowedHitType(properties)) { return false; } - amplitude.logEvent(properties.eventAction,properties); - ga('send',properties); + amplitude.logEvent(properties.eventAction,properties); + ga('send',properties); + }); } function updateUser(properties) { - properties = properties || {}; + setTimeout(function() { + properties = properties || {}; - _gatherUserStats(user, properties); + _gatherUserStats(user, properties); - amplitude.setUserProperties(properties); - ga('set',properties); + amplitude.setUserProperties(properties); + ga('set',properties); + }); } if (window.env.NODE_ENV === 'production') loadScripts(); @@ -115,4 +125,3 @@ } } }()); -