Skip to content

Commit e947330

Browse files
mansonatoddjordan
authored andcommitted
using ember-metrics for Google Analytics (#512)
* using ember-metrics for Google Analytics * fixing tests
1 parent 7d86269 commit e947330

File tree

7 files changed

+182
-68
lines changed

7 files changed

+182
-68
lines changed

app/router.js

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
11
import Router from '@ember/routing/router';
2-
import { on } from '@ember/object/evented';
2+
import { scheduleOnce } from '@ember/runloop';
33
import config from './config/environment';
44
import { inject as service } from '@ember/service';
55

66
const AppRouter = Router.extend({
7-
8-
analytics: service(),
9-
107
location: config.locationType,
118
rootURL: config.routerRootURL,
129

13-
sendPageViewToGA: on('didTransition', function(page, title) {
14-
if (typeof FastBoot === 'undefined') {
15-
page = page ? page : this.get('url');
16-
title = title ? title : this.get('url');
17-
this.get('analytics').trackPage(page, title);
10+
metrics: service(),
11+
fastboot: service(),
12+
13+
didTransition() {
14+
this._super(...arguments);
15+
this._trackPage();
16+
},
17+
18+
_trackPage() {
19+
if (this.get('fastboot.isFastBoot')) {
20+
return;
1821
}
19-
})
22+
23+
scheduleOnce('afterRender', this, () => {
24+
const page = this.get('url');
25+
const title = this.getWithDefault('currentRouteName', 'unknown');
26+
27+
// this is constant for this app and is only used to identify page views in the GA dashboard
28+
const hostname = 'api.emberjs.com';
29+
30+
this.get('metrics').trackPage({ page, title, hostname });
31+
});
32+
}
2033
});
2134

2235
AppRouter.map(function() {

app/services/analytics.js

Lines changed: 0 additions & 29 deletions
This file was deleted.

config/environment.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ module.exports = function(environment) {
1212
routerRootURL: '/',
1313
locationType: 'auto',
1414
API_HOST: process.env.API_HOST || 'https://ember-api-docs.global.ssl.fastly.net',
15-
gaTrackingId: 'UA-XXXXX-Y',
1615
EmberENV: {
1716
EXTEND_PROTOTYPES: false,
1817
FEATURES: {
@@ -35,7 +34,16 @@ module.exports = function(environment) {
3534
'ember-algolia': {
3635
algoliaId: ALGOLIA_APP_ID,
3736
algoliaKey: ALGOLIA_API_KEY
38-
}
37+
},
38+
metricsAdapters: [
39+
{
40+
name: 'GoogleAnalytics',
41+
environments: ['production'],
42+
config: {
43+
id: 'UA-27675533-1'
44+
}
45+
}
46+
]
3947
};
4048

4149
if (environment === 'development') {
@@ -96,7 +104,6 @@ module.exports = function(environment) {
96104
* solved for that
97105
*/
98106
ENV.routerRootURL = process.env.DOCS_SLUG ? process.env.DOCS_SLUG : '/api/';
99-
ENV.gaTrackingId = 'UA-27675533-1';
100107

101108
}
102109

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,14 @@
7777
"ember-inflector": "^2.0.1",
7878
"ember-load-initializers": "^1.0.0",
7979
"ember-maybe-import-regenerator": "^0.1.6",
80+
"ember-metrics": "^0.12.1",
8081
"ember-native-dom-helpers": "^0.5.2",
8182
"ember-normalize": "^1.0.0",
8283
"ember-percy": "^1.5.0",
8384
"ember-power-select": "^1.9.2",
8485
"ember-resolver": "^4.3.0",
8586
"ember-route-action-helper": "^2.0.5",
87+
"ember-sinon": "^2.1.0",
8688
"ember-source": "~2.18.0",
8789
"ember-styleguide": "^2.3.1",
8890
"ember-svg-jar": "^1.2.2",
Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
1-
import { run } from '@ember/runloop';
21
import { test } from 'qunit';
32
import { visit } from 'ember-native-dom-helpers';
43
import moduleForAcceptance from 'ember-api-docs/tests/helpers/module-for-acceptance';
54
import { requestIdlePromise } from 'ember-api-docs/utils/request-idle-callback';
5+
import sinon from 'sinon';
66

77
moduleForAcceptance('Acceptance | analytics page tracking');
88

99
test('checking that trackPage gets called on transitions', async function(assert) {
1010

1111
const pages = ['/ember/2.11/namespaces/Ember', '/ember/2.11/modules/ember-metal', '/ember/2.11/classes/Ember.Application'];
12-
const pagesClone = pages.slice(0);
13-
const analyticsService = this.application.__container__.lookup('service:analytics');
14-
assert.expect(pages.length);
15-
16-
// extend the method to add assertion in it
17-
let oldTrackPage = analyticsService.trackPage;
18-
analyticsService.trackPage = (page) => {
19-
run(() => {
20-
oldTrackPage.apply(analyticsService, ...arguments).then(() => assert.equal(page, pagesClone.shift()));
21-
});
22-
};
12+
13+
const applicationRouter = this.application.__container__.lookup('router:main');
14+
const metricsService = this.application.__container__.lookup('service:metrics');
15+
16+
const routerTrackPageSpy = sinon.spy(applicationRouter, "_trackPage");
17+
const serviceTrackPageSpy = sinon.spy(metricsService, "trackPage");
2318

2419
await visit(pages[0]);
2520
await visit(pages[1]);
2621
await visit(pages[2]);
2722

23+
assert.expect(5);
24+
25+
assert.ok(routerTrackPageSpy.calledThrice, `_trackPage() was not called 3 times it was called ${routerTrackPageSpy.callCount} times`);
26+
assert.ok(serviceTrackPageSpy.calledThrice, `metrics.trackPage() was not called 3 times it was called ${serviceTrackPageSpy.callCount} times`);
27+
28+
assert.ok(serviceTrackPageSpy.calledWith({ page: "/ember/2.11/namespaces/Ember", title: "project-version.namespaces.namespace.index", hostname: "api.emberjs.com" }))
29+
assert.ok(serviceTrackPageSpy.calledWith({ page: "/ember/2.11/modules/ember-metal", title: "project-version.modules.module.index", hostname: "api.emberjs.com" }))
30+
assert.ok(serviceTrackPageSpy.calledWith({ page: "/ember/2.11/classes/Ember.Application", title: "project-version.classes.class.index", hostname: "api.emberjs.com" }))
31+
2832
// make sure the test runner waits for last idle callback
2933
return requestIdlePromise(2000);
3034
});

tests/unit/controllers/project-version-test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ moduleFor('controller:project-version', 'Unit | Controller | project version', {
3333
needs: [
3434
'service:filterData',
3535
'service:metaStore',
36-
'service:analytics',
36+
'service:metrics',
37+
'service:fastboot',
3738
'service:project'
3839
]
3940
});

0 commit comments

Comments
 (0)