prebid.js 7.24.0 → 7.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adgenerationBidAdapter.js +1 -1
  5. package/dist/admaticBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/adxcgBidAdapter.js +1 -1
  9. package/dist/ajaBidAdapter.js +1 -1
  10. package/dist/amxBidAdapter.js +1 -1
  11. package/dist/amxIdSystem.js +1 -1
  12. package/dist/appierAnalyticsAdapter.js +1 -1
  13. package/dist/appnexusBidAdapter.js +1 -1
  14. package/dist/asoBidAdapter.js +1 -1
  15. package/dist/axonixBidAdapter.js +1 -1
  16. package/dist/beopBidAdapter.js +1 -1
  17. package/dist/bidglassBidAdapter.js +1 -1
  18. package/dist/big-richmediaBidAdapter.js +1 -1
  19. package/dist/bridgewellBidAdapter.js +1 -1
  20. package/dist/brightMountainMediaBidAdapter.js +1 -1
  21. package/dist/captifyRtdProvider.js +1 -0
  22. package/dist/carodaBidAdapter.js +1 -1
  23. package/dist/chtnwBidAdapter.js +1 -1
  24. package/dist/concertBidAdapter.js +1 -1
  25. package/dist/connectadBidAdapter.js +1 -1
  26. package/dist/consumableBidAdapter.js +1 -1
  27. package/dist/conversantBidAdapter.js +1 -1
  28. package/dist/craftBidAdapter.js +1 -1
  29. package/dist/criteoBidAdapter.js +1 -1
  30. package/dist/discoveryBidAdapter.js +1 -1
  31. package/dist/dspxBidAdapter.js +1 -1
  32. package/dist/eplanningBidAdapter.js +1 -1
  33. package/dist/finativeBidAdapter.js +1 -1
  34. package/dist/glimpseBidAdapter.js +1 -1
  35. package/dist/gmosspBidAdapter.js +1 -1
  36. package/dist/goldbachBidAdapter.js +1 -1
  37. package/dist/gridBidAdapter.js +1 -1
  38. package/dist/gridNMBidAdapter.js +1 -1
  39. package/dist/gumgumBidAdapter.js +1 -1
  40. package/dist/h12mediaBidAdapter.js +1 -1
  41. package/dist/id5IdSystem.js +1 -1
  42. package/dist/improvedigitalBidAdapter.js +1 -1
  43. package/dist/inmarBidAdapter.js +1 -1
  44. package/dist/insticatorBidAdapter.js +1 -1
  45. package/dist/ixBidAdapter.js +1 -1
  46. package/dist/justpremiumBidAdapter.js +1 -1
  47. package/dist/kargoBidAdapter.js +1 -1
  48. package/dist/konduitAnalyticsAdapter.js +1 -1
  49. package/dist/kueezBidAdapter.js +1 -1
  50. package/dist/kueezRtbBidAdapter.js +1 -1
  51. package/dist/lassoBidAdapter.js +1 -1
  52. package/dist/lifestreetBidAdapter.js +1 -1
  53. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  54. package/dist/logicadBidAdapter.js +1 -1
  55. package/dist/loglyliftBidAdapter.js +1 -1
  56. package/dist/magniteAnalyticsAdapter.js +1 -1
  57. package/dist/malltvAnalyticsAdapter.js +1 -1
  58. package/dist/marsmediaBidAdapter.js +1 -1
  59. package/dist/mediafuseBidAdapter.js +1 -1
  60. package/dist/mediasquareBidAdapter.js +1 -1
  61. package/dist/mgidBidAdapter.js +1 -1
  62. package/dist/microadBidAdapter.js +1 -1
  63. package/dist/minutemediaBidAdapter.js +1 -1
  64. package/dist/nextMillenniumBidAdapter.js +1 -1
  65. package/dist/not-for-prod/prebid.js +154 -120
  66. package/dist/oguryBidAdapter.js +1 -1
  67. package/dist/onetagBidAdapter.js +1 -1
  68. package/dist/ooloAnalyticsAdapter.js +1 -1
  69. package/dist/outbrainBidAdapter.js +1 -1
  70. package/dist/parrableIdSystem.js +1 -1
  71. package/dist/pixfutureBidAdapter.js +1 -1
  72. package/dist/prebid-core.js +1 -1
  73. package/dist/publinkIdSystem.js +1 -1
  74. package/dist/pubmaticBidAdapter.js +1 -1
  75. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  76. package/dist/pxyzBidAdapter.js +1 -1
  77. package/dist/quantcastBidAdapter.js +1 -1
  78. package/dist/readpeakBidAdapter.js +1 -1
  79. package/dist/relaidoBidAdapter.js +1 -1
  80. package/dist/rhythmoneBidAdapter.js +1 -1
  81. package/dist/riseBidAdapter.js +1 -1
  82. package/dist/rubiconAnalyticsAdapter.js +1 -1
  83. package/dist/rubiconBidAdapter.js +1 -1
  84. package/dist/seedingAllianceBidAdapter.js +1 -1
  85. package/dist/seedtagBidAdapter.js +1 -1
  86. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  87. package/dist/sharethroughBidAdapter.js +1 -1
  88. package/dist/shinezBidAdapter.js +1 -1
  89. package/dist/smaatoBidAdapter.js +1 -1
  90. package/dist/smartadserverBidAdapter.js +1 -1
  91. package/dist/smartxBidAdapter.js +1 -1
  92. package/dist/smartytechBidAdapter.js +1 -0
  93. package/dist/smilewantedBidAdapter.js +1 -1
  94. package/dist/sonobiBidAdapter.js +1 -1
  95. package/dist/sovrnAnalyticsAdapter.js +1 -1
  96. package/dist/sovrnBidAdapter.js +1 -1
  97. package/dist/sspBCBidAdapter.js +1 -1
  98. package/dist/sublimeBidAdapter.js +1 -1
  99. package/dist/synacormediaBidAdapter.js +1 -1
  100. package/dist/taboolaBidAdapter.js +1 -1
  101. package/dist/tappxBidAdapter.js +1 -1
  102. package/dist/targetVideoBidAdapter.js +1 -1
  103. package/dist/teadsBidAdapter.js +1 -1
  104. package/dist/trionBidAdapter.js +1 -1
  105. package/dist/tripleliftBidAdapter.js +1 -1
  106. package/dist/ttdBidAdapter.js +1 -1
  107. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  108. package/dist/underdogmediaBidAdapter.js +1 -1
  109. package/dist/undertoneBidAdapter.js +1 -1
  110. package/dist/userId.js +1 -1
  111. package/dist/vidazooBidAdapter.js +1 -1
  112. package/dist/videobyteBidAdapter.js +1 -1
  113. package/dist/viqeoBidAdapter.js +1 -0
  114. package/dist/visxBidAdapter.js +1 -1
  115. package/dist/vuukleBidAdapter.js +1 -1
  116. package/dist/widespaceBidAdapter.js +1 -1
  117. package/dist/winrBidAdapter.js +1 -1
  118. package/dist/yahoosspBidAdapter.js +1 -1
  119. package/dist/yieldlabBidAdapter.js +1 -1
  120. package/dist/yieldmoBidAdapter.js +1 -1
  121. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  122. package/dist/zeta_global_sspBidAdapter.js +1 -1
  123. package/dist/zeusPrimeRtdProvider.js +31 -0
  124. package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
  125. package/modules/.submodules.json +3 -1
  126. package/modules/adagioBidAdapter.js +1 -1
  127. package/modules/admaticBidAdapter.js +108 -59
  128. package/modules/admaticBidAdapter.md +2 -2
  129. package/modules/beopBidAdapter.js +17 -2
  130. package/modules/captifyRtdProvider.js +146 -0
  131. package/modules/captifyRtdProvider.md +68 -0
  132. package/modules/concertBidAdapter.js +17 -3
  133. package/modules/conversantAnalyticsAdapter.md +12 -13
  134. package/modules/conversantBidAdapter.md +3 -3
  135. package/modules/discoveryBidAdapter.js +38 -17
  136. package/modules/discoveryBidAdapter.md +7 -6
  137. package/modules/gridBidAdapter.js +440 -22
  138. package/modules/kargoBidAdapter.js +14 -8
  139. package/modules/magniteAnalyticsAdapter.js +1 -1
  140. package/modules/microadBidAdapter.js +22 -11
  141. package/modules/nextMillenniumBidAdapter.js +20 -24
  142. package/modules/oguryBidAdapter.js +5 -2
  143. package/modules/pubmaticBidAdapter.js +1 -1
  144. package/modules/seedtagBidAdapter.js +9 -4
  145. package/modules/smartadserverBidAdapter.js +6 -2
  146. package/modules/smartxBidAdapter.js +10 -7
  147. package/modules/smartytechBidAdapter.js +78 -0
  148. package/modules/smartytechBidAdapter.md +44 -0
  149. package/modules/taboolaBidAdapter.js +3 -3
  150. package/modules/taboolaBidAdapter.md +0 -2
  151. package/modules/tappxBidAdapter.js +21 -6
  152. package/modules/ttdBidAdapter.js +4 -3
  153. package/modules/userId/index.js +1 -1
  154. package/modules/vidazooBidAdapter.js +29 -3
  155. package/modules/viqeoBidAdapter.js +180 -0
  156. package/modules/viqeoBidAdapter.md +56 -0
  157. package/modules/yieldlabBidAdapter.js +19 -8
  158. package/modules/yieldmoBidAdapter.js +22 -8
  159. package/modules/yieldoneBidAdapter.js +60 -8
  160. package/modules/yieldoneBidAdapter.md +109 -9
  161. package/modules/zeta_global_sspBidAdapter.js +4 -0
  162. package/modules/zeusPrimeRtdProvider.js +357 -0
  163. package/modules/zeusPrimeRtdProvider.md +60 -0
  164. package/package.json +1 -1
  165. package/src/adloader.js +0 -1
  166. package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
  167. package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
  168. package/test/spec/modules/beopBidAdapter_spec.js +52 -0
  169. package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
  170. package/test/spec/modules/concertBidAdapter_spec.js +26 -15
  171. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
  172. package/test/spec/modules/gridBidAdapter_spec.js +289 -1
  173. package/test/spec/modules/kargoBidAdapter_spec.js +76 -4
  174. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +20 -0
  175. package/test/spec/modules/microadBidAdapter_spec.js +48 -0
  176. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
  177. package/test/spec/modules/oguryBidAdapter_spec.js +27 -5
  178. package/test/spec/modules/pubmaticBidAdapter_spec.js +2 -2
  179. package/test/spec/modules/seedtagBidAdapter_spec.js +34 -10
  180. package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
  181. package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
  182. package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
  183. package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
  184. package/test/spec/modules/ttdBidAdapter_spec.js +13 -0
  185. package/test/spec/modules/vidazooBidAdapter_spec.js +1 -0
  186. package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
  187. package/test/spec/modules/yieldlabBidAdapter_spec.js +125 -0
  188. package/test/spec/modules/yieldmoBidAdapter_spec.js +3 -4
  189. package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
  190. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
  191. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
@@ -0,0 +1,410 @@
1
+ import { zeusPrimeSubmodule } from 'modules/zeusPrimeRtdProvider';
2
+ import { server } from 'test/mocks/xhr.js';
3
+ import * as utils from 'src/utils';
4
+
5
+ async function waitForStatus(statusVar) {
6
+ const MAX_COUNT = 20;
7
+ let count = 0;
8
+ while (
9
+ count <= MAX_COUNT &&
10
+ window.zeusPrime.status &&
11
+ window.zeusPrime.status[statusVar] !== true
12
+ ) {
13
+ count += 1;
14
+ await new Promise((resolve) => setTimeout(resolve, 10));
15
+ }
16
+
17
+ if (count === MAX_COUNT) {
18
+ throw new Error('Timeout waiting for zeusPrimeRtdProvider to complete');
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Execute all the commands in the googletag.cmd queue.
24
+ */
25
+ function executeGoogletagTargeting() {
26
+ window.googletag.cmd.forEach((cmd) => cmd());
27
+ }
28
+
29
+ describe('Zeus Prime RTD submodule', () => {
30
+ let logErrorSpy;
31
+ let logMessageSpy;
32
+ let setTargetingStub;
33
+ let originalGtag;
34
+
35
+ beforeEach(() => {
36
+ logErrorSpy = sinon.spy(utils, 'logError');
37
+ logMessageSpy = sinon.spy(utils, 'logMessage');
38
+ setTargetingStub = sinon.stub();
39
+ window.zeusPrime = { cmd: [] };
40
+ originalGtag = window.googletag;
41
+ window.googletag = {
42
+ cmd: [],
43
+ pubads: () => ({
44
+ setTargeting: setTargetingStub,
45
+ }),
46
+ };
47
+
48
+ // Mock subtle since this doesnt exists in some test environments due to security in newer browsers.
49
+ if (typeof window.crypto.subtle === 'undefined') {
50
+ Object.defineProperty(crypto, 'subtle', { value: { digest: () => 'mockHash' } })
51
+ }
52
+ });
53
+
54
+ afterEach(() => {
55
+ logErrorSpy.restore();
56
+ logMessageSpy.restore();
57
+ window.googletag = originalGtag;
58
+ });
59
+
60
+ it('should init and set key-value for zeus_<gamId>', async () => {
61
+ zeusPrimeSubmodule.init({
62
+ params: {
63
+ gamId: '1234',
64
+ hostname: 'www.example.com',
65
+ pathname: '/',
66
+ },
67
+ });
68
+
69
+ // wait for the script to finish
70
+ await waitForStatus('scriptComplete');
71
+
72
+ // execute any googletag commands added to the queue during execution
73
+ executeGoogletagTargeting();
74
+
75
+ expect(window.googletag.cmd).to.have.length(1);
76
+ sinon.assert.callCount(setTargetingStub, 1);
77
+ sinon.assert.calledWith(setTargetingStub, 'zeus_1234', 'www.example.com');
78
+ });
79
+
80
+ it('should init and set key-value for zeus_<gamId> from command queue', async () => {
81
+ window.zeusPrime.cmd.push((prime) => (prime.gamId = '9876'));
82
+ zeusPrimeSubmodule.init({
83
+ params: {
84
+ hostname: 'www.example.com',
85
+ pathname: '/',
86
+ },
87
+ });
88
+
89
+ // wait for the script to finish
90
+ await waitForStatus('scriptComplete');
91
+
92
+ // execute any googletag commands added to the queue during execution
93
+ executeGoogletagTargeting();
94
+
95
+ expect(window.googletag.cmd).to.have.length(1);
96
+ sinon.assert.callCount(setTargetingStub, 1);
97
+ sinon.assert.calledWith(setTargetingStub, 'zeus_9876', 'www.example.com');
98
+ });
99
+
100
+ it('should init with values from location and set key-value for zeus_<gamId>', async () => {
101
+ zeusPrimeSubmodule.init({ params: { gamId: '1234' } });
102
+
103
+ // wait for the script to finish
104
+ await waitForStatus('scriptComplete');
105
+
106
+ // execute any googletag commands added to the queue during execution
107
+ executeGoogletagTargeting();
108
+
109
+ expect(window.googletag.cmd).to.have.length(1);
110
+ sinon.assert.callCount(setTargetingStub, 1);
111
+ sinon.assert.calledWith(setTargetingStub, 'zeus_1234', 'localhost');
112
+ expect(window.zeusPrime.pathname).to.equal('/context.html');
113
+ });
114
+
115
+ it('should emit error when gamId is not set', async () => {
116
+ zeusPrimeSubmodule.init({});
117
+
118
+ // wait for the script to finish
119
+ await waitForStatus('scriptComplete');
120
+
121
+ // execute any googletag commands added to the queue during execution
122
+ executeGoogletagTargeting();
123
+
124
+ expect(window.googletag.cmd).to.have.length(0);
125
+ sinon.assert.callCount(setTargetingStub, 0);
126
+ sinon.assert.calledWith(
127
+ logErrorSpy,
128
+ 'zeusPrimeRtdProvider: ',
129
+ 'Failed to run.',
130
+ 'window.zeusPrime.gamId must be a string. Received: undefined'
131
+ );
132
+ });
133
+
134
+ it('should not make a call to the server when url is a homepage', async () => {
135
+ zeusPrimeSubmodule.init({
136
+ params: {
137
+ gamId: '1234',
138
+ hostname: 'www.example.com',
139
+ pathname: '/',
140
+ },
141
+ });
142
+
143
+ // wait for the script to finish
144
+ await waitForStatus('scriptComplete');
145
+
146
+ expect(server.requests).to.have.length(0);
147
+ });
148
+
149
+ it('should make a call to the server and set key-vlaue when url is an article page and returns topics', async () => {
150
+ zeusPrimeSubmodule.init({
151
+ params: {
152
+ gamId: '1234',
153
+ hostname: 'www.example.com',
154
+ pathname: '/article/some-article',
155
+ },
156
+ });
157
+
158
+ // Wait for request to be sent
159
+ await waitForStatus('insightsReqReceived');
160
+
161
+ // Response
162
+ server.requests[0].respond(
163
+ 200,
164
+ { 'Content-Type': 'application/json' },
165
+ '{"topics": ["bs0"]}'
166
+ );
167
+
168
+ // Wait for the script to process the response
169
+ await waitForStatus('scriptComplete');
170
+
171
+ // execute any googletag commands added to the queue during execution
172
+ executeGoogletagTargeting();
173
+
174
+ expect(server.requestCount).to.be.equal(1);
175
+ expect(window.googletag.cmd).to.have.length(2);
176
+ sinon.assert.calledTwice(setTargetingStub);
177
+ sinon.assert.calledWith(
178
+ setTargetingStub.firstCall,
179
+ 'zeus_1234',
180
+ 'www.example.com'
181
+ );
182
+ sinon.assert.calledWith(setTargetingStub.secondCall, 'zeus_insights', [
183
+ 'bs0',
184
+ ]);
185
+ sinon.assert.notCalled(logErrorSpy);
186
+ });
187
+
188
+ it('should not set insights keyvalue when server returns 204', async () => {
189
+ zeusPrimeSubmodule.init({
190
+ params: {
191
+ gamId: '1234',
192
+ hostname: 'www.example.com',
193
+ pathname: '/article/some-article',
194
+ },
195
+ });
196
+
197
+ // Wait for request to be sent
198
+ await waitForStatus('insightsReqReceived');
199
+
200
+ // Response
201
+ server.requests[0].respond(204, { 'Content-Type': 'application/json' });
202
+
203
+ // Wait for the script to process the response
204
+ await waitForStatus('scriptComplete');
205
+
206
+ // execute any googletag commands added to the queue during execution
207
+ executeGoogletagTargeting();
208
+
209
+ expect(server.requestCount).to.be.equal(1);
210
+ expect(window.googletag.cmd).to.have.length(1);
211
+ sinon.assert.calledOnce(setTargetingStub);
212
+ sinon.assert.calledWith(
213
+ setTargetingStub.firstCall,
214
+ 'zeus_1234',
215
+ 'www.example.com'
216
+ );
217
+ sinon.assert.notCalled(logErrorSpy);
218
+ });
219
+
220
+ it('should not set insights keyvalue when server returns empty topics array', async () => {
221
+ zeusPrimeSubmodule.init({
222
+ params: {
223
+ gamId: '1234',
224
+ hostname: 'www.example.com',
225
+ pathname: '/article/some-article',
226
+ },
227
+ });
228
+
229
+ // Wait for request to be sent
230
+ await waitForStatus('insightsReqReceived');
231
+
232
+ // Respond
233
+ server.requests[0].respond(
234
+ 200,
235
+ { 'Content-Type': 'application/json' },
236
+ '{ "topics": [] }'
237
+ );
238
+
239
+ // Wait for the script to process the response
240
+ await waitForStatus('scriptComplete');
241
+
242
+ // execute any googletag commands added to the queue during execution
243
+ executeGoogletagTargeting();
244
+
245
+ expect(server.requestCount).to.be.equal(1);
246
+ expect(window.googletag.cmd).to.have.length(1);
247
+ sinon.assert.calledOnce(setTargetingStub);
248
+ sinon.assert.calledWith(
249
+ setTargetingStub.firstCall,
250
+ 'zeus_1234',
251
+ 'www.example.com'
252
+ );
253
+ sinon.assert.notCalled(logErrorSpy);
254
+ });
255
+
256
+ it('should not set insights keyvalue and emit error when server returns error status (400)', async () => {
257
+ zeusPrimeSubmodule.init({
258
+ params: {
259
+ gamId: '1234',
260
+ hostname: 'www.example.com',
261
+ pathname: '/article/some-article',
262
+ },
263
+ });
264
+
265
+ // Wait for request to be sent
266
+ await waitForStatus('insightsReqReceived');
267
+
268
+ // Response
269
+ server.requests[0].respond(
270
+ 404,
271
+ { 'Content-Type': 'application/json' },
272
+ '{"message": "Not found"}'
273
+ );
274
+
275
+ // Wait for the script to process the response
276
+ await waitForStatus('scriptComplete');
277
+
278
+ // execute any googletag commands added to the queue during execution
279
+ executeGoogletagTargeting();
280
+
281
+ expect(server.requestCount).to.be.equal(1);
282
+ expect(window.googletag.cmd).to.have.length(1);
283
+ sinon.assert.calledOnce(setTargetingStub);
284
+ sinon.assert.calledWith(
285
+ setTargetingStub.firstCall,
286
+ 'zeus_1234',
287
+ 'www.example.com'
288
+ );
289
+ sinon.assert.calledWith(
290
+ logErrorSpy,
291
+ 'zeusPrimeRtdProvider: ',
292
+ 'Topics request returned error: 404'
293
+ );
294
+ });
295
+
296
+ it('should not set insights keyvalue and emit error when response is not received (network request)', async () => {
297
+ zeusPrimeSubmodule.init({
298
+ params: {
299
+ gamId: '1234',
300
+ hostname: 'www.example.com',
301
+ pathname: '/article/some-article',
302
+ },
303
+ });
304
+
305
+ // Wait for request to be sent
306
+ await waitForStatus('insightsReqReceived');
307
+
308
+ // Response
309
+ server.requests[0].error();
310
+
311
+ // Wait for the script to process the response
312
+ await waitForStatus('scriptComplete');
313
+
314
+ // execute any googletag commands added to the queue during execution
315
+ executeGoogletagTargeting();
316
+
317
+ expect(server.requestCount).to.be.equal(1);
318
+ expect(window.googletag.cmd).to.have.length(1);
319
+ sinon.assert.calledOnce(setTargetingStub);
320
+ sinon.assert.calledWith(
321
+ setTargetingStub.firstCall,
322
+ 'zeus_1234',
323
+ 'www.example.com'
324
+ );
325
+ sinon.assert.calledWith(
326
+ logErrorSpy,
327
+ 'zeusPrimeRtdProvider: ',
328
+ 'failed to request topics'
329
+ );
330
+ });
331
+
332
+ it('fails gracefully when crypto fails', async () => {
333
+ const digestStub = sinon.stub(window.crypto.subtle, 'digest');
334
+ digestStub.throwsException('Failed to generate digest.');
335
+
336
+ zeusPrimeSubmodule.init({
337
+ params: {
338
+ gamId: '1234',
339
+ hostname: 'www.example.com',
340
+ pathname: '/article/some-article',
341
+ },
342
+ });
343
+
344
+ // Wait for request to be sent
345
+ await waitForStatus('scriptComplete');
346
+
347
+ sinon.assert.calledWith(
348
+ logErrorSpy,
349
+ 'zeusPrimeRtdProvider: ',
350
+ 'Failed to load hash'
351
+ );
352
+
353
+ digestStub.restore();
354
+ });
355
+
356
+ it('script should add zeus_prime key and not send request when disabled is set', async () => {
357
+ zeusPrimeSubmodule.init({
358
+ params: {
359
+ gamId: '1234',
360
+ disabled: true,
361
+ hostname: 'www.example.com',
362
+ pathname: '/article/some-article',
363
+ },
364
+ });
365
+
366
+ // Wait for request to be sent
367
+ await waitForStatus('scriptComplete');
368
+
369
+ // execute any googletag commands added to the queue during execution
370
+ executeGoogletagTargeting();
371
+
372
+ expect(server.requestCount).to.be.equal(0);
373
+ expect(window.googletag.cmd).to.have.length(1);
374
+ sinon.assert.calledWith(setTargetingStub, 'zeus_prime', 'false');
375
+ });
376
+
377
+ it('debug true enables debug logging', async () => {
378
+ zeusPrimeSubmodule.init({
379
+ params: {
380
+ gamId: '1234',
381
+ debug: true,
382
+ hostname: 'www.example.com',
383
+ pathname: '/article/some-article',
384
+ },
385
+ });
386
+
387
+ // Wait for request to be sent
388
+ await waitForStatus('scriptComplete');
389
+
390
+ sinon.assert.called(logMessageSpy);
391
+ sinon.assert.notCalled(logErrorSpy);
392
+ });
393
+
394
+ it('debug false disables debug logging', async () => {
395
+ window.zeusPrime.disabled = false;
396
+ zeusPrimeSubmodule.init({
397
+ params: {
398
+ gamId: '1234',
399
+ hostname: 'www.example.com',
400
+ pathname: '/article/some-article',
401
+ },
402
+ });
403
+
404
+ // Wait for request to be sent
405
+ await waitForStatus('scriptComplete');
406
+
407
+ sinon.assert.notCalled(logMessageSpy);
408
+ sinon.assert.notCalled(logErrorSpy);
409
+ });
410
+ });