prebid.js 6.26.0 → 6.29.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 (261) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adWMGAnalyticsAdapter.js +1 -1
  3. package/dist/adagioAnalyticsAdapter.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adfBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  9. package/dist/adlooxAdServerVideo.js +1 -1
  10. package/dist/adlooxAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/adoceanBidAdapter.js +1 -1
  13. package/dist/adomikAnalyticsAdapter.js +1 -1
  14. package/dist/adrelevantisBidAdapter.js +1 -1
  15. package/dist/adxcgAnalyticsAdapter.js +1 -1
  16. package/dist/adxcgBidAdapter.js +1 -1
  17. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  18. package/dist/adyoulikeBidAdapter.js +1 -1
  19. package/dist/ajaBidAdapter.js +1 -1
  20. package/dist/akamaiDapRtdProvider.js +1 -1
  21. package/dist/amxBidAdapter.js +1 -1
  22. package/dist/amxIdSystem.js +1 -1
  23. package/dist/appierAnalyticsAdapter.js +1 -1
  24. package/dist/appnexusAnalyticsAdapter.js +1 -1
  25. package/dist/appnexusBidAdapter.js +1 -1
  26. package/dist/asoBidAdapter.js +1 -1
  27. package/dist/atsAnalyticsAdapter.js +1 -1
  28. package/dist/audiencerunBidAdapter.js +1 -1
  29. package/dist/automatadBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/bidglassBidAdapter.js +1 -1
  32. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  33. package/dist/big-richmediaBidAdapter.js +1 -1
  34. package/dist/bluebillywigBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/byDataAnalyticsAdapter.js +1 -1
  38. package/dist/colossussspBidAdapter.js +1 -1
  39. package/dist/concertAnalyticsAdapter.js +1 -1
  40. package/dist/concertBidAdapter.js +1 -1
  41. package/dist/connectadBidAdapter.js +1 -1
  42. package/dist/consumableBidAdapter.js +1 -1
  43. package/dist/conversantBidAdapter.js +1 -1
  44. package/dist/craftBidAdapter.js +1 -1
  45. package/dist/criteoBidAdapter.js +1 -1
  46. package/dist/datablocksAnalyticsAdapter.js +1 -1
  47. package/dist/dspxBidAdapter.js +1 -1
  48. package/dist/eplanningAnalyticsAdapter.js +1 -1
  49. package/dist/eplanningBidAdapter.js +1 -1
  50. package/dist/fintezaAnalyticsAdapter.js +1 -1
  51. package/dist/ftrackIdSystem.js +1 -1
  52. package/dist/gdprEnforcement.js +1 -1
  53. package/dist/glimpseBidAdapter.js +1 -1
  54. package/dist/gmosspBidAdapter.js +1 -1
  55. package/dist/goldbachBidAdapter.js +1 -1
  56. package/dist/gridBidAdapter.js +1 -1
  57. package/dist/gridNMBidAdapter.js +1 -1
  58. package/dist/gumgumBidAdapter.js +1 -1
  59. package/dist/h12mediaBidAdapter.js +1 -1
  60. package/dist/hadronAnalyticsAdapter.js +1 -1
  61. package/dist/hadronRtdProvider.js +1 -1
  62. package/dist/id5AnalyticsAdapter.js +1 -1
  63. package/dist/id5IdSystem.js +1 -1
  64. package/dist/impactifyBidAdapter.js +1 -1
  65. package/dist/improvedigitalBidAdapter.js +1 -1
  66. package/dist/incrxBidAdapter.js +1 -0
  67. package/dist/inmarBidAdapter.js +1 -1
  68. package/dist/inskinBidAdapter.js +1 -1
  69. package/dist/insticatorBidAdapter.js +1 -1
  70. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  71. package/dist/ixBidAdapter.js +1 -1
  72. package/dist/jixieBidAdapter.js +1 -1
  73. package/dist/justpremiumBidAdapter.js +1 -1
  74. package/dist/kargoAnalyticsAdapter.js +1 -1
  75. package/dist/kargoBidAdapter.js +1 -1
  76. package/dist/koblerBidAdapter.js +1 -1
  77. package/dist/konduitAnalyticsAdapter.js +1 -1
  78. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  79. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  80. package/dist/logicadBidAdapter.js +1 -1
  81. package/dist/loglyliftBidAdapter.js +1 -1
  82. package/dist/malltvAnalyticsAdapter.js +1 -1
  83. package/dist/mantisBidAdapter.js +1 -1
  84. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  85. package/dist/marsmediaBidAdapter.js +1 -1
  86. package/dist/mediafuseBidAdapter.js +1 -1
  87. package/dist/mediakeysBidAdapter.js +1 -1
  88. package/dist/medianetAnalyticsAdapter.js +1 -1
  89. package/dist/medianetBidAdapter.js +1 -1
  90. package/dist/medianetRtdProvider.js +1 -1
  91. package/dist/mediasquareBidAdapter.js +1 -1
  92. package/dist/merkleIdSystem.js +1 -1
  93. package/dist/mgidBidAdapter.js +1 -1
  94. package/dist/minutemediaBidAdapter.js +1 -1
  95. package/dist/naveggIdSystem.js +1 -1
  96. package/dist/not-for-prod/prebid.js +178 -176
  97. package/dist/novatiqIdSystem.js +1 -1
  98. package/dist/oguryBidAdapter.js +1 -1
  99. package/dist/oneVideoBidAdapter.js +1 -1
  100. package/dist/onetagBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxAnalyticsAdapter.js +1 -1
  103. package/dist/optimonAnalyticsAdapter.js +1 -1
  104. package/dist/outbrainBidAdapter.js +1 -1
  105. package/dist/parrableIdSystem.js +1 -1
  106. package/dist/pixfutureBidAdapter.js +1 -1
  107. package/dist/prebid-core.js +3 -3
  108. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  109. package/dist/pubCommonId.js +1 -1
  110. package/dist/publinkIdSystem.js +1 -1
  111. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  112. package/dist/pubmaticBidAdapter.js +1 -1
  113. package/dist/pubperfAnalyticsAdapter.js +1 -1
  114. package/dist/pubstackAnalyticsAdapter.js +1 -1
  115. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  116. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  117. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  118. package/dist/pxyzBidAdapter.js +1 -1
  119. package/dist/quantcastBidAdapter.js +1 -1
  120. package/dist/readpeakBidAdapter.js +1 -1
  121. package/dist/realvuAnalyticsAdapter.js +1 -1
  122. package/dist/relaidoBidAdapter.js +1 -1
  123. package/dist/relevantAnalyticsAdapter.js +1 -1
  124. package/dist/rhythmoneBidAdapter.js +1 -1
  125. package/dist/riseBidAdapter.js +1 -1
  126. package/dist/rivrAnalyticsAdapter.js +1 -1
  127. package/dist/roxotAnalyticsAdapter.js +1 -1
  128. package/dist/rubiconAnalyticsAdapter.js +1 -1
  129. package/dist/rubiconBidAdapter.js +1 -1
  130. package/dist/scaleableAnalyticsAdapter.js +1 -1
  131. package/dist/seedingAllianceBidAdapter.js +1 -1
  132. package/dist/seedtagBidAdapter.js +1 -1
  133. package/dist/sharedIdSystem.js +1 -1
  134. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  135. package/dist/sharethroughBidAdapter.js +1 -1
  136. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  137. package/dist/slimcutBidAdapter.js +1 -1
  138. package/dist/smaatoBidAdapter.js +1 -1
  139. package/dist/smartadserverBidAdapter.js +1 -1
  140. package/dist/smartxBidAdapter.js +1 -1
  141. package/dist/smilewantedBidAdapter.js +1 -1
  142. package/dist/sonobiAnalyticsAdapter.js +1 -1
  143. package/dist/sonobiBidAdapter.js +1 -1
  144. package/dist/sortableAnalyticsAdapter.js +1 -1
  145. package/dist/sortableBidAdapter.js +1 -1
  146. package/dist/sovrnAnalyticsAdapter.js +1 -1
  147. package/dist/sovrnBidAdapter.js +1 -1
  148. package/dist/spotxBidAdapter.js +1 -1
  149. package/dist/sspBCBidAdapter.js +1 -1
  150. package/dist/staqAnalyticsAdapter.js +1 -1
  151. package/dist/sublimeBidAdapter.js +1 -1
  152. package/dist/synacormediaBidAdapter.js +1 -1
  153. package/dist/taboolaBidAdapter.js +1 -0
  154. package/dist/targetVideoBidAdapter.js +1 -1
  155. package/dist/teadsBidAdapter.js +1 -1
  156. package/dist/telariaBidAdapter.js +1 -1
  157. package/dist/terceptAnalyticsAdapter.js +1 -1
  158. package/dist/trionBidAdapter.js +1 -1
  159. package/dist/tripleliftBidAdapter.js +1 -1
  160. package/dist/trustxBidAdapter.js +1 -1
  161. package/dist/ttdBidAdapter.js +1 -1
  162. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  163. package/dist/underdogmediaBidAdapter.js +1 -1
  164. package/dist/undertoneBidAdapter.js +1 -1
  165. package/dist/userId.js +1 -1
  166. package/dist/vidazooBidAdapter.js +1 -1
  167. package/dist/videobyteBidAdapter.js +1 -1
  168. package/dist/visxBidAdapter.js +1 -1
  169. package/dist/vuukleBidAdapter.js +1 -1
  170. package/dist/widespaceBidAdapter.js +1 -1
  171. package/dist/winrBidAdapter.js +1 -1
  172. package/dist/yahoosspBidAdapter.js +1 -1
  173. package/dist/yieldmoBidAdapter.js +1 -1
  174. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  175. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  176. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  177. package/dist/zeta_global_sspBidAdapter.js +1 -1
  178. package/integrationExamples/gpt/akamaidap_segments_example.html +5 -3
  179. package/modules/.submodules.json +1 -0
  180. package/modules/adfBidAdapter.js +0 -3
  181. package/modules/adlooxAnalyticsAdapter.js +9 -5
  182. package/modules/adlooxAnalyticsAdapter.md +3 -3
  183. package/modules/adlooxRtdProvider.js +3 -5
  184. package/modules/adlooxRtdProvider.md +2 -2
  185. package/modules/adoceanBidAdapter.js +29 -1
  186. package/modules/adyoulikeBidAdapter.js +3 -0
  187. package/modules/akamaiDapRtdProvider.js +469 -139
  188. package/modules/akamaiDapRtdProvider.md +5 -3
  189. package/modules/automatadBidAdapter.js +9 -5
  190. package/modules/colossussspBidAdapter.js +17 -17
  191. package/modules/conversantBidAdapter.js +2 -2
  192. package/modules/criteoBidAdapter.js +1 -1
  193. package/modules/ftrackIdSystem.js +5 -8
  194. package/modules/gdprEnforcement.js +15 -9
  195. package/modules/gridBidAdapter.js +4 -0
  196. package/modules/hadronAnalyticsAdapter.js +5 -1
  197. package/modules/hadronRtdProvider.js +15 -13
  198. package/modules/incrxBidAdapter.js +87 -0
  199. package/modules/{vertozBidAdapter.md → incrxBidAdapter.md} +6 -6
  200. package/modules/inskinBidAdapter.js +4 -3
  201. package/modules/insticatorBidAdapter.js +109 -42
  202. package/modules/ixBidAdapter.js +3 -2
  203. package/modules/ixBidAdapter.md +1 -1
  204. package/modules/kargoBidAdapter.js +32 -1
  205. package/modules/koblerBidAdapter.js +54 -45
  206. package/modules/koblerBidAdapter.md +12 -17
  207. package/modules/mantisBidAdapter.js +4 -8
  208. package/modules/medianetBidAdapter.js +2 -2
  209. package/modules/medianetRtdProvider.js +4 -6
  210. package/modules/merkleIdSystem.js +43 -31
  211. package/modules/naveggIdSystem.js +3 -2
  212. package/modules/novatiqIdSystem.js +6 -1
  213. package/modules/pubCommonId.js +2 -1
  214. package/modules/pubmaticAnalyticsAdapter.js +49 -33
  215. package/modules/relaidoBidAdapter.js +0 -3
  216. package/modules/sharedIdSystem.js +5 -11
  217. package/modules/slimcutBidAdapter.js +2 -2
  218. package/modules/spotxBidAdapter.js +1 -1
  219. package/modules/synacormediaBidAdapter.js +11 -2
  220. package/modules/taboolaBidAdapter.js +265 -0
  221. package/modules/taboolaBidAdapter.md +49 -0
  222. package/modules/telariaBidAdapter.js +3 -3
  223. package/modules/userId/eids.js +25 -5
  224. package/modules/zeta_global_sspBidAdapter.js +3 -2
  225. package/package.json +1 -1
  226. package/src/AnalyticsAdapter.js +5 -1
  227. package/src/adloader.js +6 -1
  228. package/src/storageManager.js +5 -4
  229. package/test/mocks/analyticsStub.js +13 -0
  230. package/test/mocks/xhr.js +22 -0
  231. package/test/spec/AnalyticsAdapter_spec.js +4 -0
  232. package/test/spec/modules/adfBidAdapter_spec.js +1 -1
  233. package/test/spec/modules/adoceanBidAdapter_spec.js +25 -1
  234. package/test/spec/modules/adriverIdSystem_spec.js +7 -3
  235. package/test/spec/modules/adyoulikeBidAdapter_spec.js +16 -1
  236. package/test/spec/modules/akamaiDapRtdProvider_spec.js +457 -109
  237. package/test/spec/modules/automatadBidAdapter_spec.js +4 -0
  238. package/test/spec/modules/conversantBidAdapter_spec.js +36 -5
  239. package/test/spec/modules/datablocksBidAdapter_spec.js +9 -8
  240. package/test/spec/modules/eids_spec.js +48 -3
  241. package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +4 -4
  242. package/test/spec/modules/ftrackIdSystem_spec.js +11 -22
  243. package/test/spec/modules/gdprEnforcement_spec.js +100 -53
  244. package/test/spec/modules/gridBidAdapter_spec.js +11 -0
  245. package/test/spec/modules/incrxBidAdapter_spec.js +100 -0
  246. package/test/spec/modules/insticatorBidAdapter_spec.js +46 -1
  247. package/test/spec/modules/ixBidAdapter_spec.js +1 -1
  248. package/test/spec/modules/kargoBidAdapter_spec.js +27 -0
  249. package/test/spec/modules/koblerBidAdapter_spec.js +160 -124
  250. package/test/spec/modules/medianetRtdProvider_spec.js +146 -0
  251. package/test/spec/modules/merkleIdSystem_spec.js +58 -37
  252. package/test/spec/modules/naveggIdSystem_spec.js +25 -1
  253. package/test/spec/modules/proxistoreBidAdapter_spec.js +0 -2
  254. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +117 -0
  255. package/test/spec/modules/sovrnBidAdapter_spec.js +253 -264
  256. package/test/spec/modules/synacormediaBidAdapter_spec.js +74 -0
  257. package/test/spec/modules/taboolaBidAdapter_spec.js +455 -0
  258. package/test/spec/modules/userId_spec.js +27 -1
  259. package/test/spec/modules/vidazooBidAdapter_spec.js +9 -4
  260. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +4 -2
  261. package/test/test_deps.js +1 -0
@@ -96,6 +96,10 @@ describe('automatadBidAdapter', function () {
96
96
  let req = spec.buildRequests([ bidRequestRequiredParams ], { refererInfo: { } })
97
97
  let rdata
98
98
 
99
+ it('should have withCredentials option as true', function() {
100
+ expect(req.options.withCredentials).to.equal(true)
101
+ })
102
+
99
103
  it('should return request object', function () {
100
104
  expect(req).to.not.be.null
101
105
  })
@@ -72,6 +72,7 @@ describe('Conversant adapter tests', function() {
72
72
  video: {
73
73
  context: 'instream',
74
74
  playerSize: [632, 499],
75
+ pos: 3
75
76
  }
76
77
  },
77
78
  placementCode: 'pcode003',
@@ -108,12 +109,14 @@ describe('Conversant adapter tests', function() {
108
109
  {
109
110
  bidder: 'conversant',
110
111
  params: {
111
- site_id: siteId
112
+ site_id: siteId,
113
+ position: 2,
112
114
  },
113
115
  mediaTypes: {
114
116
  video: {
115
117
  context: 'instream',
116
- mimes: ['video/mp4', 'video/x-flv']
118
+ mimes: ['video/mp4', 'video/x-flv'],
119
+ pos: 7,
117
120
  }
118
121
  },
119
122
  placementCode: 'pcode005',
@@ -147,6 +150,23 @@ describe('Conversant adapter tests', function() {
147
150
  bidId: 'bid006',
148
151
  bidderRequestId: '117d765b87bed38',
149
152
  auctionId: 'req000'
153
+ },
154
+ {
155
+ bidder: 'conversant',
156
+ params: {
157
+ site_id: siteId
158
+ },
159
+ mediaTypes: {
160
+ banner: {
161
+ sizes: [[728, 90], [468, 60]],
162
+ pos: 5
163
+ }
164
+ },
165
+ placementCode: 'pcode001',
166
+ transactionId: 'tx001',
167
+ bidId: 'bid007',
168
+ bidderRequestId: '117d765b87bed38',
169
+ auctionId: 'req000'
150
170
  }
151
171
  ];
152
172
 
@@ -245,7 +265,7 @@ describe('Conversant adapter tests', function() {
245
265
  expect(payload).to.have.property('id', 'req000');
246
266
  expect(payload).to.have.property('at', 1);
247
267
  expect(payload).to.have.property('imp');
248
- expect(payload.imp).to.be.an('array').with.lengthOf(7);
268
+ expect(payload.imp).to.be.an('array').with.lengthOf(8);
249
269
 
250
270
  expect(payload.imp[0]).to.have.property('id', 'bid000');
251
271
  expect(payload.imp[0]).to.have.property('secure', 1);
@@ -287,7 +307,7 @@ describe('Conversant adapter tests', function() {
287
307
  expect(payload.imp[3]).to.have.property('displaymanagerver').that.matches(versionPattern);
288
308
  expect(payload.imp[3]).to.not.have.property('tagid');
289
309
  expect(payload.imp[3]).to.have.property('video');
290
- expect(payload.imp[3].video).to.not.have.property('pos');
310
+ expect(payload.imp[3].video).to.have.property('pos', 3);
291
311
  expect(payload.imp[3].video).to.have.property('w', 632);
292
312
  expect(payload.imp[3].video).to.have.property('h', 499);
293
313
  expect(payload.imp[3].video).to.have.property('mimes');
@@ -325,7 +345,7 @@ describe('Conversant adapter tests', function() {
325
345
  expect(payload.imp[5]).to.have.property('displaymanagerver').that.matches(versionPattern);
326
346
  expect(payload.imp[5]).to.not.have.property('tagid');
327
347
  expect(payload.imp[5]).to.have.property('video');
328
- expect(payload.imp[5].video).to.not.have.property('pos');
348
+ expect(payload.imp[5].video).to.have.property('pos', 2);
329
349
  expect(payload.imp[5].video).to.not.have.property('w');
330
350
  expect(payload.imp[5].video).to.not.have.property('h');
331
351
  expect(payload.imp[5].video).to.have.property('mimes');
@@ -345,6 +365,17 @@ describe('Conversant adapter tests', function() {
345
365
  expect(payload.imp[6].ext).to.have.property('data');
346
366
  expect(payload.imp[6].ext.data).to.have.property('pbadslot');
347
367
 
368
+ expect(payload.imp[7]).to.have.property('id', 'bid007');
369
+ expect(payload.imp[7]).to.have.property('secure', 1);
370
+ expect(payload.imp[7]).to.have.property('bidfloor', 0);
371
+ expect(payload.imp[7]).to.have.property('displaymanager', 'Prebid.js');
372
+ expect(payload.imp[7]).to.have.property('displaymanagerver').that.matches(versionPattern);
373
+ expect(payload.imp[7]).to.not.have.property('tagid');
374
+ expect(payload.imp[7]).to.have.property('banner');
375
+ expect(payload.imp[7].banner).to.have.property('pos', 5);
376
+ expect(payload.imp[7].banner).to.have.property('format');
377
+ expect(payload.imp[7].banner.format).to.deep.equal([{w: 728, h: 90}, {w: 468, h: 60}]);
378
+
348
379
  expect(payload).to.have.property('site');
349
380
  expect(payload.site).to.have.property('id', siteId);
350
381
  expect(payload.site).to.have.property('mobile').that.is.oneOf([0, 1]);
@@ -305,6 +305,15 @@ let bid_request = {
305
305
  }
306
306
 
307
307
  describe('DatablocksAdapter', function() {
308
+ before(() => {
309
+ // stub out queue metric to avoid it polluting the global xhr mock during other tests
310
+ sinon.stub(spec, 'queue_metric').callsFake(() => null);
311
+ });
312
+
313
+ after(() => {
314
+ spec.queue_metric.restore();
315
+ });
316
+
308
317
  describe('All needed functions are available', function() {
309
318
  it(`isBidRequestValid is present and type function`, function () {
310
319
  expect(spec.isBidRequestValid).to.exist.and.to.be.a('function')
@@ -377,14 +386,6 @@ describe('DatablocksAdapter', function() {
377
386
  });
378
387
  })
379
388
 
380
- describe('queue / send metrics', function() {
381
- it('Should return true', function() {
382
- expect(spec.queue_metric({type: 'test'})).to.be.true;
383
- expect(spec.queue_metric('string')).to.be.false;
384
- expect(spec.send_metrics()).to.be.true;
385
- });
386
- })
387
-
388
389
  describe('get_viewability', function() {
389
390
  it('Should return undefined', function() {
390
391
  expect(spec.get_viewability()).to.equal(undefined);
@@ -82,20 +82,65 @@ describe('eids array generation for known sub-modules', function() {
82
82
  });
83
83
  });
84
84
 
85
- it('merkleId', function() {
85
+ it('merkleId (legacy) - supports single id', function() {
86
86
  const userId = {
87
87
  merkleId: {
88
88
  id: 'some-random-id-value', keyID: 1
89
89
  }
90
90
  };
91
91
  const newEids = createEidsArray(userId);
92
+
92
93
  expect(newEids.length).to.equal(1);
93
94
  expect(newEids[0]).to.deep.equal({
94
95
  source: 'merkleinc.com',
96
+ uids: [{
97
+ id: 'some-random-id-value',
98
+ atype: 3,
99
+ ext: { keyID: 1 }
100
+ }]
101
+ });
102
+ });
103
+
104
+ it('merkleId supports multiple source providers', function() {
105
+ const userId = {
106
+ merkleId: [{
107
+ id: 'some-random-id-value', ext: { enc: 1, keyID: 16, idName: 'pamId', ssp: 'ssp1' }
108
+ }, {
109
+ id: 'another-random-id-value',
110
+ ext: {
111
+ enc: 1,
112
+ idName: 'pamId',
113
+ third: 4,
114
+ ssp: 'ssp2'
115
+ }
116
+ }]
117
+ }
118
+
119
+ const newEids = createEidsArray(userId);
120
+ expect(newEids.length).to.equal(2);
121
+ expect(newEids[0]).to.deep.equal({
122
+ source: 'ssp1.merkleinc.com',
95
123
  uids: [{id: 'some-random-id-value',
96
124
  atype: 3,
97
- ext: { keyID: 1
98
- }}]
125
+ ext: {
126
+ enc: 1,
127
+ keyID: 16,
128
+ idName: 'pamId',
129
+ ssp: 'ssp1'
130
+ }
131
+ }]
132
+ });
133
+ expect(newEids[1]).to.deep.equal({
134
+ source: 'ssp2.merkleinc.com',
135
+ uids: [{id: 'another-random-id-value',
136
+ atype: 3,
137
+ ext: {
138
+ third: 4,
139
+ enc: 1,
140
+ idName: 'pamId',
141
+ ssp: 'ssp2'
142
+ }
143
+ }]
99
144
  });
100
145
  });
101
146
 
@@ -51,7 +51,7 @@ describe('finteza analytics adapter', function () {
51
51
 
52
52
  describe('track', () => {
53
53
  describe('bid request', () => {
54
- it('builds and sends data', function () {
54
+ it('builds and sends request data', function () {
55
55
  const bidderCode = 'Bidder789';
56
56
  const pauctionId = '5018eb39-f900-4370-b71e-3bb5b48d324f';
57
57
 
@@ -95,7 +95,7 @@ describe('finteza analytics adapter', function () {
95
95
  });
96
96
 
97
97
  describe('bid response', () => {
98
- it('builds and sends data', function () {
98
+ it('builds and sends response data', function () {
99
99
  const bidderCode = 'Bidder789';
100
100
  const pauctionId = '5018eb39-f900-4370-b71e-3bb5b48d324f';
101
101
 
@@ -154,7 +154,7 @@ describe('finteza analytics adapter', function () {
154
154
  });
155
155
 
156
156
  describe('bid won', () => {
157
- it('builds and sends data', function () {
157
+ it('builds and sends bid won data', function () {
158
158
  const bidderCode = 'Bidder789';
159
159
  const pauctionId = '5018eb39-f900-4370-b71e-3bb5b48d324f';
160
160
 
@@ -194,7 +194,7 @@ describe('finteza analytics adapter', function () {
194
194
  });
195
195
 
196
196
  describe('bid timeout', () => {
197
- it('builds and sends data', function () {
197
+ it('builds and sends timeout data', function () {
198
198
  const bidderCode = 'biDDer789';
199
199
  const pauctionId = '5018eb39-f900-4370-b71e-3bb5b48d324f';
200
200
 
@@ -1,6 +1,7 @@
1
1
  import { ftrackIdSubmodule } from 'modules/ftrackIdSystem.js';
2
2
  import * as utils from 'src/utils.js';
3
3
  import { uspDataHandler } from 'src/adapterManager.js';
4
+ import { loadExternalScript } from 'src/adloader.js';
4
5
  let expect = require('chai').expect;
5
6
 
6
7
  let server;
@@ -95,15 +96,7 @@ describe('FTRACK ID System', () => {
95
96
  delete configMock1.params.url;
96
97
 
97
98
  ftrackIdSubmodule.isConfigOk(configMock1);
98
- expect(logWarnStub.args[0][0]).to.equal(`FTRACK - config.params.url is required for ftrack to run. Url should be "https://d9.flashtalking.com/d9core".`);
99
- });
100
-
101
- it(`should be rejected if 'storage.param.url' does not exist or is not 'https://d9.flashtalking.com/d9core'`, () => {
102
- let configMock1 = JSON.parse(JSON.stringify(configMock));
103
- configMock1.params.url = 'https://d9.NOT.flashtalking.com/d9core';
104
-
105
- ftrackIdSubmodule.isConfigOk(configMock1);
106
- expect(logWarnStub.args[0][0]).to.equal(`FTRACK - config.params.url is required for ftrack to run. Url should be "https://d9.flashtalking.com/d9core".`);
99
+ expect(logWarnStub.args[0][0]).to.equal(`FTRACK - config.params.url is required for ftrack to run.`);
107
100
  });
108
101
  });
109
102
 
@@ -154,25 +147,21 @@ describe('FTRACK ID System', () => {
154
147
  });
155
148
 
156
149
  it(`should be the only method that gets a new ID aka hits the D9 endpoint`, () => {
157
- let appendChildStub = sinon.stub(window.document.body, 'appendChild');
158
-
159
150
  ftrackIdSubmodule.getId(configMock, null, null).callback();
160
- expect(window.document.body.appendChild.called).to.be.ok;
161
- let actualScriptTag = window.document.body.appendChild.args[0][0];
162
- expect(actualScriptTag.tagName.toLowerCase()).to.equal('script');
163
- expect(actualScriptTag.getAttribute('src')).to.equal('https://d9.flashtalking.com/d9core');
164
- appendChildStub.resetHistory();
151
+ expect(loadExternalScript.called).to.be.ok;
152
+ expect(loadExternalScript.args[0][0]).to.deep.equal('https://d9.flashtalking.com/d9core');
153
+ loadExternalScript.resetHistory();
165
154
 
166
155
  ftrackIdSubmodule.decode('value', configMock);
167
- expect(window.document.body.appendChild.called).to.not.be.ok;
168
- expect(window.document.body.appendChild.args).to.deep.equal([]);
169
- appendChildStub.resetHistory();
156
+ expect(loadExternalScript.called).to.not.be.ok;
157
+ expect(loadExternalScript.args).to.deep.equal([]);
158
+ loadExternalScript.resetHistory();
170
159
 
171
160
  ftrackIdSubmodule.extendId(configMock, null, {cache: {id: ''}});
172
- expect(window.document.body.appendChild.called).to.not.be.ok;
173
- expect(window.document.body.appendChild.args).to.deep.equal([]);
161
+ expect(loadExternalScript.called).to.not.be.ok;
162
+ expect(loadExternalScript.args).to.deep.equal([]);
174
163
 
175
- appendChildStub.restore();
164
+ loadExternalScript.restore();
176
165
  });
177
166
 
178
167
  describe(`should use the "ids" setting in the config:`, () => {
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  deviceAccessHook,
3
- setEnforcementConfig,
4
- userSyncHook,
5
- userIdHook,
6
- makeBidRequestsHook,
7
- validateRules,
3
+ enableAnalyticsHook,
8
4
  enforcementRules,
5
+ getGvlid,
6
+ internal,
7
+ makeBidRequestsHook,
9
8
  purpose1Rule,
10
9
  purpose2Rule,
11
- enableAnalyticsHook,
12
- getGvlid,
13
- internal
10
+ setEnforcementConfig,
11
+ userIdHook,
12
+ userSyncHook,
13
+ validateRules
14
14
  } from 'modules/gdprEnforcement.js';
15
- import { config } from 'src/config.js';
16
- import adapterManager, { gdprDataHandler } from 'src/adapterManager.js';
15
+ import {config} from 'src/config.js';
16
+ import adapterManager, {gdprDataHandler} from 'src/adapterManager.js';
17
17
  import * as utils from 'src/utils.js';
18
- import { validateStorageEnforcement } from 'src/storageManager.js';
18
+ import {validateStorageEnforcement} from 'src/storageManager.js';
19
19
  import * as events from 'src/events.js';
20
20
 
21
21
  describe('gdpr enforcement', function () {
@@ -98,9 +98,9 @@ describe('gdpr enforcement', function () {
98
98
  };
99
99
 
100
100
  after(function () {
101
- validateStorageEnforcement.getHooks({ hook: deviceAccessHook }).remove();
101
+ validateStorageEnforcement.getHooks({hook: deviceAccessHook}).remove();
102
102
  $$PREBID_GLOBAL$$.requestBids.getHooks().remove();
103
- adapterManager.makeBidRequests.getHooks({ hook: makeBidRequestsHook }).remove();
103
+ adapterManager.makeBidRequests.getHooks({hook: makeBidRequestsHook}).remove();
104
104
  })
105
105
 
106
106
  describe('deviceAccessHook', function () {
@@ -149,7 +149,7 @@ describe('gdpr enforcement', function () {
149
149
  hasEnforcementHook: true,
150
150
  valid: false
151
151
  }
152
- sinon.assert.calledWith(nextFnSpy, undefined, undefined, result);
152
+ sinon.assert.calledWith(nextFnSpy, undefined, undefined, undefined, result);
153
153
  });
154
154
 
155
155
  it('should only check for consent for vendor exceptions when enforcePurpose and enforceVendor are false', function () {
@@ -199,6 +199,53 @@ describe('gdpr enforcement', function () {
199
199
  expect(logWarnSpy.callCount).to.equal(1);
200
200
  });
201
201
 
202
+ it('should allow device access when enforce vendor but module is vendorless ', function () {
203
+ adapterManagerStub.withArgs('pubCommonId').returns(getBidderSpec(1));
204
+ setEnforcementConfig({
205
+ gdpr: {
206
+ rules: [{
207
+ purpose: 'storage',
208
+ enforcePurpose: true,
209
+ enforceVendor: true,
210
+ }]
211
+ }
212
+ });
213
+ let consentData = {}
214
+ consentData.vendorData = staticConfig.consentData.getTCData;
215
+ consentData.gdprApplies = true;
216
+ consentData.apiVersion = 2;
217
+ gdprDataHandlerStub.returns(consentData);
218
+
219
+ deviceAccessHook(nextFnSpy, 1, 'pubCommonId', 'fpid-module');
220
+ expect(logWarnSpy.callCount).to.equal(0);
221
+ });
222
+
223
+ it('should not allow device access if enforce vendor, module is vendorless, but there is no consent for purpose 1', function () {
224
+ adapterManagerStub.withArgs('pubCommonId').returns(getBidderSpec(1));
225
+ setEnforcementConfig({
226
+ gdpr: {
227
+ rules: [{
228
+ purpose: 'storage',
229
+ enforcePurpose: true,
230
+ enforceVendor: true,
231
+ }]
232
+ }
233
+ });
234
+
235
+ let consentData = {}
236
+ // set consent for purpose 1 to false
237
+ const newConsentData = utils.deepClone(staticConfig);
238
+ newConsentData.consentData.getTCData.purpose.consents['1'] = false;
239
+ consentData.vendorData = newConsentData.consentData.getTCData;
240
+ consentData.apiVersion = 2;
241
+ consentData.gdprApplies = true;
242
+
243
+ gdprDataHandlerStub.returns(consentData);
244
+
245
+ deviceAccessHook(nextFnSpy, 1, 'pubCommonId', 'fpid-module');
246
+ expect(logWarnSpy.callCount).to.equal(1);
247
+ });
248
+
202
249
  it('should allow device access when gdprApplies is false and hasDeviceAccess flag is true', function () {
203
250
  adapterManagerStub.withArgs('appnexus').returns(getBidderSpec(1));
204
251
  setEnforcementConfig({
@@ -223,10 +270,10 @@ describe('gdpr enforcement', function () {
223
270
  hasEnforcementHook: true,
224
271
  valid: true
225
272
  }
226
- sinon.assert.calledWith(nextFnSpy, 1, 'appnexus', result);
273
+ sinon.assert.calledWith(nextFnSpy, 1, 'appnexus', undefined, result);
227
274
  });
228
275
 
229
- it('should use gvlMapping set by publisher', function() {
276
+ it('should use gvlMapping set by publisher', function () {
230
277
  config.setConfig({
231
278
  'gvlMapping': {
232
279
  'appnexus': 4
@@ -254,11 +301,11 @@ describe('gdpr enforcement', function () {
254
301
  hasEnforcementHook: true,
255
302
  valid: true
256
303
  }
257
- sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
304
+ sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', undefined, result);
258
305
  config.resetConfig();
259
306
  });
260
307
 
261
- it('should use gvl id of alias and not of parent', function() {
308
+ it('should use gvl id of alias and not of parent', function () {
262
309
  let curBidderStub = sinon.stub(config, 'getCurrentBidder');
263
310
  curBidderStub.returns('appnexus-alias');
264
311
  adapterManager.aliasBidAdapter('appnexus', 'appnexus-alias');
@@ -289,7 +336,7 @@ describe('gdpr enforcement', function () {
289
336
  hasEnforcementHook: true,
290
337
  valid: true
291
338
  }
292
- sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
339
+ sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', undefined, result);
293
340
  config.resetConfig();
294
341
  curBidderStub.restore();
295
342
  });
@@ -470,7 +517,7 @@ describe('gdpr enforcement', function () {
470
517
  const args = nextFnSpy.getCalls()[0].args;
471
518
  expect(args[1].hasValidated).to.be.true;
472
519
  expect(nextFnSpy.calledOnce).to.equal(true);
473
- sinon.assert.calledWith(nextFnSpy, submodules, { ...consentData, hasValidated: true });
520
+ sinon.assert.calledWith(nextFnSpy, submodules, {...consentData, hasValidated: true});
474
521
  });
475
522
 
476
523
  it('should allow userId module if gdpr not in scope', function () {
@@ -524,7 +571,7 @@ describe('gdpr enforcement', function () {
524
571
  name: 'sampleUserId'
525
572
  }
526
573
  }]
527
- sinon.assert.calledWith(nextFnSpy, expectedSubmodules, { ...consentData, hasValidated: true });
574
+ sinon.assert.calledWith(nextFnSpy, expectedSubmodules, {...consentData, hasValidated: true});
528
575
  });
529
576
  });
530
577
 
@@ -583,17 +630,17 @@ describe('gdpr enforcement', function () {
583
630
  gdprDataHandlerStub.returns(consentData);
584
631
  adapterManagerStub.withArgs('bidder_1').returns({
585
632
  getSpec: function () {
586
- return { 'gvlid': 4 }
633
+ return {'gvlid': 4}
587
634
  }
588
635
  });
589
636
  adapterManagerStub.withArgs('bidder_2').returns({
590
637
  getSpec: function () {
591
- return { 'gvlid': 5 }
638
+ return {'gvlid': 5}
592
639
  }
593
640
  });
594
641
  adapterManagerStub.withArgs('bidder_3').returns({
595
642
  getSpec: function () {
596
- return { 'gvlid': undefined }
643
+ return {'gvlid': undefined}
597
644
  }
598
645
  });
599
646
  makeBidRequestsHook(nextFnSpy, MOCK_AD_UNITS, []);
@@ -604,20 +651,20 @@ describe('gdpr enforcement', function () {
604
651
  code: 'ad-unit-1',
605
652
  mediaTypes: {},
606
653
  bids: [
607
- sinon.match({ bidder: 'bidder_1' }),
608
- sinon.match({ bidder: 'bidder_2' })
654
+ sinon.match({bidder: 'bidder_1'}),
655
+ sinon.match({bidder: 'bidder_2'})
609
656
  ]
610
657
  }, {
611
658
  code: 'ad-unit-2',
612
659
  mediaTypes: {},
613
660
  bids: [
614
- sinon.match({ bidder: 'bidder_2' }),
615
- sinon.match({ bidder: 'bidder_3' }) // should be allowed even though it's doesn't have a gvlId because liTransparency is established.
661
+ sinon.match({bidder: 'bidder_2'}),
662
+ sinon.match({bidder: 'bidder_3'}) // should be allowed even though it's doesn't have a gvlId because liTransparency is established.
616
663
  ]
617
664
  }], []);
618
665
  });
619
666
 
620
- it('should block bidder which does not have consent and allow bidder which has consent (liTransparency is NOT established)', function() {
667
+ it('should block bidder which does not have consent and allow bidder which has consent (liTransparency is NOT established)', function () {
621
668
  setEnforcementConfig({
622
669
  gdpr: {
623
670
  rules: [{
@@ -641,17 +688,17 @@ describe('gdpr enforcement', function () {
641
688
  gdprDataHandlerStub.returns(consentData);
642
689
  adapterManagerStub.withArgs('bidder_1').returns({
643
690
  getSpec: function () {
644
- return { 'gvlid': 4 }
691
+ return {'gvlid': 4}
645
692
  }
646
693
  });
647
694
  adapterManagerStub.withArgs('bidder_2').returns({
648
695
  getSpec: function () {
649
- return { 'gvlid': 5 }
696
+ return {'gvlid': 5}
650
697
  }
651
698
  });
652
699
  adapterManagerStub.withArgs('bidder_3').returns({
653
700
  getSpec: function () {
654
- return { 'gvlid': undefined }
701
+ return {'gvlid': undefined}
655
702
  }
656
703
  });
657
704
 
@@ -663,13 +710,13 @@ describe('gdpr enforcement', function () {
663
710
  code: 'ad-unit-1',
664
711
  mediaTypes: {},
665
712
  bids: [
666
- sinon.match({ bidder: 'bidder_1' }), // 'bidder_2' is not present because it doesn't have vendorConsent
713
+ sinon.match({bidder: 'bidder_1'}), // 'bidder_2' is not present because it doesn't have vendorConsent
667
714
  ]
668
715
  }, {
669
716
  code: 'ad-unit-2',
670
717
  mediaTypes: {},
671
718
  bids: [
672
- sinon.match({ bidder: 'bidder_3' }), // 'bidder_3' is allowed despite gvlId being undefined because it's part of vendorExceptions
719
+ sinon.match({bidder: 'bidder_3'}), // 'bidder_3' is allowed despite gvlId being undefined because it's part of vendorExceptions
673
720
  ]
674
721
  }], []);
675
722
 
@@ -727,12 +774,12 @@ describe('gdpr enforcement', function () {
727
774
  nextFnSpy = sandbox.spy();
728
775
  });
729
776
 
730
- afterEach(function() {
777
+ afterEach(function () {
731
778
  config.resetConfig();
732
779
  sandbox.restore();
733
780
  });
734
781
 
735
- it('should block analytics adapter which does not have consent and allow the one(s) which have consent', function() {
782
+ it('should block analytics adapter which does not have consent and allow the one(s) which have consent', function () {
736
783
  setEnforcementConfig({
737
784
  gdpr: {
738
785
  rules: [{
@@ -750,9 +797,9 @@ describe('gdpr enforcement', function () {
750
797
  consentData.gdprApplies = true;
751
798
 
752
799
  gdprDataHandlerStub.returns(consentData);
753
- adapterManagerStub.withArgs('analyticsAdapter_A').returns({ gvlid: 3 });
754
- adapterManagerStub.withArgs('analyticsAdapter_B').returns({ gvlid: 5 });
755
- adapterManagerStub.withArgs('analyticsAdapter_C').returns({ gvlid: 1 });
800
+ adapterManagerStub.withArgs('analyticsAdapter_A').returns({gvlid: 3});
801
+ adapterManagerStub.withArgs('analyticsAdapter_B').returns({gvlid: 5});
802
+ adapterManagerStub.withArgs('analyticsAdapter_C').returns({gvlid: 1});
756
803
 
757
804
  enableAnalyticsHook(nextFnSpy, MOCK_ANALYTICS_ADAPTER_CONFIG);
758
805
 
@@ -1025,7 +1072,7 @@ describe('gdpr enforcement', function () {
1025
1072
  expect(purpose2Rule).to.deep.equal(purpose2RuleDefinedInConfig);
1026
1073
  });
1027
1074
 
1028
- it('should use the "rules" defined in config if a definition found', function() {
1075
+ it('should use the "rules" defined in config if a definition found', function () {
1029
1076
  const rules = [{
1030
1077
  purpose: 'storage',
1031
1078
  enforcePurpose: false,
@@ -1035,23 +1082,23 @@ describe('gdpr enforcement', function () {
1035
1082
  enforcePurpose: false,
1036
1083
  enforceVendor: false
1037
1084
  }]
1038
- setEnforcementConfig({gdpr: { rules }});
1085
+ setEnforcementConfig({gdpr: {rules}});
1039
1086
 
1040
1087
  expect(enforcementRules).to.deep.equal(rules);
1041
1088
  });
1042
1089
  });
1043
1090
 
1044
- describe('TCF2FinalResults', function() {
1091
+ describe('TCF2FinalResults', function () {
1045
1092
  let sandbox;
1046
- beforeEach(function() {
1093
+ beforeEach(function () {
1047
1094
  sandbox = sinon.createSandbox();
1048
1095
  sandbox.spy(events, 'emit');
1049
1096
  });
1050
- afterEach(function() {
1097
+ afterEach(function () {
1051
1098
  config.resetConfig();
1052
1099
  sandbox.restore();
1053
1100
  });
1054
- it('should emit TCF2 enforcement data on auction end', function() {
1101
+ it('should emit TCF2 enforcement data on auction end', function () {
1055
1102
  const rules = [{
1056
1103
  purpose: 'storage',
1057
1104
  enforcePurpose: false,
@@ -1061,7 +1108,7 @@ describe('gdpr enforcement', function () {
1061
1108
  enforcePurpose: false,
1062
1109
  enforceVendor: false
1063
1110
  }]
1064
- setEnforcementConfig({gdpr: { rules }});
1111
+ setEnforcementConfig({gdpr: {rules}});
1065
1112
 
1066
1113
  events.emit('auctionEnd', {})
1067
1114
 
@@ -1070,28 +1117,28 @@ describe('gdpr enforcement', function () {
1070
1117
  })
1071
1118
  });
1072
1119
 
1073
- describe('getGvlid', function() {
1120
+ describe('getGvlid', function () {
1074
1121
  let sandbox;
1075
1122
  let getGvlidForBidAdapterStub;
1076
1123
  let getGvlidForUserIdModuleStub;
1077
1124
  let getGvlidForAnalyticsAdapterStub;
1078
- beforeEach(function() {
1125
+ beforeEach(function () {
1079
1126
  sandbox = sinon.createSandbox();
1080
1127
  getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
1081
1128
  getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
1082
1129
  getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
1083
1130
  });
1084
- afterEach(function() {
1131
+ afterEach(function () {
1085
1132
  sandbox.restore();
1086
1133
  config.resetConfig();
1087
1134
  });
1088
1135
 
1089
- it('should return "null" if called without passing any argument', function() {
1136
+ it('should return "null" if called without passing any argument', function () {
1090
1137
  const gvlid = getGvlid();
1091
1138
  expect(gvlid).to.equal(null);
1092
1139
  });
1093
1140
 
1094
- it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function() {
1141
+ it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function () {
1095
1142
  getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1096
1143
  getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1097
1144
  getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(null);
@@ -1100,7 +1147,7 @@ describe('gdpr enforcement', function () {
1100
1147
  expect(gvlid).to.equal(null);
1101
1148
  });
1102
1149
 
1103
- it('should return the GVL ID from gvlMapping if it is defined in setConfig', function() {
1150
+ it('should return the GVL ID from gvlMapping if it is defined in setConfig', function () {
1104
1151
  config.setConfig({
1105
1152
  gvlMapping: {
1106
1153
  moduleA: 1
@@ -1114,7 +1161,7 @@ describe('gdpr enforcement', function () {
1114
1161
  expect(gvlid).to.equal(1);
1115
1162
  });
1116
1163
 
1117
- it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function() {
1164
+ it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function () {
1118
1165
  getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1119
1166
  getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1120
1167
  getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(7);