-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtemplate.tpl
674 lines (630 loc) · 57.7 KB
/
template.tpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
___INFO___
{
"type": "TAG",
"id": "cvt_temp_public_id",
"version": 1,
"securityGroups": [],
"displayName": "Trovaprezzi Trusted Program",
"categories": [
"CONVERSIONS"
],
"brand": {
"id": "github.com_7pixel",
"displayName": "7pixel",
"thumbnail": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACAKADAAQAAAABAAACAAAAAAAZJZubAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAABAAElEQVR4Ae29B5Ckx5Xn94Dx3nvX4w3GwXtvCBCEofduucs97u0qdnUKnVxcSKGQiZDuTjppdRJ3eculdyAJgiBAEgDhvRvMAONnerz33kLvX9k1U9PTPVPdXVXfl1/+MqKma6qrvi/z97IrX7585pIPvRkNAhCAAAQgAIGkCFya1GgZLAQgAAEIQAACJQIoAEwECEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwBCEAAAhCAQIIEUAASFDpDhgAEIAABCKAAMAcgAAEIQAACCRJAAUhQ6AwZAhCAAAQggALAHIAABCAAAQgkSAAFIEGhM2QIQAACEIAACgBzAAIQgAAEIJAgARSABIXOkCEAAQhAAAIoAMwB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\u003d\u003d"
},
"description": "",
"containerContexts": [
"WEB"
]
}
___TEMPLATE_PARAMETERS___
[
{
"type": "TEXT",
"name": "merchantKey",
"displayName": "Chiave Merchant",
"simpleValueType": true,
"help": "Inserire qui la chiave merchant che ti è stata fornita dal referente commerciale Drezzy"
},
{
"type": "TEXT",
"name": "customerEmail",
"displayName": "Mail del cliente che ha effettuato l\u0027ordine",
"simpleValueType": true,
"help": "Valorizzare con una variabile che contiene l\u0027email del cliente che ha effettuato l\u0027ordine"
},
{
"type": "SELECT",
"name": "consentMode",
"displayName": "Consent mode",
"macrosInSelect": false,
"selectItems": [
{
"value": "unavailable",
"displayValue": "unavailable"
},
{
"value": "available",
"displayValue": "available"
}
],
"simpleValueType": true,
"help": "choose here if the consent mode is available on your website"
},
{
"type": "GROUP",
"name": "cartAmountOptions",
"displayName": "Opzioni Totale Carrello",
"groupStyle": "NO_ZIPPY",
"subParams": [
{
"type": "CHECKBOX",
"name": "valueIncludesTax",
"checkboxText": "Il valore dell\u0027ordine include le tasse",
"simpleValueType": true,
"help": "Il campo del dataLayer contenente il totale del carrello, value per GA4 o revenue per UA, include il valore del campo tax",
"defaultValue": true
},
{
"type": "CHECKBOX",
"name": "valueIncludesShipping",
"checkboxText": "Il valore dell\u0027ordine include le spese di spedizione",
"simpleValueType": true,
"help": "Il campo del dataLayer contenente il totale del carrello, value per GA4 o revenue per UA, include il valore del campo shipping",
"defaultValue": true
}
]
}
]
___SANDBOXED_JS_FOR_WEB_TEMPLATE___
const copyFromDataLayer = require('copyFromDataLayer');
const encodeUriComponent = require('encodeUriComponent');
const logToConsole = require('logToConsole');
const injectScript = require('injectScript');
const callInWindow = require('callInWindow');
const makeNumber = require('makeNumber');
const isConsentGranted = require('isConsentGranted');
const makeInteger = require('makeInteger');
injectScript('https://tps.trovaprezzi.it/javascripts/tracking-vanilla.min.js',data.gtmOnFailure);
const ecommerce = copyFromDataLayer('ecommerce');
if (!ecommerce) {
logTP('ecommerce not detected in the dataLayer');
return;
}
if (!data.hasOwnProperty('merchantKey')) {
logTP('merchant key field not defined');
data.gtmOnFailure();
return;
}
if (!data.hasOwnProperty('customerEmail')) {
logTP('customer email field not defined');
data.gtmOnFailure();
return;
}
if (data.customerEmail === undefined) {
logTP('customer email variable malformed or undefined');
data.gtmOnFailure();
return;
}
let tax, shipping, drtp_oid, drtp_oa, drtp_line_items;
if (ecommerce.transaction_id) {
// GA4
drtp_oid = ecommerce.transaction_id;
drtp_oa = makeNumber(ecommerce.value);
tax = makeNumber(ecommerce.tax);
shipping = makeNumber(ecommerce.shipping);
drtp_line_items = [];
ecommerce.items.forEach((item) =>
drtp_line_items.push({ sku: item.item_id, name: item.item_name })
);
} else if (ecommerce.purchase) {
// UA
const purchase = ecommerce.purchase;
drtp_oid = purchase.actionField.id;
drtp_oa = makeNumber(purchase.actionField.revenue);
tax = makeNumber(purchase.actionField.tax);
shipping = makeNumber(purchase.actionField.shipping);
drtp_line_items = [];
purchase.products.forEach((product) =>
drtp_line_items.push({ sku: product.id, name: product.name })
);
} else {
logTP('purchase measurement not defined');
data.gtmOnFailure();
return;
}
// Compute order amount
if (!data.valueIncludesTax) {
drtp_oa = drtp_oa + tax;
}
if (data.valueIncludesShipping) {
drtp_oa = drtp_oa - shipping;
}
const drtp_mk = data.merchantKey.trim();
const drpt_ue = data.customerEmail.trim();
injectScript(
'https://tps.trovaprezzi.it/javascripts/tracking-vanilla.min.js',
tpScript, // the main code is called only after the library has been loaded
data.gtmOnFailure
);
function tpScript() {
callInWindow('_tpt.push', { event: 'setAccount', id: drtp_mk });
callInWindow('_tpt.push', { event: 'setOrderId', order_id: drtp_oid });
if (isConsentGranted('ad_storage') && isConsentGranted('ad_personalization') && isConsentGranted('ad_user_data') || data.consentMode == 'unavailable') {
callInWindow('_tpt.push', { event: 'setEmail', email: drpt_ue });
drtp_line_items.forEach((product) =>
callInWindow('_tpt.push', { event: 'addItem', sku: product.sku, product_name: product.name })
);
}
callInWindow('_tpt.push', { event: 'setAmount', amount: drtp_oa });
callInWindow('_tpt.push', { event: 'orderSubmit'});
data.gtmOnSuccess();
}
function logTP(msg) {
logToConsole('Trusted Program: ' + msg);
}
___WEB_PERMISSIONS___
[
{
"instance": {
"key": {
"publicId": "read_data_layer",
"versionId": "1"
},
"param": [
{
"key": "allowedKeys",
"value": {
"type": 1,
"string": "specific"
}
},
{
"key": "keyPatterns",
"value": {
"type": 2,
"listItem": [
{
"type": 1,
"string": "ecommerce.*"
}
]
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "logging",
"versionId": "1"
},
"param": [
{
"key": "environments",
"value": {
"type": 1,
"string": "all"
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "access_globals",
"versionId": "1"
},
"param": [
{
"key": "keys",
"value": {
"type": 2,
"listItem": [
{
"type": 3,
"mapKey": [
{
"type": 1,
"string": "key"
},
{
"type": 1,
"string": "read"
},
{
"type": 1,
"string": "write"
},
{
"type": 1,
"string": "execute"
}
],
"mapValue": [
{
"type": 1,
"string": "_tpt.push"
},
{
"type": 8,
"boolean": false
},
{
"type": 8,
"boolean": false
},
{
"type": 8,
"boolean": true
}
]
}
]
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "inject_script",
"versionId": "1"
},
"param": [
{
"key": "urls",
"value": {
"type": 2,
"listItem": [
{
"type": 1,
"string": "https://tps.trovaprezzi.it/javascripts/tracking-vanilla.min.js"
}
]
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "access_consent",
"versionId": "1"
},
"param": [
{
"key": "consentTypes",
"value": {
"type": 2,
"listItem": [
{
"type": 3,
"mapKey": [
{
"type": 1,
"string": "consentType"
},
{
"type": 1,
"string": "read"
},
{
"type": 1,
"string": "write"
}
],
"mapValue": [
{
"type": 1,
"string": "ad_storage"
},
{
"type": 8,
"boolean": true
},
{
"type": 8,
"boolean": false
}
]
},
{
"type": 3,
"mapKey": [
{
"type": 1,
"string": "consentType"
},
{
"type": 1,
"string": "read"
},
{
"type": 1,
"string": "write"
}
],
"mapValue": [
{
"type": 1,
"string": "ad_personalization"
},
{
"type": 8,
"boolean": true
},
{
"type": 8,
"boolean": false
}
]
},
{
"type": 3,
"mapKey": [
{
"type": 1,
"string": "consentType"
},
{
"type": 1,
"string": "read"
},
{
"type": 1,
"string": "write"
}
],
"mapValue": [
{
"type": 1,
"string": "ad_user_data"
},
{
"type": 8,
"boolean": true
},
{
"type": 8,
"boolean": false
}
]
}
]
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
}
]
___TESTS___
scenarios:
- name: setAccount called with configured merchant key
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n items: [],\n\
\ };\n }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow', (method,\
\ command) => {\n if (command.event === 'setAccount') {\n targetCommandCalled\
\ = true;\n assertThat(command.id).isEqualTo('merchantkey123');\n } \n});\n\
\nconst mockData = {\n merchantKey: 'merchantkey123',\n customerEmail: 'user@example.com',\n\
\ valueIncludesTax: true,\n valueIncludesShipping: true,\n};\n\nrunCode(mockData);\n\
\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: setEmail called with configured email
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n items: [],\n\
\ };\n }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow', (method,\
\ command) => {\n if (command.event === 'setEmail') {\n targetCommandCalled\
\ = true;\n assertThat(command.email).isEqualTo('user@example.com');\n } \n\
});\n\nconst mockData = {\n merchantKey: 'merchantkey123',\n customerEmail:\
\ 'user@example.com',\n valueIncludesTax: true,\n valueIncludesShipping: true,\n\
};\n\nrunCode(mockData);\n\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA3] setOrderId called with right order_id'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n purchase: {\n actionField: {\n id: 'order1234',\n \
\ revenue: 100.0,\n },\n products: [],\n }\n };\n\
\ }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow', (method, command)\
\ => {\n if (command.event === 'setOrderId') {\n targetCommandCalled = true;\n\
\ assertThat(command.id === 'order1234');\n } \n});\n\nconst mockData = {\n\
\ merchantKey: 'merchantkey123',\n customerEmail: 'user@example.com',\n valueIncludesTax:\
\ true,\n valueIncludesShipping: true,\n};\n\nrunCode(mockData);\n\nassertApi('gtmOnSuccess').wasCalled();\n\
assertThat(targetCommandCalled).isTrue();"
- name: '[GA3] setAmount called with right amount'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n purchase: {\n actionField: {\n id: 'order1234',\n \
\ revenue: 100.0,\n },\n products: [],\n }\n };\n\
\ }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow', (method, command)\
\ => {\n if (command.event === 'setAmount') {\n targetCommandCalled = true;\n\
\ assertThat(command.amount).isEqualTo(100.0);\n } \n});\n\nconst mockData\
\ = {\n merchantKey: 'merchantkey123',\n customerEmail: 'user@example.com',\n\
\ valueIncludesTax: true,\n valueIncludesShipping: false,\n};\n\nrunCode(mockData);\n\
\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA3] addItem called with right sku and product_name'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n purchase: {\n actionField: {\n id: 'order1234',\n \
\ revenue: 100.0,\n },\n products: [\n {\n \
\ name: 'product name',\n id: 'sku123',\n },\n \
\ ],\n }\n };\n }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow',\
\ (method, command) => {\n if (command.event === 'addItem') {\n targetCommandCalled\
\ = true;\n assertThat(command.sku).isEqualTo('sku123');\n assertThat(command.product_name).isEqualTo('product\
\ name');\n } \n});\n\nconst mockData = {\n merchantKey: 'merchantkey123',\n\
\ customerEmail: 'user@example.com',\n valueIncludesTax: true,\n valueIncludesShipping:\
\ true,\n};\n\nrunCode(mockData);\n\nassertApi('gtmOnSuccess').wasCalled();\n\
assertThat(targetCommandCalled).isTrue();"
- name: '[GA4] setOrderId called with right order_id'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n items: [],\n\
\ };\n }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow', (method,\
\ command) => {\n if (command.event === 'setOrderId') {\n targetCommandCalled\
\ = true;\n assertThat(command.order_id).isEqualTo('order1234');\n } \n});\n\
\nconst mockData = {\n merchantKey: 'merchantkey123',\n customerEmail: 'user@example.com',\n\
\ valueIncludesTax: true,\n valueIncludesShipping: true,\n};\n\nrunCode(mockData);\n\
\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA4] setAmount called with right amount'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n items: [],\n\
\ };\n }\n});\n\nlet targetCommandCalled = false;\nmock('callInWindow', (method,\
\ command) => {\n if (command.event === 'setAmount') {\n targetCommandCalled\
\ = true;\n assertThat(command.amount).isEqualTo(100.0);\n } \n});\n\nconst\
\ mockData = {\n merchantKey: 'merchantkey123',\n customerEmail: 'user@example.com',\n\
\ valueIncludesTax: true,\n valueIncludesShipping: false,\n};\n\nrunCode(mockData);\n\
\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA4] setAmount called with right amount (tax excluded)'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n shipping:\
\ 10,\n tax: 5,\n items: [],\n };\n }\n});\n\nlet targetCommandCalled\
\ = false;\nmock('callInWindow', (method, command) => {\n if (command.event ===\
\ 'setAmount') {\n targetCommandCalled = true;\n assertThat(command.amount).isEqualTo(105.0);\n\
\ } \n});\n\nconst mockData = {\n merchantKey: 'merchantkey123',\n customerEmail:\
\ 'user@example.com',\n valueIncludesTax: false,\n valueIncludesShipping: false,\n\
};\n\nrunCode(mockData);\n\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA4] setAmount called with right amount (shipping included)'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n shipping:\
\ 10,\n tax: 5,\n items: [],\n };\n }\n});\n\nlet targetCommandCalled\
\ = false;\nmock('callInWindow', (method, command) => {\n if (command.event ===\
\ 'setAmount') {\n targetCommandCalled = true;\n assertThat(command.amount).isEqualTo(90.0);\n\
\ } \n});\n\nconst mockData = {\n merchantKey: 'merchantkey123',\n customerEmail:\
\ 'user@example.com',\n valueIncludesTax: true,\n valueIncludesShipping: true,\n\
};\n\nrunCode(mockData);\n\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA4] setAmount called with right amount (values are text)'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.5,\n shipping:\
\ 10,\n tax: '5',\n items: [],\n };\n }\n});\n\nlet targetCommandCalled\
\ = false;\nmock('callInWindow', (method, command) => {\n if (command.event ===\
\ 'setAmount') {\n targetCommandCalled = true;\n assertThat(command.amount).isEqualTo(105.5);\n\
\ } \n});\n\nconst mockData = {\n merchantKey: 'merchantkey123',\n customerEmail:\
\ 'user@example.com',\n valueIncludesTax: false,\n valueIncludesShipping: false,\n\
};\n\nrunCode(mockData);\n\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: '[GA4] addItem called with right sku and product_name'
code: "mock('copyFromDataLayer', (key) => {\n if (key === 'ecommerce') {\n return\
\ {\n transaction_id: 'order1234',\n value: 100.0,\n items: [\n\
\ {\n item_name: 'product name',\n item_id: 'sku123',\n\
\ },\n ],\n };\n }\n});\n\nlet targetCommandCalled = false;\n\
mock('callInWindow', (method, command) => {\n if (command.event === 'addItem')\
\ {\n targetCommandCalled = true;\n assertThat(command.sku).isEqualTo('sku123');\n\
\ assertThat(command.product_name).isEqualTo('product name');\n } \n});\n\n\
const mockData = {\n merchantKey: 'merchantkey123',\n customerEmail: 'user@example.com',\n\
\ valueIncludesTax: true,\n valueIncludesShipping: true,\n};\n\nrunCode(mockData);\n\
\nassertApi('gtmOnSuccess').wasCalled();\nassertThat(targetCommandCalled).isTrue();"
- name: Fail if merchant key field not defined
code: |
mock('copyFromDataLayer', (key) => {
if (key === 'ecommerce') {
return {
actionField: {
id: 'order1234',
revenue: 100.0,
},
products: [
{
name: 'product name',
id: 'sku123',
},
],
};
}
});
// merchant key object property missing if not defined in ui
const mockData = {
customerEmail: 'user@example.com',
};
runCode(mockData);
assertApi('logToConsole').wasCalledWith("Trusted Program: merchant key field not defined");
assertApi('gtmOnFailure').wasCalled();
- name: Fail if customer email field not defined
code: |
mock('copyFromDataLayer', (key) => {
if (key === 'ecommerce') {
return {
transaction_id: 'order1234',
value: 100.0,
items: [],
};
}
});
// customer email object property missing if not defined in ui
const mockData = {
merchantKey: 'merchantkey123',
};
runCode(mockData);
assertApi('logToConsole').wasCalledWith("Trusted Program: customer email field not defined");
assertApi('gtmOnFailure').wasCalled();
- name: Fail if customer email set but undefined
code: |
mock('copyFromDataLayer', (key) => {
if (key === 'ecommerce') {
return {
transaction_id: 'order1234',
value: 100.0,
items: [],
};
}
});
// customer email object property missing if not defined in ui
const mockData = {
merchantKey: 'merchantkey123',
customerEmail: undefined,
};
runCode(mockData);
assertApi('logToConsole').wasCalledWith("Trusted Program: customer email variable malformed or undefined");
assertApi('gtmOnFailure').wasCalled();
- name: Fail if enhanced ecommerce undefined
code: |
mock('copyFromDataLayer', (key) => {
if (key === 'ecommerce') {
return undefined;
}
});
const mockData = {
merchantKey: 'merchantkey123',
customerEmail: 'user@example.com',
};
runCode(mockData);
assertApi('logToConsole').wasCalledWith("Trusted Program: ecommerce not detected in the dataLayer");
assertApi('gtmOnFailure').wasCalled();
- name: Fail if enhanced ecommerce empty
code: |
mock('copyFromDataLayer', (key) => {
if (key === 'ecommerce') {
return {};
}
});
const mockData = {
merchantKey: 'merchantkey123',
customerEmail: 'user@example.com',
};
runCode(mockData);
assertApi('logToConsole').wasCalledWith("Trusted Program: purchase measurement not defined");
assertApi('gtmOnFailure').wasCalled();
setup: |-
// In the tests we assume that the trusted library injection always succeed
mock('injectScript', (url, onSuccess, onFailure) => {
onSuccess();
});
___NOTES___
Created on 8/12/2022, 10:23:03 AM