prebid.js 6.3.0 → 6.7.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 (157) hide show
  1. package/.circleci/config.yml +1 -1
  2. package/gulpfile.js +87 -74
  3. package/integrationExamples/gpt/amp/creative.html +11 -33
  4. package/karma.conf.maker.js +1 -1
  5. package/modules/.submodules.json +2 -1
  6. package/modules/adbookpspBidAdapter.js +27 -10
  7. package/modules/adhashBidAdapter.js +3 -3
  8. package/modules/adkernelBidAdapter.js +148 -62
  9. package/modules/adlooxAdServerVideo.js +2 -2
  10. package/modules/adlooxAnalyticsAdapter.js +4 -4
  11. package/modules/admanBidAdapter.js +10 -4
  12. package/modules/adomikAnalyticsAdapter.js +27 -9
  13. package/modules/adqueryIdSystem.js +103 -0
  14. package/modules/adqueryIdSystem.md +35 -0
  15. package/modules/adyoulikeBidAdapter.js +13 -9
  16. package/modules/aniviewBidAdapter.js +1 -1
  17. package/modules/beopBidAdapter.js +1 -1
  18. package/modules/bidViewability.js +3 -3
  19. package/modules/bidViewabilityIO.js +3 -3
  20. package/modules/bliinkBidAdapter.js +3 -2
  21. package/modules/colossussspBidAdapter.js +12 -8
  22. package/modules/colossussspBidAdapter.md +15 -1
  23. package/modules/compassBidAdapter.js +208 -0
  24. package/modules/compassBidAdapter.md +79 -0
  25. package/modules/consentManagement.js +7 -1
  26. package/modules/consumableBidAdapter.md +1 -1
  27. package/modules/criteoBidAdapter.js +1 -1
  28. package/modules/criteoIdSystem.js +29 -7
  29. package/modules/currency.js +2 -2
  30. package/modules/dailyhuntBidAdapter.js +435 -0
  31. package/modules/dailyhuntBidAdapter.md +4 -0
  32. package/modules/docereeBidAdapter.js +10 -1
  33. package/modules/docereeBidAdapter.md +2 -0
  34. package/modules/engageyaBidAdapter.js +1 -1
  35. package/modules/feedadBidAdapter.js +2 -2
  36. package/modules/feedadBidAdapter.md +4 -2
  37. package/modules/glimpseBidAdapter.js +66 -44
  38. package/modules/gnetBidAdapter.js +3 -3
  39. package/modules/gnetBidAdapter.md +4 -4
  40. package/modules/gptPreAuction.js +55 -7
  41. package/modules/gridBidAdapter.js +4 -3
  42. package/modules/gumgumBidAdapter.js +4 -4
  43. package/modules/idImportLibrary.js +45 -8
  44. package/modules/idImportLibrary.md +4 -0
  45. package/modules/improvedigitalBidAdapter.js +42 -4
  46. package/modules/instreamTracking.js +4 -4
  47. package/modules/invibesBidAdapter.js +49 -5
  48. package/modules/invibesBidAdapter.md +2 -1
  49. package/modules/ixBidAdapter.js +53 -18
  50. package/modules/jwplayerRtdProvider.js +71 -6
  51. package/modules/jwplayerRtdProvider.md +27 -11
  52. package/modules/kargoBidAdapter.js +2 -2
  53. package/modules/limelightDigitalBidAdapter.js +2 -1
  54. package/modules/livewrappedAnalyticsAdapter.js +3 -1
  55. package/modules/livewrappedBidAdapter.js +8 -2
  56. package/modules/loglyliftBidAdapter.js +79 -0
  57. package/modules/loglyliftBidAdapter.md +55 -0
  58. package/modules/nextMillenniumBidAdapter.js +11 -7
  59. package/modules/oguryBidAdapter.js +9 -2
  60. package/modules/onetagBidAdapter.js +4 -2
  61. package/modules/optimeraRtdProvider.js +8 -1
  62. package/modules/ozoneBidAdapter.js +21 -64
  63. package/modules/pilotxBidAdapter.js +147 -0
  64. package/modules/pilotxBidAdapter.md +50 -0
  65. package/modules/proxistoreBidAdapter.js +0 -2
  66. package/modules/pubgeniusBidAdapter.js +1 -1
  67. package/modules/pubmaticAnalyticsAdapter.js +16 -0
  68. package/modules/pubxaiAnalyticsAdapter.js +17 -0
  69. package/modules/richaudienceBidAdapter.js +3 -2
  70. package/modules/riseBidAdapter.js +1 -1
  71. package/modules/rtbhouseBidAdapter.js +14 -4
  72. package/modules/rtdModule/index.js +14 -15
  73. package/modules/rubiconAnalyticsAdapter.js +3 -2
  74. package/modules/rubiconBidAdapter.js +21 -11
  75. package/modules/seedingAllianceBidAdapter.js +3 -3
  76. package/modules/sharethroughBidAdapter.js +12 -17
  77. package/modules/showheroes-bsBidAdapter.js +13 -2
  78. package/modules/synacormediaBidAdapter.js +31 -10
  79. package/modules/tappxBidAdapter.js +8 -5
  80. package/modules/teadsBidAdapter.js +1 -2
  81. package/modules/telariaBidAdapter.js +2 -2
  82. package/modules/trustxBidAdapter.js +8 -16
  83. package/modules/userId/eids.js +7 -1
  84. package/modules/userId/userId.md +8 -0
  85. package/modules/viewability.js +177 -0
  86. package/modules/viewability.md +87 -0
  87. package/modules/welectBidAdapter.js +106 -0
  88. package/modules/yieldmoBidAdapter.js +23 -5
  89. package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
  90. package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
  91. package/package.json +1 -1
  92. package/src/auction.js +2 -2
  93. package/src/config.js +27 -3
  94. package/src/hook.js +5 -1
  95. package/src/prebid.js +20 -4
  96. package/src/secureCreatives.js +3 -2
  97. package/src/utils.js +12 -1
  98. package/test/helpers/prebidGlobal.js +1 -0
  99. package/test/spec/config_spec.js +279 -0
  100. package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
  101. package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
  102. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  103. package/test/spec/modules/admanBidAdapter_spec.js +2 -2
  104. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
  105. package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
  106. package/test/spec/modules/adyoulikeBidAdapter_spec.js +49 -0
  107. package/test/spec/modules/beopBidAdapter_spec.js +1 -1
  108. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  109. package/test/spec/modules/bidViewability_spec.js +4 -4
  110. package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
  111. package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
  112. package/test/spec/modules/compassBidAdapter_spec.js +398 -0
  113. package/test/spec/modules/consentManagement_spec.js +20 -0
  114. package/test/spec/modules/criteoIdSystem_spec.js +6 -3
  115. package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
  116. package/test/spec/modules/docereeBidAdapter_spec.js +9 -1
  117. package/test/spec/modules/eids_spec.js +15 -0
  118. package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
  119. package/test/spec/modules/glimpseBidAdapter_spec.js +0 -18
  120. package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
  121. package/test/spec/modules/gptPreAuction_spec.js +177 -2
  122. package/test/spec/modules/idImportLibrary_spec.js +197 -10
  123. package/test/spec/modules/improvedigitalBidAdapter_spec.js +45 -1
  124. package/test/spec/modules/invibesBidAdapter_spec.js +119 -0
  125. package/test/spec/modules/ixBidAdapter_spec.js +112 -62
  126. package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
  127. package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
  128. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +75 -17
  129. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +22 -0
  130. package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
  131. package/test/spec/modules/loglyliftBidAdapter_spec.js +172 -0
  132. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +9 -2
  133. package/test/spec/modules/oguryBidAdapter_spec.js +10 -2
  134. package/test/spec/modules/optimeraRtdProvider_spec.js +14 -1
  135. package/test/spec/modules/ozoneBidAdapter_spec.js +43 -31
  136. package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
  137. package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
  138. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
  139. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
  140. package/test/spec/modules/realTimeDataModule_spec.js +67 -5
  141. package/test/spec/modules/richaudienceBidAdapter_spec.js +40 -0
  142. package/test/spec/modules/riseBidAdapter_spec.js +1 -1
  143. package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
  144. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +30 -0
  145. package/test/spec/modules/rubiconBidAdapter_spec.js +48 -9
  146. package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
  147. package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
  148. package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
  149. package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
  150. package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
  151. package/test/spec/modules/userId_spec.js +68 -19
  152. package/test/spec/modules/viewability_spec.js +280 -0
  153. package/test/spec/modules/welectBidAdapter_spec.js +211 -0
  154. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
  155. package/test/spec/unit/pbjs_api_spec.js +3 -1
  156. package/test/test_deps.js +3 -0
  157. package/test/test_index.js +1 -3
package/src/prebid.js CHANGED
@@ -402,10 +402,23 @@ function emitAdRenderSucceeded({ doc, bid, id }) {
402
402
  events.emit(AD_RENDER_SUCCEEDED, data);
403
403
  }
404
404
 
405
+ /**
406
+ * This function will check for presence of given node in given parent. If not present - will inject it.
407
+ * @param {Node} node node, whose existance is in question
408
+ * @param {Document} doc document element do look in
409
+ * @param {string} tagName tag name to look in
410
+ */
411
+ function reinjectNodeIfRemoved(node, doc, tagName) {
412
+ const injectionNode = doc.querySelector(tagName);
413
+ if (!node.parentNode || node.parentNode !== injectionNode) {
414
+ insertElement(node, doc, tagName);
415
+ }
416
+ }
417
+
405
418
  /**
406
419
  * This function will render the ad (based on params) in the given iframe document passed through.
407
420
  * Note that doc SHOULD NOT be the parent document page as we can't doc.write() asynchronously
408
- * @param {HTMLDocument} doc document
421
+ * @param {Document} doc document
409
422
  * @param {string} id bid id to locate the ad
410
423
  * @alias module:pbjs.renderAd
411
424
  */
@@ -449,10 +462,11 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
449
462
  const {height, width, ad, mediaType, adUrl, renderer} = bid;
450
463
 
451
464
  const creativeComment = document.createComment(`Creative ${bid.creativeId} served by ${bid.bidder} Prebid.js Header Bidding`);
465
+ insertElement(creativeComment, doc, 'html');
452
466
 
453
467
  if (isRendererRequired(renderer)) {
454
468
  executeRenderer(renderer, bid);
455
- insertElement(creativeComment, doc, 'html');
469
+ reinjectNodeIfRemoved(creativeComment, doc, 'html');
456
470
  emitAdRenderSucceeded({ doc, bid, id });
457
471
  } else if ((doc === document && !inIframe()) || mediaType === 'video') {
458
472
  const message = `Error trying to write ad. Ad render call ad id ${id} was prevented from writing to the main document.`;
@@ -471,7 +485,7 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
471
485
  doc.write(ad);
472
486
  doc.close();
473
487
  setRenderSize(doc, width, height);
474
- insertElement(creativeComment, doc, 'html');
488
+ reinjectNodeIfRemoved(creativeComment, doc, 'html');
475
489
  callBurl(bid);
476
490
  emitAdRenderSucceeded({ doc, bid, id });
477
491
  } else if (adUrl) {
@@ -484,7 +498,7 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
484
498
 
485
499
  insertElement(iframe, doc, 'body');
486
500
  setRenderSize(doc, width, height);
487
- insertElement(creativeComment, doc, 'html');
501
+ reinjectNodeIfRemoved(creativeComment, doc, 'html');
488
502
  callBurl(bid);
489
503
  emitAdRenderSucceeded({ doc, bid, id });
490
504
  } else {
@@ -901,6 +915,8 @@ $$PREBID_GLOBAL$$.markWinningBidAsUsed = function (markBidRequest) {
901
915
  */
902
916
  $$PREBID_GLOBAL$$.getConfig = config.getConfig;
903
917
  $$PREBID_GLOBAL$$.readConfig = config.readConfig;
918
+ $$PREBID_GLOBAL$$.mergeConfig = config.mergeConfig;
919
+ $$PREBID_GLOBAL$$.mergeBidderConfig = config.mergeBidderConfig;
904
920
 
905
921
  /**
906
922
  * Set Prebid config options.
@@ -127,11 +127,12 @@ function resizeRemoteCreative({ adId, adUnitCode, width, height }) {
127
127
  }
128
128
 
129
129
  function getDfpElementId(adId) {
130
- return find(window.googletag.pubads().getSlots(), slot => {
130
+ const slot = find(window.googletag.pubads().getSlots(), slot => {
131
131
  return find(slot.getTargetingKeys(), key => {
132
132
  return includes(slot.getTargeting(key), adId);
133
133
  });
134
- }).getSlotElementId();
134
+ });
135
+ return slot ? slot.getSlotElementId() : null;
135
136
  }
136
137
 
137
138
  function getAstElementId(adUnitCode) {
package/src/utils.js CHANGED
@@ -1272,7 +1272,18 @@ export function mergeDeep(target, ...sources) {
1272
1272
  if (!target[key]) {
1273
1273
  Object.assign(target, { [key]: source[key] });
1274
1274
  } else if (isArray(target[key])) {
1275
- target[key] = target[key].concat(source[key]);
1275
+ source[key].forEach(obj => {
1276
+ let addItFlag = 1;
1277
+ for (let i = 0; i < target[key].length; i++) {
1278
+ if (deepEqual(target[key][i], obj)) {
1279
+ addItFlag = 0;
1280
+ break;
1281
+ }
1282
+ }
1283
+ if (addItFlag) {
1284
+ target[key].push(obj);
1285
+ }
1286
+ });
1276
1287
  }
1277
1288
  } else {
1278
1289
  Object.assign(target, { [key]: source[key] });
@@ -1,3 +1,4 @@
1
1
  window.$$PREBID_GLOBAL$$ = (window.$$PREBID_GLOBAL$$ || {});
2
+ window.$$PREBID_GLOBAL$$.installedModules = (window.$$PREBID_GLOBAL$$.installedModules || []);
2
3
  window.$$PREBID_GLOBAL$$.cmd = window.$$PREBID_GLOBAL$$.cmd || [];
3
4
  window.$$PREBID_GLOBAL$$.que = window.$$PREBID_GLOBAL$$.que || [];
@@ -7,8 +7,10 @@ const utils = require('src/utils');
7
7
  let getConfig;
8
8
  let setConfig;
9
9
  let readConfig;
10
+ let mergeConfig;
10
11
  let getBidderConfig;
11
12
  let setBidderConfig;
13
+ let mergeBidderConfig;
12
14
  let setDefaults;
13
15
 
14
16
  describe('config API', function () {
@@ -19,8 +21,10 @@ describe('config API', function () {
19
21
  getConfig = config.getConfig;
20
22
  setConfig = config.setConfig;
21
23
  readConfig = config.readConfig;
24
+ mergeConfig = config.mergeConfig;
22
25
  getBidderConfig = config.getBidderConfig;
23
26
  setBidderConfig = config.setBidderConfig;
27
+ mergeBidderConfig = config.mergeBidderConfig;
24
28
  setDefaults = config.setDefaults;
25
29
  logErrorSpy = sinon.spy(utils, 'logError');
26
30
  logWarnSpy = sinon.spy(utils, 'logWarn');
@@ -345,4 +349,279 @@ describe('config API', function () {
345
349
  const warning = 'Auction Options given an incorrect param: testing';
346
350
  assert.ok(logWarnSpy.calledWith(warning), 'expected warning was logged');
347
351
  });
352
+
353
+ it('should merge input with existing global config', function () {
354
+ const obj = {
355
+ ortb2: {
356
+ site: {
357
+ name: 'example',
358
+ domain: 'page.example.com',
359
+ cat: ['IAB2'],
360
+ sectioncat: ['IAB2-2'],
361
+ pagecat: ['IAB2-2']
362
+ }
363
+ }
364
+ };
365
+ setConfig({ ortb2: {
366
+ user: {
367
+ ext: {
368
+ data: {
369
+ registered: true,
370
+ interests: ['cars']
371
+ }
372
+ }
373
+ }
374
+ }
375
+ });
376
+ mergeConfig(obj);
377
+ const expected = {
378
+ site: {
379
+ name: 'example',
380
+ domain: 'page.example.com',
381
+ cat: ['IAB2'],
382
+ sectioncat: ['IAB2-2'],
383
+ pagecat: ['IAB2-2']
384
+ },
385
+ user: {
386
+ ext: {
387
+ data: {
388
+ registered: true,
389
+ interests: ['cars']
390
+ }
391
+ }
392
+ }
393
+ }
394
+ expect(getConfig('ortb2')).to.deep.equal(expected);
395
+ });
396
+
397
+ it('input should take precedence over existing config if keys are the same', function() {
398
+ const input = {
399
+ ortb2: {
400
+ user: {
401
+ ext: {
402
+ data: {
403
+ registered: true,
404
+ interests: ['cars']
405
+ }
406
+ }
407
+ }
408
+ }
409
+ }
410
+ setConfig({ ortb2: {
411
+ user: {
412
+ ext: {
413
+ data: {
414
+ registered: false
415
+ }
416
+ }
417
+ }
418
+ }});
419
+ mergeConfig(input);
420
+ const expected = {
421
+ user: {
422
+ ext: {
423
+ data: {
424
+ registered: true,
425
+ interests: ['cars']
426
+ }
427
+ }
428
+ }
429
+ }
430
+ expect(getConfig('ortb2')).to.deep.equal(expected);
431
+ });
432
+
433
+ it('should log error for a non-object value passed in', function () {
434
+ mergeConfig('invalid object');
435
+ expect(logErrorSpy.calledOnce).to.equal(true);
436
+ const error = 'mergeConfig input must be an object';
437
+ assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
438
+ });
439
+
440
+ it('should merge input with existing bidder config', function () {
441
+ const input = {
442
+ bidders: ['rubicon', 'appnexus'],
443
+ config: {
444
+ ortb2: {
445
+ site: {
446
+ name: 'example',
447
+ domain: 'page.example.com',
448
+ cat: ['IAB2'],
449
+ sectioncat: ['IAB2-2'],
450
+ pagecat: ['IAB2-2']
451
+ },
452
+ user: {
453
+ ext: {
454
+ ssp: 'magnite',
455
+ data: {
456
+ registered: false,
457
+ interests: ['sports']
458
+ }
459
+ }
460
+ }
461
+ }
462
+ }
463
+ };
464
+ setBidderConfig({
465
+ bidders: ['rubicon'],
466
+ config: {
467
+ ortb2: {
468
+ user: {
469
+ ext: {
470
+ data: {
471
+ registered: true,
472
+ interests: ['cars']
473
+ }
474
+ }
475
+ }
476
+ }
477
+ }
478
+ });
479
+ mergeBidderConfig(input);
480
+ const expected = {
481
+ rubicon: {
482
+ ortb2: {
483
+ site: {
484
+ name: 'example',
485
+ domain: 'page.example.com',
486
+ cat: ['IAB2'],
487
+ sectioncat: ['IAB2-2'],
488
+ pagecat: ['IAB2-2']
489
+ },
490
+ user: {
491
+ ext: {
492
+ ssp: 'magnite',
493
+ data: {
494
+ registered: false,
495
+ interests: ['cars', 'sports']
496
+ }
497
+ }
498
+ }
499
+ }
500
+ },
501
+ appnexus: {
502
+ ortb2: {
503
+ site: {
504
+ name: 'example',
505
+ domain: 'page.example.com',
506
+ cat: ['IAB2'],
507
+ sectioncat: ['IAB2-2'],
508
+ pagecat: ['IAB2-2']
509
+ },
510
+ user: {
511
+ ext: {
512
+ ssp: 'magnite',
513
+ data: {
514
+ registered: false,
515
+ interests: ['sports']
516
+ }
517
+ }
518
+ }
519
+ }
520
+ }
521
+ }
522
+ expect(getBidderConfig()).to.deep.equal(expected);
523
+ });
524
+
525
+ it('should log error for a non-object value passed in', function () {
526
+ mergeBidderConfig('invalid object');
527
+ expect(logErrorSpy.calledOnce).to.equal(true);
528
+ const error = 'setBidderConfig bidder options must be an object';
529
+ assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
530
+ });
531
+
532
+ it('should log error for empty bidders array', function () {
533
+ mergeBidderConfig({
534
+ bidders: [],
535
+ config: {
536
+ ortb2: {
537
+ site: {
538
+ name: 'example',
539
+ domain: 'page.example.com',
540
+ cat: ['IAB2'],
541
+ sectioncat: ['IAB2-2'],
542
+ pagecat: ['IAB2-2']
543
+ }
544
+ }
545
+ }
546
+ });
547
+ expect(logErrorSpy.calledOnce).to.equal(true);
548
+ const error = 'setBidderConfig bidder options must contain a bidders list with at least 1 bidder';
549
+ assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
550
+ });
551
+
552
+ it('should log error for nonexistent config object', function () {
553
+ mergeBidderConfig({
554
+ bidders: ['appnexus']
555
+ });
556
+ expect(logErrorSpy.calledOnce).to.equal(true);
557
+ const error = 'setBidderConfig bidder options must contain a config object';
558
+ assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
559
+ });
560
+
561
+ it('should merge without array duplication', function() {
562
+ const userObj1 = {
563
+ name: 'www.dataprovider1.com',
564
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
565
+ segment: [{
566
+ id: '1776'
567
+ }]
568
+ };
569
+
570
+ const userObj2 = {
571
+ name: 'www.dataprovider2.com',
572
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
573
+ segment: [{
574
+ id: '1914'
575
+ }]
576
+ };
577
+
578
+ const siteObj1 = {
579
+ name: 'www.dataprovider3.com',
580
+ ext: {
581
+ taxonomyname: 'iab_audience_taxonomy'
582
+ },
583
+ segment: [
584
+ {
585
+ id: '1812'
586
+ },
587
+ {
588
+ id: '1955'
589
+ }
590
+ ]
591
+ }
592
+
593
+ setConfig({
594
+ ortb2: {
595
+ user: {
596
+ data: [userObj1, userObj2]
597
+ },
598
+ site: {
599
+ content: {
600
+ data: [siteObj1]
601
+ }
602
+ }
603
+ }
604
+ });
605
+
606
+ const rtd = {
607
+ ortb2: {
608
+ user: {
609
+ data: [userObj1]
610
+ },
611
+ site: {
612
+ content: {
613
+ data: [siteObj1]
614
+ }
615
+ }
616
+ }
617
+ };
618
+ mergeConfig(rtd);
619
+
620
+ let ortb2Config = getConfig('ortb2');
621
+
622
+ expect(ortb2Config.user.data).to.deep.include.members([userObj1, userObj2]);
623
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]);
624
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
625
+ expect(ortb2Config.site.content.data).to.have.lengthOf(1);
626
+ });
348
627
  });
@@ -504,9 +504,11 @@ describe('adbookpsp bid adapter', () => {
504
504
  ad: '<div>ad</div>',
505
505
  adId: '5',
506
506
  adserverTargeting: {
507
+ hb_ad_ord_adbookpsp: '0_0', // the value to the left of the underscore represents the index of the ad id and the number to the right represents the order index
507
508
  hb_adid_c_adbookpsp: '5',
508
509
  hb_deal_adbookpsp: 'werwetwerw',
509
510
  hb_liid_adbookpsp: '2342345',
511
+ hb_ordid_adbookpsp: '567843',
510
512
  },
511
513
  referrer: 'http://prebid-test-page.io:8080/banner.html',
512
514
  lineItemId: '2342345',
@@ -516,9 +518,11 @@ describe('adbookpsp bid adapter', () => {
516
518
  adId: '10',
517
519
  adUnitCode: 'div-gpt-ad-837465923534-0',
518
520
  adserverTargeting: {
521
+ hb_ad_ord_adbookpsp: '0_0',
519
522
  hb_adid_c_adbookpsp: '10',
520
523
  hb_deal_adbookpsp: 'dsfxcxcvxc',
521
524
  hb_liid_adbookpsp: '2121221',
525
+ hb_ordid_adbookpsp: '5678234',
522
526
  },
523
527
  bidId: 'bid4321',
524
528
  bidderRequestId: '999ccceeee11',
@@ -556,14 +560,18 @@ describe('adbookpsp bid adapter', () => {
556
560
 
557
561
  expect(bids).to.have.length(2);
558
562
  expect(bids[0].adserverTargeting).to.deep.equal({
563
+ hb_ad_ord_adbookpsp: '0_0',
564
+ hb_adid_c_adbookpsp: '5',
559
565
  hb_deal_adbookpsp: 'werwetwerw',
560
566
  hb_liid_adbookpsp: '2342345',
561
- hb_adid_c_adbookpsp: '5',
567
+ hb_ordid_adbookpsp: '567843',
562
568
  });
563
569
  expect(bids[1].adserverTargeting).to.deep.equal({
570
+ hb_ad_ord_adbookpsp: '0_0',
571
+ hb_adid_c_adbookpsp: '10',
564
572
  hb_deal_adbookpsp: 'dsfxcxcvxc',
565
573
  hb_liid_adbookpsp: '2121221',
566
- hb_adid_c_adbookpsp: '10',
574
+ hb_ordid_adbookpsp: '5678234',
567
575
  });
568
576
  });
569
577
 
@@ -580,9 +588,11 @@ describe('adbookpsp bid adapter', () => {
580
588
  expect(bids).to.have.length(2);
581
589
  for (const bid of bids) {
582
590
  expect(bid.adserverTargeting).to.deep.equal({
591
+ hb_ad_ord_adbookpsp: '0_0,1_0',
592
+ hb_adid_c_adbookpsp: '5,10',
583
593
  hb_deal_adbookpsp: 'werwetwerw,dsfxcxcvxc',
584
594
  hb_liid_adbookpsp: '2342345,2121221',
585
- hb_adid_c_adbookpsp: '5,10',
595
+ hb_ordid_adbookpsp: '567843,5678234',
586
596
  });
587
597
  }
588
598
  });
@@ -670,9 +680,11 @@ describe('adbookpsp bid adapter', () => {
670
680
  );
671
681
 
672
682
  expect(bids[0].adserverTargeting).to.deep.equal({
683
+ hb_ad_ord_adbookpsp: '0_0',
673
684
  hb_adid_c_adbookpsp: '10',
674
685
  hb_deal_adbookpsp: 'dsfxcxcvxc',
675
686
  hb_liid_adbookpsp: '2121221',
687
+ hb_ordid_adbookpsp: '5678234',
676
688
  });
677
689
  });
678
690
 
@@ -1279,6 +1291,7 @@ const exchangeResponse = {
1279
1291
  nurl: 'http://win.example.url',
1280
1292
  ext: {
1281
1293
  liid: '2342345',
1294
+ ordid: '567843',
1282
1295
  },
1283
1296
  cat: ['IAB2-1', 'IAB2-2', 'IAB2-3'],
1284
1297
  adomain: ['advertiser.com'],
@@ -1301,6 +1314,7 @@ const exchangeResponse = {
1301
1314
  nurl: 'http://win.example.url',
1302
1315
  ext: {
1303
1316
  liid: '2121221',
1317
+ ordid: '5678234',
1304
1318
  },
1305
1319
  cat: ['IAB2-3'],
1306
1320
  adomain: ['advertiser.com', 'campaign.advertiser.com'],
@@ -77,7 +77,7 @@ describe('adhashBidAdapter', function () {
77
77
  );
78
78
  expect(result.length).to.equal(1);
79
79
  expect(result[0].method).to.equal('POST');
80
- expect(result[0].url).to.equal('https://bidder.adhash.org/rtb?version=1.0&prebid=true');
80
+ expect(result[0].url).to.equal('https://bidder.adhash.com/rtb?version=1.0&prebid=true&publisher=0xc3b09b27e9c6ef73957901aa729b9e69e5bbfbfb');
81
81
  expect(result[0].bidRequest).to.equal(bidRequest);
82
82
  expect(result[0].data).to.have.property('timezone');
83
83
  expect(result[0].data).to.have.property('location');
@@ -93,7 +93,7 @@ describe('adhashBidAdapter', function () {
93
93
  const result = spec.buildRequests([ bidRequest ], { gdprConsent: true });
94
94
  expect(result.length).to.equal(1);
95
95
  expect(result[0].method).to.equal('POST');
96
- expect(result[0].url).to.equal('https://bidder.adhash.org/rtb?version=1.0&prebid=true');
96
+ expect(result[0].url).to.equal('https://bidder.adhash.com/rtb?version=1.0&prebid=true&publisher=0xc3b09b27e9c6ef73957901aa729b9e69e5bbfbfb');
97
97
  expect(result[0].bidRequest).to.equal(bidRequest);
98
98
  expect(result[0].data).to.have.property('timezone');
99
99
  expect(result[0].data).to.have.property('location');
@@ -3,7 +3,7 @@ import analyticsAdapter, { command as analyticsCommand, COMMAND } from 'modules/
3
3
  import { AUCTION_COMPLETED } from 'src/auction.js';
4
4
  import { expect } from 'chai';
5
5
  import events from 'src/events.js';
6
- import { EVENTS } from 'src/constants.json';
6
+ import CONSTANTS from 'src/constants.json';
7
7
  import * as utils from 'src/utils.js';
8
8
  import { loadExternalScriptStub } from 'test/mocks/adloaderStub.js';
9
9
 
@@ -143,10 +143,10 @@ describe('Adloox Analytics Adapter', function () {
143
143
  return arg.tagName === 'LINK' && arg.getAttribute('rel') === 'preload' && arg.getAttribute('as') === 'script' && href_uri.href === uri.href;
144
144
  };
145
145
 
146
- events.emit(EVENTS.AUCTION_END, auctionDetails);
146
+ events.emit(CONSTANTS.EVENTS.AUCTION_END, auctionDetails);
147
147
  expect(insertElementStub.calledWith(sinon.match(isLinkPreloadAsScript))).to.true;
148
148
 
149
- events.emit(EVENTS.AUCTION_END, auctionDetails);
149
+ events.emit(CONSTANTS.EVENTS.AUCTION_END, auctionDetails);
150
150
  expect(insertElementStub.callCount).to.equal(1);
151
151
 
152
152
  done();
@@ -167,7 +167,7 @@ describe('Adloox Analytics Adapter', function () {
167
167
  const querySelectorStub = sandbox.stub(document, 'querySelector');
168
168
  querySelectorStub.withArgs(`#${bid.adUnitCode}`).returns(slot);
169
169
 
170
- events.emit(EVENTS.BID_WON, bid);
170
+ events.emit(CONSTANTS.EVENTS.BID_WON, bid);
171
171
 
172
172
  const [urlInserted, moduleCode] = loadExternalScriptStub.getCall(0).args;
173
173
 
@@ -196,7 +196,7 @@ describe('Adloox Analytics Adapter', function () {
196
196
  const querySelectorStub = sandbox.stub(document, 'querySelector');
197
197
  querySelectorStub.withArgs(`#${bid.adUnitCode}`).returns(slot);
198
198
 
199
- events.emit(EVENTS.BID_WON, bidIgnore);
199
+ events.emit(CONSTANTS.EVENTS.BID_WON, bidIgnore);
200
200
 
201
201
  expect(parent.querySelector('script')).is.null;
202
202
 
@@ -238,7 +238,7 @@ describe('Adloox Analytics Adapter', function () {
238
238
 
239
239
  it('should inject tracking event', function (done) {
240
240
  const data = {
241
- eventType: EVENTS.BID_WON,
241
+ eventType: CONSTANTS.EVENTS.BID_WON,
242
242
  args: bid
243
243
  };
244
244
 
@@ -175,13 +175,13 @@ describe('AdmanAdapter', function () {
175
175
  });
176
176
 
177
177
  describe('getUserSyncs', function () {
178
- let userSync = spec.getUserSyncs();
178
+ let userSync = spec.getUserSyncs({});
179
179
  it('Returns valid URL and type', function () {
180
180
  expect(userSync).to.be.an('array').with.lengthOf(1);
181
181
  expect(userSync[0].type).to.exist;
182
182
  expect(userSync[0].url).to.exist;
183
183
  expect(userSync[0].type).to.be.equal('image');
184
- expect(userSync[0].url).to.be.equal('https://pub.admanmedia.com/?c=o&m=sync');
184
+ expect(userSync[0].url).to.be.equal('https://pub.admanmedia.com/image?pbjs=1&coppa=0');
185
185
  });
186
186
  });
187
187
  });
@@ -1,5 +1,5 @@
1
1
  import adomikAnalytics from 'modules/adomikAnalyticsAdapter.js';
2
- import {expect} from 'chai';
2
+ import { expect } from 'chai';
3
3
 
4
4
  let events = require('src/events');
5
5
  let adapterManager = require('src/adapterManager').default;
@@ -45,6 +45,8 @@ describe('Adomik Prebid Analytic', function () {
45
45
  const initOptions = {
46
46
  id: '123456',
47
47
  url: 'testurl',
48
+ testId: '12345',
49
+ testValue: '1000'
48
50
  };
49
51
 
50
52
  const bid = {
@@ -71,6 +73,9 @@ describe('Adomik Prebid Analytic', function () {
71
73
  expect(adomikAnalytics.currentContext).to.deep.equal({
72
74
  uid: '123456',
73
75
  url: 'testurl',
76
+ sampling: undefined,
77
+ testId: '12345',
78
+ testValue: '1000',
74
79
  id: '',
75
80
  timeouted: false
76
81
  });
@@ -81,6 +86,9 @@ describe('Adomik Prebid Analytic', function () {
81
86
  expect(adomikAnalytics.currentContext).to.deep.equal({
82
87
  uid: '123456',
83
88
  url: 'testurl',
89
+ sampling: undefined,
90
+ testId: '12345',
91
+ testValue: '1000',
84
92
  id: 'test-test-test',
85
93
  timeouted: false
86
94
  });
@@ -0,0 +1,74 @@
1
+ import { adqueryIdSubmodule, storage } from 'modules/adqueryIdSystem.js';
2
+ import { server } from 'test/mocks/xhr.js';
3
+ import {amxIdSubmodule} from '../../../modules/amxIdSystem';
4
+ import * as utils from '../../../src/utils';
5
+
6
+ const config = {
7
+ storage: {
8
+ type: 'html5',
9
+ },
10
+ };
11
+
12
+ describe('AdqueryIdSystem', function () {
13
+ describe('qid submodule', () => {
14
+ it('should expose a "name" property containing qid', () => {
15
+ expect(adqueryIdSubmodule.name).to.equal('qid');
16
+ });
17
+
18
+ it('should expose a "gvlid" property containing the GVL ID 902', () => {
19
+ expect(adqueryIdSubmodule.gvlid).to.equal(902);
20
+ });
21
+ });
22
+
23
+ describe('getId', function() {
24
+ let getDataFromLocalStorageStub;
25
+
26
+ beforeEach(function() {
27
+ getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage');
28
+ });
29
+
30
+ afterEach(function () {
31
+ getDataFromLocalStorageStub.restore();
32
+ });
33
+
34
+ it('gets a adqueryId', function() {
35
+ const config = {
36
+ params: {}
37
+ };
38
+ const callbackSpy = sinon.spy();
39
+ const callback = adqueryIdSubmodule.getId(config).callback;
40
+ callback(callbackSpy);
41
+ const request = server.requests[0];
42
+ expect(request.url).to.eq(`https://bidder.adquery.io/prebid/qid`);
43
+ request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ qid: 'qid' }));
44
+ expect(callbackSpy.lastCall.lastArg).to.deep.equal({qid: 'qid'});
45
+ });
46
+
47
+ it('gets a cached adqueryId', function() {
48
+ const config = {
49
+ params: {}
50
+ };
51
+ getDataFromLocalStorageStub.withArgs('qid').returns('qid');
52
+
53
+ const callbackSpy = sinon.spy();
54
+ const callback = adqueryIdSubmodule.getId(config).callback;
55
+ callback(callbackSpy);
56
+ expect(callbackSpy.lastCall.lastArg).to.deep.equal({qid: 'qid'});
57
+ });
58
+
59
+ it('allows configurable id url', function() {
60
+ const config = {
61
+ params: {
62
+ url: 'https://bidder.adquery.io'
63
+ }
64
+ };
65
+ const callbackSpy = sinon.spy();
66
+ const callback = adqueryIdSubmodule.getId(config).callback;
67
+ callback(callbackSpy);
68
+ const request = server.requests[0];
69
+ expect(request.url).to.eq('https://bidder.adquery.io');
70
+ request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ qid: 'testqid' }));
71
+ expect(callbackSpy.lastCall.lastArg).to.deep.equal({qid: 'testqid'});
72
+ });
73
+ });
74
+ });