Skip to content

Commit f7c9e13

Browse files
authored
Merge 5e07a73 into 2ce9569
2 parents 2ce9569 + 5e07a73 commit f7c9e13

File tree

3 files changed

+99
-27
lines changed

3 files changed

+99
-27
lines changed

.changeset/cold-brooms-run.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@firebase/analytics': patch
3+
---
4+
5+
Analytics - fixed an issue where setConsent was clobbering the consentSettings before passing them to the gtag implementation.

packages/analytics/src/helpers.test.ts

Lines changed: 87 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,11 @@ describe('Gtag wrapping functions', () => {
175175
'gtag'
176176
);
177177
window['dataLayer'] = [];
178-
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', {
178+
const eventObject = {
179179
'transaction_id': 'abcd123',
180180
'send_to': 'some_group'
181-
});
181+
};
182+
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', eventObject);
182183
expect((window['dataLayer'] as DataLayer).length).to.equal(0);
183184

184185
initPromise1.resolve(fakeMeasurementId); // Resolves first initialization promise.
@@ -187,8 +188,12 @@ describe('Gtag wrapping functions', () => {
187188
initPromise2.resolve('other-measurement-id'); // Resolves second initialization promise.
188189
await Promise.all([initPromise1, initPromise2]); // Wait for resolution of Promise.all()
189190
await promiseAllSettled(fakeDynamicConfigPromises);
190-
191-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
191+
const dataLayer = window['dataLayer'] as DataLayer;
192+
expect(dataLayer.length).to.equal(1);
193+
const data = dataLayer[0];
194+
expect(data[0]).to.equal('event');
195+
expect(data[1]).to.equal('purchase');
196+
expect(data[2]).to.equal(eventObject);
192197
});
193198

194199
it(
@@ -208,10 +213,11 @@ describe('Gtag wrapping functions', () => {
208213
'gtag'
209214
);
210215
window['dataLayer'] = [];
211-
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', {
216+
const eventObject = {
212217
'transaction_id': 'abcd123',
213218
'send_to': [fakeMeasurementId, 'some_group']
214-
});
219+
};
220+
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', eventObject);
215221
expect((window['dataLayer'] as DataLayer).length).to.equal(0);
216222

217223
initPromise1.resolve(); // Resolves first initialization promise.
@@ -221,7 +227,12 @@ describe('Gtag wrapping functions', () => {
221227
await Promise.all([initPromise1, initPromise2]); // Wait for resolution of Promise.all()
222228
await promiseAllSettled(fakeDynamicConfigPromises);
223229

224-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
230+
const dataLayer = window['dataLayer'] as DataLayer;
231+
expect(dataLayer.length).to.equal(1);
232+
const data = dataLayer[0];
233+
expect(data[0]).to.equal('event');
234+
expect(data[1]).to.equal('purchase');
235+
expect(data[2]).to.equal(eventObject);
225236
}
226237
);
227238

@@ -242,9 +253,10 @@ describe('Gtag wrapping functions', () => {
242253
'gtag'
243254
);
244255
window['dataLayer'] = [];
245-
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', {
256+
const eventObject = {
246257
'transaction_id': 'abcd123'
247-
});
258+
};
259+
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', eventObject);
248260
expect((window['dataLayer'] as DataLayer).length).to.equal(0);
249261

250262
initPromise1.resolve(); // Resolves first initialization promise.
@@ -253,7 +265,12 @@ describe('Gtag wrapping functions', () => {
253265
initPromise2.resolve(); // Resolves second initialization promise.
254266
await Promise.all([initPromise1, initPromise2]); // Wait for resolution of Promise.all()
255267

256-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
268+
const dataLayer = window['dataLayer'] as DataLayer;
269+
expect(dataLayer.length).to.equal(1);
270+
const data = dataLayer[0];
271+
expect(data[0]).to.equal('event');
272+
expect(data[1]).to.equal('purchase');
273+
expect(data[2]).to.equal(eventObject);
257274
}
258275
);
259276

@@ -274,17 +291,23 @@ describe('Gtag wrapping functions', () => {
274291
'gtag'
275292
);
276293
window['dataLayer'] = [];
277-
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', {
294+
const eventObject = {
278295
'transaction_id': 'abcd123',
279296
'send_to': fakeMeasurementId
280-
});
297+
};
298+
(window['gtag'] as Gtag)(GtagCommand.EVENT, 'purchase', eventObject);
281299
expect((window['dataLayer'] as DataLayer).length).to.equal(0);
282300

283301
initPromise1.resolve(); // Resolves first initialization promise.
284302
await promiseAllSettled(fakeDynamicConfigPromises);
285303
await Promise.all([initPromise1]); // Wait for resolution of Promise.all()
286304

287-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
305+
const dataLayer = window['dataLayer'] as DataLayer;
306+
expect(dataLayer.length).to.equal(1);
307+
const data = dataLayer[0];
308+
expect(data[0]).to.equal('event');
309+
expect(data[1]).to.equal('purchase');
310+
expect(data[2]).to.equal(eventObject);
288311
}
289312
);
290313

@@ -307,8 +330,13 @@ describe('Gtag wrapping functions', () => {
307330
'gtag'
308331
);
309332
window['dataLayer'] = [];
310-
(window['gtag'] as Gtag)(GtagCommand.SET, { 'language': 'en' });
311-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
333+
const eventObject = { 'language': 'en' };
334+
(window['gtag'] as Gtag)(GtagCommand.SET, eventObject);
335+
const dataLayer = window['dataLayer'] as DataLayer;
336+
expect(dataLayer.length).to.equal(1);
337+
const data = dataLayer[0];
338+
expect(data[0]).to.equal('set');
339+
expect(data[1]).to.equal(eventObject);
312340
});
313341

314342
it('new window.gtag function does not wait when sending "consent" calls', async () => {
@@ -329,7 +357,12 @@ describe('Gtag wrapping functions', () => {
329357
'update',
330358
consentParameters
331359
);
332-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
360+
const dataLayer = window['dataLayer'] as DataLayer;
361+
expect(dataLayer.length).to.equal(1);
362+
const data = dataLayer[0];
363+
expect(data[0]).to.equal('consent');
364+
expect(data[1]).to.equal('update');
365+
expect(data[2]).to.equal(consentParameters);
333366
});
334367

335368
it('new window.gtag function does not wait when sending "get" calls', async () => {
@@ -347,7 +380,13 @@ describe('Gtag wrapping functions', () => {
347380
'client_id',
348381
clientId => console.log(clientId)
349382
);
350-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
383+
const dataLayer = window['dataLayer'] as DataLayer;
384+
expect(dataLayer.length).to.equal(1);
385+
const data = dataLayer[0];
386+
expect(data[0]).to.equal('get');
387+
expect(data[1]).to.equal(fakeMeasurementId);
388+
expect(data[2]).to.equal('client_id');
389+
expect(data[3]).to.not.be.undefined;
351390
});
352391

353392
it('new window.gtag function does not wait when sending an unknown command', async () => {
@@ -360,7 +399,11 @@ describe('Gtag wrapping functions', () => {
360399
);
361400
window['dataLayer'] = [];
362401
(window['gtag'] as Gtag)('new-command-from-gtag-team', fakeMeasurementId);
363-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
402+
const dataLayer = window['dataLayer'] as DataLayer;
403+
expect(dataLayer.length).to.equal(1);
404+
const data = dataLayer[0];
405+
expect(data[0]).to.equal('new-command-from-gtag-team');
406+
expect(data[1]).to.equal(fakeMeasurementId);
364407
});
365408

366409
it('new window.gtag function waits for initialization promise when sending "config" calls', async () => {
@@ -373,29 +416,48 @@ describe('Gtag wrapping functions', () => {
373416
'gtag'
374417
);
375418
window['dataLayer'] = [];
376-
(window['gtag'] as Gtag)(GtagCommand.CONFIG, fakeMeasurementId, {
419+
const eventObject = {
377420
'language': 'en'
378-
});
421+
};
422+
(window['gtag'] as Gtag)(
423+
GtagCommand.CONFIG,
424+
fakeMeasurementId,
425+
eventObject
426+
);
379427
expect((window['dataLayer'] as DataLayer).length).to.equal(0);
380428

381429
initPromise1.resolve(fakeMeasurementId);
382430
await promiseAllSettled(fakeDynamicConfigPromises); // Resolves dynamic config fetches.
383431
expect((window['dataLayer'] as DataLayer).length).to.equal(0);
384432

385433
await Promise.all([initPromise1]); // Wait for resolution of Promise.all()
386-
387-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
434+
const dataLayer = window['dataLayer'] as DataLayer;
435+
expect(dataLayer.length).to.equal(1);
436+
const data = dataLayer[0];
437+
expect(data[0]).to.equal('config');
438+
expect(data[1]).to.equal(fakeMeasurementId);
439+
expect(data[2]).to.equal(eventObject);
388440
});
389441

390442
it('new window.gtag function does not wait when sending "config" calls if there are no pending initialization promises', async () => {
391443
wrapOrCreateGtag({}, fakeDynamicConfigPromises, {}, 'dataLayer', 'gtag');
392444
window['dataLayer'] = [];
393-
(window['gtag'] as Gtag)(GtagCommand.CONFIG, fakeMeasurementId, {
445+
const eventObject = {
394446
'transaction_id': 'abcd123'
395-
});
447+
};
448+
(window['gtag'] as Gtag)(
449+
GtagCommand.CONFIG,
450+
fakeMeasurementId,
451+
eventObject
452+
);
396453
await promiseAllSettled(fakeDynamicConfigPromises);
397454
await Promise.resolve(); // Config call is always chained onto initialization promise list, even if empty.
398-
expect((window['dataLayer'] as DataLayer).length).to.equal(1);
455+
const dataLayer = window['dataLayer'] as DataLayer;
456+
expect(dataLayer.length).to.equal(1);
457+
const data = dataLayer[0];
458+
expect(data[0]).to.equal('config');
459+
expect(data[1]).to.equal(fakeMeasurementId);
460+
expect(data[2]).to.equal(eventObject);
399461
});
400462
});
401463

packages/analytics/src/helpers.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,13 @@ function wrapGtag(
304304
gtagParams as GtagConfigOrEventParams
305305
);
306306
} else if (command === GtagCommand.CONSENT) {
307-
const [gtagParams] = args;
308-
gtagCore(GtagCommand.CONSENT, 'update', gtagParams as ConsentSettings);
307+
const [consentAction, gtagParams] = args;
308+
// consentAction can be one of 'default' or 'update'.
309+
gtagCore(
310+
GtagCommand.CONSENT,
311+
consentAction,
312+
gtagParams as ConsentSettings
313+
);
309314
} else if (command === GtagCommand.GET) {
310315
const [measurementId, fieldName, callback] = args;
311316
gtagCore(

0 commit comments

Comments
 (0)