Skip to content

Commit 70c6eac

Browse files
committed
[CST-6753] Change google-analytics.service in order to use GoogleTagManager instead of GoogleAnalytics
1 parent 6d361be commit 70c6eac

3 files changed

Lines changed: 27 additions & 21 deletions

File tree

src/app/statistics/google-analytics.service.spec.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import { GoogleAnalyticsService } from './google-analytics.service';
2-
import { Angulartics2GoogleAnalytics } from 'angulartics2';
2+
import { Angulartics2GoogleTagManager } from 'angulartics2';
33
import { ConfigurationDataService } from '../core/data/configuration-data.service';
4-
import {
5-
createFailedRemoteDataObject$,
6-
createSuccessfulRemoteDataObject$
7-
} from '../shared/remote-data.utils';
4+
import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
85
import { ConfigurationProperty } from '../core/shared/configuration-property.model';
96

107
describe('GoogleAnalyticsService', () => {
118
const trackingIdProp = 'google.analytics.key';
129
const trackingIdTestValue = 'mock-tracking-id';
1310
const innerHTMLTestValue = 'mock-script-inner-html';
11+
const srcTestValue = 'mock-script-src';
1412
let service: GoogleAnalyticsService;
15-
let angularticsSpy: Angulartics2GoogleAnalytics;
13+
let angularticsSpy: Angulartics2GoogleTagManager;
1614
let configSpy: ConfigurationDataService;
1715
let scriptElementMock: any;
16+
let srcSpy: any;
1817
let innerHTMLSpy: any;
1918
let bodyElementSpy: HTMLBodyElement;
2019
let documentSpy: Document;
@@ -28,18 +27,21 @@ describe('GoogleAnalyticsService', () => {
2827
});
2928

3029
beforeEach(() => {
31-
angularticsSpy = jasmine.createSpyObj('angulartics2GoogleAnalytics', [
30+
angularticsSpy = jasmine.createSpyObj('Angulartics2GoogleTagManager', [
3231
'startTracking',
3332
]);
3433

3534
configSpy = createConfigSuccessSpy(trackingIdTestValue);
3635

3736
scriptElementMock = {
37+
set src(newVal) { /* noop */ },
38+
get src() { return innerHTMLTestValue; },
3839
set innerHTML(newVal) { /* noop */ },
39-
get innerHTML() { return innerHTMLTestValue; }
40+
get innerHTML() { return srcTestValue; }
4041
};
4142

4243
innerHTMLSpy = spyOnProperty(scriptElementMock, 'innerHTML', 'set');
44+
srcSpy = spyOnProperty(scriptElementMock, 'src', 'set');
4345

4446
bodyElementSpy = jasmine.createSpyObj('body', {
4547
appendChild: scriptElementMock,
@@ -106,19 +108,22 @@ describe('GoogleAnalyticsService', () => {
106108
describe('when the tracking id is non-empty', () => {
107109
it('should create a script tag whose innerHTML contains the tracking id', () => {
108110
service.addTrackingIdToPage();
109-
expect(documentSpy.createElement).toHaveBeenCalledTimes(1);
111+
expect(documentSpy.createElement).toHaveBeenCalledTimes(2);
110112
expect(documentSpy.createElement).toHaveBeenCalledWith('script');
111113

112114
// sanity check
113115
expect(documentSpy.createElement('script')).toBe(scriptElementMock);
114116

117+
expect(srcSpy).toHaveBeenCalledTimes(1);
118+
expect(srcSpy.calls.argsFor(0)[0]).toContain(trackingIdTestValue);
119+
115120
expect(innerHTMLSpy).toHaveBeenCalledTimes(1);
116121
expect(innerHTMLSpy.calls.argsFor(0)[0]).toContain(trackingIdTestValue);
117122
});
118123

119124
it('should add a script to the body', () => {
120125
service.addTrackingIdToPage();
121-
expect(bodyElementSpy.appendChild).toHaveBeenCalledTimes(1);
126+
expect(bodyElementSpy.appendChild).toHaveBeenCalledTimes(2);
122127
});
123128

124129
it('should start tracking', () => {

src/app/statistics/google-analytics.service.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Inject, Injectable } from '@angular/core';
2-
import { Angulartics2GoogleAnalytics } from 'angulartics2';
2+
import { Angulartics2GoogleTagManager } from 'angulartics2';
33
import { ConfigurationDataService } from '../core/data/configuration-data.service';
44
import { getFirstCompletedRemoteData } from '../core/shared/operators';
55
import { isEmpty } from '../shared/empty.util';
@@ -13,7 +13,8 @@ import { DOCUMENT } from '@angular/common';
1313
export class GoogleAnalyticsService {
1414

1515
constructor(
16-
private angulartics: Angulartics2GoogleAnalytics,
16+
// private angulartics: Angulartics2GoogleAnalytics,
17+
private angulartics: Angulartics2GoogleTagManager,
1718
private configService: ConfigurationDataService,
1819
@Inject(DOCUMENT) private document: any,
1920
) { }
@@ -36,15 +37,16 @@ export class GoogleAnalyticsService {
3637
// make sure we received a tracking id
3738
if (isEmpty(trackingId)) { return; }
3839

39-
// add trackingId snippet to page
40+
// add GTag snippet to page
4041
const keyScript = this.document.createElement('script');
41-
keyScript.innerHTML = `(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
42-
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
43-
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
44-
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
45-
ga('create', '${trackingId}', 'auto');`;
42+
keyScript.src = `https://www.googletagmanager.com/gtag/js?id=${trackingId}`;
4643
this.document.body.appendChild(keyScript);
4744

45+
const libScript = this.document.createElement('script');
46+
libScript.innerHTML = `window.dataLayer = window.dataLayer || [];function gtag(){window.dataLayer.push(arguments);}
47+
gtag('js', new Date());gtag('config', '${trackingId}');`;
48+
this.document.body.appendChild(libScript);
49+
4850
// start tracking
4951
this.angulartics.startTracking();
5052
});

src/modules/app/server-app.module.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import { ServerModule, ServerTransferStateModule } from '@angular/platform-serve
66

77
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
88

9-
import { Angulartics2 } from 'angulartics2';
10-
import { Angulartics2GoogleAnalytics } from 'angulartics2';
9+
import { Angulartics2, Angulartics2GoogleTagManager } from 'angulartics2';
1110

1211
import { AppComponent } from '../../app/app.component';
1312

@@ -60,7 +59,7 @@ export function createTranslateLoader(transferState: TransferState) {
6059
useClass: Angulartics2Mock
6160
},
6261
{
63-
provide: Angulartics2GoogleAnalytics,
62+
provide: Angulartics2GoogleTagManager,
6463
useClass: AngularticsProviderMock
6564
},
6665
{

0 commit comments

Comments
 (0)