prebid.js 5.18.0 → 6.1.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 (150) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +3 -1
  3. package/browsers.json +1 -8
  4. package/gulpfile.js +1 -0
  5. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  6. package/modules/.submodules.json +1 -0
  7. package/modules/adfBidAdapter.js +21 -16
  8. package/modules/adheseBidAdapter.js +7 -2
  9. package/modules/adkernelBidAdapter.js +1 -0
  10. package/modules/adlivetechBidAdapter.md +61 -0
  11. package/modules/adomikAnalyticsAdapter.js +10 -4
  12. package/modules/adtelligentBidAdapter.js +2 -1
  13. package/modules/airgridRtdProvider.js +1 -1
  14. package/modules/akamaiDapRtdProvider.js +474 -0
  15. package/modules/akamaiDapRtdProvider.md +47 -0
  16. package/modules/appnexusBidAdapter.js +9 -3
  17. package/modules/atsAnalyticsAdapter.js +67 -46
  18. package/modules/atsAnalyticsAdapter.md +1 -0
  19. package/modules/betweenBidAdapter.js +20 -3
  20. package/modules/browsiRtdProvider.js +106 -18
  21. package/modules/cleanioRtdProvider.js +192 -0
  22. package/modules/cleanioRtdProvider.md +59 -0
  23. package/modules/codefuelBidAdapter.js +181 -0
  24. package/modules/codefuelBidAdapter.md +111 -0
  25. package/modules/connectIdSystem.js +104 -0
  26. package/modules/connectIdSystem.md +33 -0
  27. package/modules/datablocksBidAdapter.js +3 -3
  28. package/modules/deepintentBidAdapter.js +107 -10
  29. package/modules/deepintentBidAdapter.md +36 -1
  30. package/modules/deltaprojectsBidAdapter.js +252 -0
  31. package/modules/deltaprojectsBidAdapter.md +32 -0
  32. package/modules/engageyaBidAdapter.js +171 -0
  33. package/modules/glimpseBidAdapter.js +31 -16
  34. package/modules/gptPreAuction.js +11 -5
  35. package/modules/gridBidAdapter.js +1 -0
  36. package/modules/gumgumBidAdapter.js +8 -0
  37. package/modules/id5IdSystem.md +6 -6
  38. package/modules/imRtdProvider.js +31 -0
  39. package/modules/inskinBidAdapter.js +7 -3
  40. package/modules/ixBidAdapter.js +174 -22
  41. package/modules/jixieBidAdapter.js +8 -2
  42. package/modules/justpremiumBidAdapter.js +6 -1
  43. package/modules/limelightDigitalBidAdapter.js +22 -2
  44. package/modules/livewrappedAnalyticsAdapter.js +49 -1
  45. package/modules/merkleIdSystem.js +5 -0
  46. package/modules/multibid/index.js +3 -3
  47. package/modules/nativoBidAdapter.js +32 -2
  48. package/modules/nextMillenniumBidAdapter.js +12 -3
  49. package/modules/oguryBidAdapter.js +16 -2
  50. package/modules/openxBidAdapter.js +40 -23
  51. package/modules/operaadsBidAdapter.js +21 -1
  52. package/modules/otmBidAdapter.js +146 -0
  53. package/modules/otmBidAdapter.md +27 -26
  54. package/modules/outbrainBidAdapter.js +5 -0
  55. package/modules/playwireBidAdapter.md +61 -0
  56. package/modules/prebidServerBidAdapter/index.js +3 -3
  57. package/modules/publinkIdSystem.js +11 -6
  58. package/modules/pubmaticBidAdapter.js +2 -0
  59. package/modules/rtdModule/index.js +2 -2
  60. package/modules/saambaaBidAdapter.js +420 -0
  61. package/modules/saambaaBidAdapter.md +65 -68
  62. package/modules/seedtagBidAdapter.js +6 -0
  63. package/modules/smaatoBidAdapter.js +6 -1
  64. package/modules/sonobiBidAdapter.js +7 -0
  65. package/modules/sortableBidAdapter.js +1 -0
  66. package/modules/sspBCBidAdapter.js +34 -3
  67. package/modules/teadsBidAdapter.js +3 -0
  68. package/modules/tripleliftBidAdapter.js +22 -5
  69. package/modules/trustxBidAdapter.js +18 -7
  70. package/modules/undertoneBidAdapter.js +9 -5
  71. package/modules/undertoneBidAdapter.md +5 -1
  72. package/modules/userId/eids.js +18 -0
  73. package/modules/userId/eids.md +7 -0
  74. package/modules/userId/userId.md +12 -0
  75. package/modules/ventesBidAdapter.js +370 -0
  76. package/modules/ventesBidAdapter.md +94 -0
  77. package/modules/videobyteBidAdapter.js +13 -6
  78. package/modules/videobyteBidAdapter.md +49 -0
  79. package/modules/vidoomyBidAdapter.js +51 -100
  80. package/modules/visxBidAdapter.js +1 -1
  81. package/modules/yahoosspBidAdapter.js +6 -6
  82. package/modules/yieldlabBidAdapter.js +41 -10
  83. package/modules/yieldlabBidAdapter.md +91 -48
  84. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  85. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  86. package/package.json +6 -1
  87. package/src/adapterManager.js +19 -8
  88. package/src/adapters/bidderFactory.js +4 -3
  89. package/src/auction.js +11 -11
  90. package/src/constants.json +1 -0
  91. package/src/secureCreatives.js +6 -7
  92. package/src/targeting.js +11 -9
  93. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  94. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  95. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  96. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  97. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  98. package/test/spec/modules/appnexusBidAdapter_spec.js +16 -1
  99. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  100. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  101. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  102. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  103. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  104. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  105. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  106. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  107. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  108. package/test/spec/modules/engageyaBidAdapter_spec.js +422 -0
  109. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  110. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  111. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  112. package/test/spec/modules/gumgumBidAdapter_spec.js +5 -1
  113. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  114. package/test/spec/modules/ixBidAdapter_spec.js +298 -5
  115. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  116. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  117. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  118. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  119. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +52 -7
  120. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  121. package/test/spec/modules/multibid_spec.js +31 -31
  122. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  123. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  124. package/test/spec/modules/oguryBidAdapter_spec.js +66 -23
  125. package/test/spec/modules/openxBidAdapter_spec.js +90 -13
  126. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  127. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  128. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  129. package/test/spec/modules/prebidServerBidAdapter_spec.js +19 -2
  130. package/test/spec/modules/publinkIdSystem_spec.js +6 -6
  131. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  132. package/test/spec/modules/smaatoBidAdapter_spec.js +30 -0
  133. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  134. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  135. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  136. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  137. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  138. package/test/spec/modules/trustxBidAdapter_spec.js +45 -3
  139. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  140. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  141. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  142. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  143. package/test/spec/modules/visxBidAdapter_spec.js +1 -1
  144. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  145. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  146. package/test/spec/unit/core/adapterManager_spec.js +56 -6
  147. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  148. package/test/spec/unit/pbjs_api_spec.js +37 -2
  149. package/test/spec/unit/secureCreatives_spec.js +54 -25
  150. package/wdio.conf.js +1 -1
@@ -262,14 +262,16 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a
262
262
  }
263
263
 
264
264
  let adUnitsS2SCopy = getAdUnitCopyForPrebidServer(adUnits, s2sConfig);
265
- let tid = generateUUID();
265
+
266
+ // uniquePbsTid is so we know which server to send which bids to during the callBids function
267
+ let uniquePbsTid = generateUUID();
266
268
  adaptersServerSide.forEach(bidderCode => {
267
269
  const bidderRequestId = getUniqueIdentifierStr();
268
270
  const bidderRequest = {
269
271
  bidderCode,
270
272
  auctionId,
271
273
  bidderRequestId,
272
- tid,
274
+ uniquePbsTid,
273
275
  bids: hookedGetBids({bidderCode, auctionId, bidderRequestId, 'adUnits': deepClone(adUnitsS2SCopy), labels, src: CONSTANTS.S2S.SRC}),
274
276
  auctionStart: auctionStart,
275
277
  timeout: s2sConfig.timeout,
@@ -350,7 +352,7 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
350
352
  serverBidRequests.forEach(serverBidRequest => {
351
353
  var index = -1;
352
354
  for (var i = 0; i < uniqueServerBidRequests.length; ++i) {
353
- if (serverBidRequest.tid === uniqueServerBidRequests[i].tid) {
355
+ if (serverBidRequest.uniquePbsTid === uniqueServerBidRequests[i].uniquePbsTid) {
354
356
  index = i;
355
357
  break;
356
358
  }
@@ -360,7 +362,10 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
360
362
  }
361
363
  });
362
364
 
363
- let counter = 0
365
+ let counter = 0;
366
+
367
+ // $.source.tid MUST be a unique UUID and also THE SAME between all PBS Requests for a given Auction
368
+ const sourceTid = generateUUID();
364
369
  _s2sConfigs.forEach((s2sConfig) => {
365
370
  if (s2sConfig && uniqueServerBidRequests[counter] && includes(s2sConfig.bidders, uniqueServerBidRequests[counter].bidderCode)) {
366
371
  // s2s should get the same client side timeout as other client side requests.
@@ -370,13 +375,13 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
370
375
  } : undefined);
371
376
  let adaptersServerSide = s2sConfig.bidders;
372
377
  const s2sAdapter = _bidderRegistry[s2sConfig.adapter];
373
- let tid = uniqueServerBidRequests[counter].tid;
378
+ let uniquePbsTid = uniqueServerBidRequests[counter].uniquePbsTid;
374
379
  let adUnitsS2SCopy = uniqueServerBidRequests[counter].adUnitsS2SCopy;
375
380
 
376
- let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.tid === tid)
381
+ let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.uniquePbsTid === uniquePbsTid);
377
382
 
378
383
  if (s2sAdapter) {
379
- let s2sBidRequest = {tid, 'ad_units': adUnitsS2SCopy, s2sConfig};
384
+ let s2sBidRequest = {tid: sourceTid, 'ad_units': adUnitsS2SCopy, s2sConfig};
380
385
  if (s2sBidRequest.ad_units.length) {
381
386
  let doneCbs = uniqueServerRequests.map(bidRequest => {
382
387
  bidRequest.start = timestamp();
@@ -391,7 +396,8 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
391
396
 
392
397
  // fire BID_REQUESTED event for each s2s bidRequest
393
398
  uniqueServerRequests.forEach(bidRequest => {
394
- events.emit(CONSTANTS.EVENTS.BID_REQUESTED, bidRequest);
399
+ // add the new sourceTid
400
+ events.emit(CONSTANTS.EVENTS.BID_REQUESTED, {...bidRequest, tid: sourceTid});
395
401
  });
396
402
 
397
403
  // make bid requests
@@ -621,4 +627,9 @@ adapterManager.callBidViewableBidder = function(bidder, bid) {
621
627
  tryCallBidderMethod(bidder, 'onBidViewable', bid);
622
628
  };
623
629
 
630
+ adapterManager.callBidderError = function(bidder, error, bidderRequest) {
631
+ const param = { error, bidderRequest };
632
+ tryCallBidderMethod(bidder, 'onBidderError', param);
633
+ };
634
+
624
635
  export default adapterManager;
@@ -335,10 +335,11 @@ export function newBidder(spec) {
335
335
 
336
336
  // If the server responds with an error, there's not much we can do. Log it, and make sure to
337
337
  // call onResponse() so that we're one step closer to calling done().
338
- function onFailure(err) {
338
+ function onFailure(errorMessage, error) {
339
339
  onTimelyResponse(spec.code);
340
-
341
- logError(`Server call for ${spec.code} failed: ${err}. Continuing without bids.`);
340
+ adapterManager.callBidderError(spec.code, error, bidderRequest)
341
+ events.emit(CONSTANTS.EVENTS.BIDDER_ERROR, { error, bidderRequest });
342
+ logError(`Server call for ${spec.code} failed: ${errorMessage} ${error.status}. Continuing without bids.`);
342
343
  onResponse();
343
344
  }
344
345
  }
package/src/auction.js CHANGED
@@ -613,7 +613,8 @@ export const getPriceGranularity = (mediaType, bidReq) => {
613
613
  * @returns {function}
614
614
  */
615
615
  export const getPriceByGranularity = (granularity) => {
616
- return (bid) => {
616
+ return (bid, bidReq) => {
617
+ granularity = granularity || getPriceGranularity(bid.mediaType, bidReq);
617
618
  if (granularity === CONSTANTS.GRANULARITY_OPTIONS.AUTO) {
618
619
  return bid.pbAg;
619
620
  } else if (granularity === CONSTANTS.GRANULARITY_OPTIONS.DENSE) {
@@ -646,14 +647,14 @@ export const getAdvertiserDomain = () => {
646
647
  * @param {BidRequest} bidReq
647
648
  * @returns {*}
648
649
  */
649
- export function getStandardBidderSettings(mediaType, bidderCode, bidReq) {
650
+ export function getStandardBidderSettings(mediaType, bidderCode) {
650
651
  // factory for key value objs
651
652
  function createKeyVal(key, value) {
652
653
  return {
653
654
  key,
654
655
  val: (typeof value === 'function')
655
- ? function (bidResponse) {
656
- return value(bidResponse);
656
+ ? function (bidResponse, bidReq) {
657
+ return value(bidResponse, bidReq);
657
658
  }
658
659
  : function (bidResponse) {
659
660
  return getValue(bidResponse, value);
@@ -661,7 +662,6 @@ export function getStandardBidderSettings(mediaType, bidderCode, bidReq) {
661
662
  };
662
663
  }
663
664
  const TARGETING_KEYS = CONSTANTS.TARGETING_KEYS;
664
- const granularity = getPriceGranularity(mediaType, bidReq);
665
665
 
666
666
  let bidderSettings = $$PREBID_GLOBAL$$.bidderSettings;
667
667
  if (!bidderSettings[CONSTANTS.JSON_MAPPING.BD_SETTING_STANDARD]) {
@@ -671,7 +671,7 @@ export function getStandardBidderSettings(mediaType, bidderCode, bidReq) {
671
671
  bidderSettings[CONSTANTS.JSON_MAPPING.BD_SETTING_STANDARD][CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING] = [
672
672
  createKeyVal(TARGETING_KEYS.BIDDER, 'bidderCode'),
673
673
  createKeyVal(TARGETING_KEYS.AD_ID, 'adId'),
674
- createKeyVal(TARGETING_KEYS.PRICE_BUCKET, getPriceByGranularity(granularity)),
674
+ createKeyVal(TARGETING_KEYS.PRICE_BUCKET, getPriceByGranularity()),
675
675
  createKeyVal(TARGETING_KEYS.SIZE, 'size'),
676
676
  createKeyVal(TARGETING_KEYS.DEAL, 'dealId'),
677
677
  createKeyVal(TARGETING_KEYS.SOURCE, 'source'),
@@ -716,12 +716,12 @@ export function getKeyValueTargetingPairs(bidderCode, custBidObj, bidReq) {
716
716
  // 1) set the keys from "standard" setting or from prebid defaults
717
717
  if (bidderSettings) {
718
718
  // initialize default if not set
719
- const standardSettings = getStandardBidderSettings(custBidObj.mediaType, bidderCode, bidReq);
720
- setKeys(keyValues, standardSettings, custBidObj);
719
+ const standardSettings = getStandardBidderSettings(custBidObj.mediaType, bidderCode);
720
+ setKeys(keyValues, standardSettings, custBidObj, bidReq);
721
721
 
722
722
  // 2) set keys from specific bidder setting override if they exist
723
723
  if (bidderCode && bidderSettings[bidderCode] && bidderSettings[bidderCode][CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING]) {
724
- setKeys(keyValues, bidderSettings[bidderCode], custBidObj);
724
+ setKeys(keyValues, bidderSettings[bidderCode], custBidObj, bidReq);
725
725
  custBidObj.sendStandardTargeting = bidderSettings[bidderCode].sendStandardTargeting;
726
726
  }
727
727
  }
@@ -734,7 +734,7 @@ export function getKeyValueTargetingPairs(bidderCode, custBidObj, bidReq) {
734
734
  return keyValues;
735
735
  }
736
736
 
737
- function setKeys(keyValues, bidderSettings, custBidObj) {
737
+ function setKeys(keyValues, bidderSettings, custBidObj, bidReq) {
738
738
  var targeting = bidderSettings[CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING];
739
739
  custBidObj.size = custBidObj.getSize();
740
740
 
@@ -748,7 +748,7 @@ function setKeys(keyValues, bidderSettings, custBidObj) {
748
748
 
749
749
  if (isFn(value)) {
750
750
  try {
751
- value = value(custBidObj);
751
+ value = value(custBidObj, bidReq);
752
752
  } catch (e) {
753
753
  logError('bidmanager', 'ERROR', e);
754
754
  }
@@ -32,6 +32,7 @@
32
32
  "NO_BID": "noBid",
33
33
  "BID_WON": "bidWon",
34
34
  "BIDDER_DONE": "bidderDone",
35
+ "BIDDER_ERROR": "bidderError",
35
36
  "SET_TARGETING": "setTargeting",
36
37
  "BEFORE_REQUEST_BIDS": "beforeRequestBids",
37
38
  "BEFORE_BIDDER_HTTP": "beforeBidderHttp",
@@ -60,7 +60,6 @@ export function receiveMessage(ev) {
60
60
  if (data.action === 'assetRequest') {
61
61
  const message = getAssetMessage(data, adObject);
62
62
  ev.source.postMessage(JSON.stringify(message), ev.origin);
63
- return;
64
63
  } else if (data.action === 'allAssetRequest') {
65
64
  const message = getAllAssetsMessage(data, adObject);
66
65
  ev.source.postMessage(JSON.stringify(message), ev.origin);
@@ -68,13 +67,13 @@ export function receiveMessage(ev) {
68
67
  adObject.height = data.height;
69
68
  adObject.width = data.width;
70
69
  resizeRemoteCreative(adObject);
71
- }
72
-
73
- const trackerType = fireNativeTrackers(data, adObject);
74
- if (trackerType === 'click') { return; }
70
+ } else {
71
+ const trackerType = fireNativeTrackers(data, adObject);
72
+ if (trackerType === 'click') { return; }
75
73
 
76
- auctionManager.addWinningBid(adObject);
77
- events.emit(BID_WON, adObject);
74
+ auctionManager.addWinningBid(adObject);
75
+ events.emit(BID_WON, adObject);
76
+ }
78
77
  }
79
78
  }
80
79
  }
package/src/targeting.js CHANGED
@@ -123,17 +123,19 @@ export function newTargeting(auctionManager) {
123
123
  if (isGptPubadsDefined()) {
124
124
  const adUnitCodes = getAdUnitCodes(adUnitCode);
125
125
  const adUnits = auctionManager.getAdUnits().filter(adUnit => includes(adUnitCodes, adUnit.code));
126
+ let unsetKeys = pbTargetingKeys.reduce((reducer, key) => {
127
+ reducer[key] = null;
128
+ return reducer;
129
+ }, {});
126
130
  window.googletag.pubads().getSlots().forEach(slot => {
127
131
  let customSlotMatchingFunc = isFn(customSlotMatching) && customSlotMatching(slot);
128
- pbTargetingKeys.forEach(function(key) {
129
- // reset only registered adunits
130
- adUnits.forEach(function(unit) {
131
- if (unit.code === slot.getAdUnitPath() ||
132
- unit.code === slot.getSlotElementId() ||
133
- (isFn(customSlotMatchingFunc) && customSlotMatchingFunc(unit.code))) {
134
- slot.setTargeting(key, null);
135
- }
136
- });
132
+ // reset only registered adunits
133
+ adUnits.forEach(unit => {
134
+ if (unit.code === slot.getAdUnitPath() ||
135
+ unit.code === slot.getSlotElementId() ||
136
+ (isFn(customSlotMatchingFunc) && customSlotMatchingFunc(unit.code))) {
137
+ slot.updateTargetingFromMap(unsetKeys);
138
+ }
137
139
  });
138
140
  });
139
141
  }
@@ -29,11 +29,34 @@ describe('Adf adapter', function () {
29
29
 
30
30
  it('should return true when required params found', function () {
31
31
  assert(spec.isBidRequestValid(bid));
32
+
33
+ bid.params = {
34
+ inv: 1234,
35
+ mname: 'some-placement'
36
+ };
37
+ assert(spec.isBidRequestValid(bid));
38
+
39
+ bid.params = {
40
+ mid: 4332,
41
+ inv: 1234,
42
+ mname: 'some-placement'
43
+ };
44
+ assert(spec.isBidRequestValid(bid));
32
45
  });
33
46
 
34
47
  it('should return false when required params are missing', function () {
35
48
  bid.params = { adxDomain: 'adx.adform.net' };
36
49
  assert.isFalse(spec.isBidRequestValid(bid));
50
+
51
+ bid.params = {
52
+ mname: 'some-placement'
53
+ };
54
+ assert.isFalse(spec.isBidRequestValid(bid));
55
+
56
+ bid.params = {
57
+ inv: 1234
58
+ };
59
+ assert.isFalse(spec.isBidRequestValid(bid));
37
60
  });
38
61
  });
39
62
 
@@ -331,6 +354,30 @@ describe('Adf adapter', function () {
331
354
  }
332
355
  });
333
356
 
357
+ describe('dynamic placement tag', function () {
358
+ it('should add imp parameters correctly', function () {
359
+ const validBidRequests = [
360
+ { bidId: 'bidId', params: { inv: 1000, mname: 'placement' }, mediaTypes: {video: {}} },
361
+ { bidId: 'bidId', params: { mid: 1234, inv: 1002, mname: 'placement2' }, mediaTypes: {video: {}} },
362
+ { bidId: 'bidId', params: { mid: 1234 }, mediaTypes: {video: {}} }
363
+ ];
364
+ const [ imp1, imp2, imp3 ] = getRequestImps(validBidRequests);
365
+
366
+ assert.equal(imp1.ext.bidder.inv, 1000);
367
+ assert.equal(imp1.ext.bidder.mname, 'placement');
368
+ assert.equal('tagid' in imp1, false);
369
+
370
+ assert.equal(imp2.ext.bidder.inv, 1002);
371
+ assert.equal(imp2.ext.bidder.mname, 'placement2');
372
+ assert.equal(imp2.tagid, 1234);
373
+
374
+ assert.ok(imp3.ext.bidder);
375
+ assert.equal('inv' in imp3.ext.bidder, false);
376
+ assert.equal('mname' in imp3.ext.bidder, false);
377
+ assert.equal(imp3.tagid, 1234);
378
+ });
379
+ });
380
+
334
381
  describe('price floors', function () {
335
382
  it('should not add if floors module not configured', function () {
336
383
  const validBidRequests = [{ bidId: 'bidId', params: {mid: 1000}, mediaTypes: {video: {}} }];
@@ -376,18 +423,14 @@ describe('Adf adapter', function () {
376
423
  return {
377
424
  currency: currency,
378
425
  floor
379
- }
426
+ };
380
427
  }
381
428
  };
382
429
  }
383
-
384
- function getRequestImps(validBidRequests) {
385
- return JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
386
- }
387
430
  });
388
431
 
389
432
  describe('multiple media types', function () {
390
- it('should use single media type for bidding', function () {
433
+ it('should use all configured media types for bidding', function () {
391
434
  let validBidRequests = [{
392
435
  bidId: 'bidId',
393
436
  params: { mid: 1000 },
@@ -414,20 +457,23 @@ describe('Adf adapter', function () {
414
457
  banner: {
415
458
  sizes: [[100, 100], [200, 300]]
416
459
  },
417
- native: {}
460
+ native: {},
461
+ video: {}
418
462
  }
419
463
  }];
420
- let [ banner, video, native ] = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
421
-
422
- assert.ok(banner.banner);
423
- assert.equal(banner.video, undefined);
424
- assert.equal(banner.native, undefined);
425
- assert.ok(video.video);
426
- assert.equal(video.banner, undefined);
427
- assert.equal(video.native, undefined);
428
- assert.ok(native.native);
429
- assert.equal(native.video, undefined);
430
- assert.equal(native.banner, undefined);
464
+ let [ first, second, third ] = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
465
+
466
+ assert.ok(first.banner);
467
+ assert.ok(first.video);
468
+ assert.equal(first.native, undefined);
469
+
470
+ assert.ok(second.video);
471
+ assert.equal(second.banner, undefined);
472
+ assert.equal(second.native, undefined);
473
+
474
+ assert.ok(third.native);
475
+ assert.ok(third.video);
476
+ assert.ok(third.banner);
431
477
  });
432
478
  });
433
479
 
@@ -626,6 +672,10 @@ describe('Adf adapter', function () {
626
672
  });
627
673
  });
628
674
  });
675
+
676
+ function getRequestImps(validBidRequests) {
677
+ return JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
678
+ }
629
679
  });
630
680
 
631
681
  describe('interpretResponse', function () {
@@ -754,7 +804,12 @@ describe('Adf adapter', function () {
754
804
  imptrackers: ['imptrackers url1', 'imptrackers url2']
755
805
  },
756
806
  dealid: 'deal-id',
757
- adomain: [ 'demo.com' ]
807
+ adomain: [ 'demo.com' ],
808
+ ext: {
809
+ prebid: {
810
+ type: 'native'
811
+ }
812
+ }
758
813
  }
759
814
  ]
760
815
  }],
@@ -767,7 +822,6 @@ describe('Adf adapter', function () {
767
822
  {
768
823
  bidId: 'bidId1',
769
824
  params: { mid: 1000 },
770
- mediaType: 'native',
771
825
  nativeParams: {
772
826
  title: { required: true, len: 140 },
773
827
  image: { required: false, wmin: 836, hmin: 627, w: 325, h: 300, mimes: ['image/jpg', 'image/gif'] },
@@ -899,7 +953,7 @@ describe('Adf adapter', function () {
899
953
  let serverResponse = {
900
954
  body: {
901
955
  seatbid: [{
902
- bid: [{ impid: '1', adm: '<banner>' }]
956
+ bid: [{ impid: '1', adm: '<banner>', ext: { prebid: { type: 'banner' } } }]
903
957
  }]
904
958
  }
905
959
  };
@@ -908,8 +962,7 @@ describe('Adf adapter', function () {
908
962
  bids: [
909
963
  {
910
964
  bidId: 'bidId1',
911
- params: { mid: 1000 },
912
- mediaType: 'banner'
965
+ params: { mid: 1000 }
913
966
  }
914
967
  ]
915
968
  };
@@ -917,6 +970,8 @@ describe('Adf adapter', function () {
917
970
  bids = spec.interpretResponse(serverResponse, bidRequest);
918
971
  assert.equal(bids.length, 1);
919
972
  assert.equal(bids[0].ad, '<banner>');
973
+ assert.equal(bids[0].mediaType, 'banner');
974
+ assert.equal(bids[0].meta.mediaType, 'banner');
920
975
  });
921
976
  });
922
977
 
@@ -925,7 +980,7 @@ describe('Adf adapter', function () {
925
980
  let serverResponse = {
926
981
  body: {
927
982
  seatbid: [{
928
- bid: [{ impid: '1', adm: '<vast>' }]
983
+ bid: [{ impid: '1', adm: '<vast>', ext: { prebid: { type: 'video' } } }]
929
984
  }]
930
985
  }
931
986
  };
@@ -934,8 +989,7 @@ describe('Adf adapter', function () {
934
989
  bids: [
935
990
  {
936
991
  bidId: 'bidId1',
937
- params: { mid: 1000 },
938
- mediaType: 'video'
992
+ params: { mid: 1000 }
939
993
  }
940
994
  ]
941
995
  };
@@ -943,13 +997,15 @@ describe('Adf adapter', function () {
943
997
  bids = spec.interpretResponse(serverResponse, bidRequest);
944
998
  assert.equal(bids.length, 1);
945
999
  assert.equal(bids[0].vastXml, '<vast>');
1000
+ assert.equal(bids[0].mediaType, 'video');
1001
+ assert.equal(bids[0].meta.mediaType, 'video');
946
1002
  });
947
1003
 
948
1004
  it('should add renderer for outstream bids', function () {
949
1005
  let serverResponse = {
950
1006
  body: {
951
1007
  seatbid: [{
952
- bid: [{ impid: '1', adm: '<vast>' }, { impid: '2', adm: '<vast>' }]
1008
+ bid: [{ impid: '1', adm: '<vast>', ext: { prebid: { type: 'video' } } }, { impid: '2', adm: '<vast>', ext: { prebid: { type: 'video' } } }]
953
1009
  }]
954
1010
  }
955
1011
  };
@@ -959,7 +1015,6 @@ describe('Adf adapter', function () {
959
1015
  {
960
1016
  bidId: 'bidId1',
961
1017
  params: { mid: 1000 },
962
- mediaType: 'video',
963
1018
  mediaTypes: {
964
1019
  video: {
965
1020
  context: 'outstream'
@@ -969,7 +1024,6 @@ describe('Adf adapter', function () {
969
1024
  {
970
1025
  bidId: 'bidId2',
971
1026
  params: { mid: 1000 },
972
- mediaType: 'video',
973
1027
  mediaTypes: {
974
1028
  video: {
975
1029
  constext: 'instream'
@@ -1,5 +1,6 @@
1
1
  import {expect} from 'chai';
2
2
  import {spec} from 'modules/adheseBidAdapter.js';
3
+ import {config} from 'src/config.js';
3
4
 
4
5
  const BID_ID = 456;
5
6
  const TTL = 360;
@@ -131,12 +132,21 @@ describe('AdheseAdapter', function () {
131
132
  expect(JSON.parse(req.data)).to.not.have.key('eids');
132
133
  });
133
134
 
134
- it('should request vast content as url', function () {
135
+ it('should request vast content as url by default', function () {
135
136
  let req = spec.buildRequests([ minimalBid() ], bidderRequest);
136
137
 
137
138
  expect(JSON.parse(req.data).vastContentAsUrl).to.equal(true);
138
139
  });
139
140
 
141
+ it('should request vast content as markup when configured', function () {
142
+ sinon.stub(config, 'getConfig').withArgs('adhese').returns({ vastContentAsUrl: false });
143
+
144
+ let req = spec.buildRequests([ minimalBid() ], bidderRequest);
145
+
146
+ expect(JSON.parse(req.data).vastContentAsUrl).to.equal(false);
147
+ config.getConfig.restore();
148
+ });
149
+
140
150
  it('should include bids', function () {
141
151
  let bid = minimalBid();
142
152
  let req = spec.buildRequests([ bid ], bidderRequest);
@@ -155,6 +165,22 @@ describe('AdheseAdapter', function () {
155
165
 
156
166
  expect(req.url).to.equal('https://ads-demo.adhese.com/json');
157
167
  });
168
+
169
+ it('should include params specified in the config', function () {
170
+ sinon.stub(config, 'getConfig').withArgs('adhese').returns({ globalTargets: { 'tl': [ 'all' ] } });
171
+ let req = spec.buildRequests([ minimalBid() ], bidderRequest);
172
+
173
+ expect(JSON.parse(req.data).parameters).to.deep.include({ 'tl': [ 'all' ] });
174
+ config.getConfig.restore();
175
+ });
176
+
177
+ it('should give priority to bid params over config params', function () {
178
+ sinon.stub(config, 'getConfig').withArgs('adhese').returns({ globalTargets: { 'xt': ['CONFIG_CONSENT_STRING'] } });
179
+ let req = spec.buildRequests([ minimalBid() ], bidderRequest);
180
+
181
+ expect(JSON.parse(req.data).parameters).to.deep.include({ 'xt': [ 'CONSENT_STRING' ] });
182
+ config.getConfig.restore();
183
+ });
158
184
  });
159
185
 
160
186
  describe('interpretResponse', () => {
@@ -1,5 +1,6 @@
1
1
  import adomikAnalytics from 'modules/adomikAnalyticsAdapter.js';
2
2
  import {expect} from 'chai';
3
+
3
4
  let events = require('src/events');
4
5
  let adapterManager = require('src/adapterManager').default;
5
6
  let constants = require('src/constants.json');
@@ -8,6 +9,7 @@ describe('Adomik Prebid Analytic', function () {
8
9
  let sendEventStub;
9
10
  let sendWonEventStub;
10
11
  let clock;
12
+
11
13
  before(function () {
12
14
  clock = sinon.useFakeTimers();
13
15
  });
@@ -91,7 +93,7 @@ describe('Adomik Prebid Analytic', function () {
91
93
  type: 'request',
92
94
  event: {
93
95
  bidder: 'BIDDERTEST',
94
- placementCode: 'placementtest',
96
+ placementCode: '0000',
95
97
  }
96
98
  });
97
99
 
@@ -17,6 +17,7 @@ const aliasEP = {
17
17
  mediafuse: 'https://ghb.hbmp.mediafuse.com/v2/auction/',
18
18
  navelix: 'https://ghb.hb.navelix.com/v2/auction/',
19
19
  bidsxchange: 'https://ghb.hbd.bidsxchange.com/v2/auction/',
20
+ streamkey: 'https://ghb.hb.streamkey.net/v2/auction/',
20
21
  };
21
22
 
22
23
  const DEFAULT_ADATPER_REQ = { bidderCode: 'adtelligent' };