prebid.js 7.48.0 → 7.49.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 (171) hide show
  1. package/README.md +3 -0
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admixerBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/aidemBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/asoBidAdapter.js +1 -1
  19. package/dist/axonixBidAdapter.js +1 -1
  20. package/dist/bidglassBidAdapter.js +1 -1
  21. package/dist/big-richmediaBidAdapter.js +1 -1
  22. package/dist/bridgewellBidAdapter.js +1 -1
  23. package/dist/brightMountainMediaBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/chtnwBidAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantAnalyticsAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/cwireBidAdapter.js +1 -1
  34. package/dist/dspxBidAdapter.js +1 -1
  35. package/dist/eplanningBidAdapter.js +1 -1
  36. package/dist/feedadBidAdapter.js +1 -1
  37. package/dist/finativeBidAdapter.js +1 -1
  38. package/dist/freewheel-sspBidAdapter.js +1 -1
  39. package/dist/glimpseBidAdapter.js +1 -1
  40. package/dist/gmosspBidAdapter.js +1 -1
  41. package/dist/goldbachBidAdapter.js +1 -1
  42. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  43. package/dist/greenbidsRtdProvider.js +1 -1
  44. package/dist/gridBidAdapter.js +1 -1
  45. package/dist/gumgumBidAdapter.js +1 -1
  46. package/dist/h12mediaBidAdapter.js +1 -1
  47. package/dist/id5IdSystem.js +1 -1
  48. package/dist/improvedigitalBidAdapter.js +1 -1
  49. package/dist/inmarBidAdapter.js +1 -1
  50. package/dist/insticatorBidAdapter.js +1 -1
  51. package/dist/ixBidAdapter.js +1 -1
  52. package/dist/justpremiumBidAdapter.js +1 -1
  53. package/dist/kargoBidAdapter.js +1 -1
  54. package/dist/konduitAnalyticsAdapter.js +1 -1
  55. package/dist/kueezBidAdapter.js +1 -1
  56. package/dist/kueezRtbBidAdapter.js +1 -1
  57. package/dist/kulturemediaBidAdapter.js +1 -1
  58. package/dist/lassoBidAdapter.js +1 -1
  59. package/dist/lifestreetBidAdapter.js +1 -1
  60. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  61. package/dist/logicadBidAdapter.js +1 -1
  62. package/dist/loglyliftBidAdapter.js +1 -1
  63. package/dist/magniteAnalyticsAdapter.js +1 -1
  64. package/dist/malltvAnalyticsAdapter.js +1 -1
  65. package/dist/marsmediaBidAdapter.js +1 -1
  66. package/dist/mediafuseBidAdapter.js +1 -1
  67. package/dist/mediasquareBidAdapter.js +1 -1
  68. package/dist/mgidBidAdapter.js +1 -1
  69. package/dist/minutemediaBidAdapter.js +1 -1
  70. package/dist/minutemediaplusBidAdapter.js +1 -1
  71. package/dist/nexx360BidAdapter.js +1 -1
  72. package/dist/not-for-prod/prebid.js +129 -128
  73. package/dist/oguryBidAdapter.js +1 -1
  74. package/dist/onetagBidAdapter.js +1 -1
  75. package/dist/ooloAnalyticsAdapter.js +1 -1
  76. package/dist/optidigitalBidAdapter.js +1 -1
  77. package/dist/outbrainBidAdapter.js +1 -1
  78. package/dist/parrableIdSystem.js +1 -1
  79. package/dist/pixfutureBidAdapter.js +1 -1
  80. package/dist/prebid-core.js +1 -1
  81. package/dist/prebidServerBidAdapter.js +1 -1
  82. package/dist/publinkIdSystem.js +1 -1
  83. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  84. package/dist/pubmaticBidAdapter.js +1 -1
  85. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  86. package/dist/pxyzBidAdapter.js +1 -1
  87. package/dist/quantcastBidAdapter.js +1 -1
  88. package/dist/readpeakBidAdapter.js +1 -1
  89. package/dist/relaidoBidAdapter.js +1 -1
  90. package/dist/retailspotBidAdapter.js +1 -0
  91. package/dist/rhythmoneBidAdapter.js +1 -1
  92. package/dist/riseBidAdapter.js +1 -1
  93. package/dist/rubiconAnalyticsAdapter.js +1 -1
  94. package/dist/rubiconBidAdapter.js +1 -1
  95. package/dist/seedingAllianceBidAdapter.js +1 -1
  96. package/dist/seedtagBidAdapter.js +1 -1
  97. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  98. package/dist/sharethroughBidAdapter.js +1 -1
  99. package/dist/shinezBidAdapter.js +1 -1
  100. package/dist/smaatoBidAdapter.js +1 -1
  101. package/dist/smartadserverBidAdapter.js +1 -1
  102. package/dist/smartxBidAdapter.js +1 -1
  103. package/dist/smilewantedBidAdapter.js +1 -1
  104. package/dist/sonobiBidAdapter.js +1 -1
  105. package/dist/sovrnAnalyticsAdapter.js +1 -1
  106. package/dist/sovrnBidAdapter.js +1 -1
  107. package/dist/sspBCBidAdapter.js +1 -1
  108. package/dist/stvBidAdapter.js +1 -1
  109. package/dist/sublimeBidAdapter.js +1 -1
  110. package/dist/synacormediaBidAdapter.js +1 -1
  111. package/dist/targetVideoBidAdapter.js +1 -1
  112. package/dist/teadsBidAdapter.js +1 -1
  113. package/dist/trionBidAdapter.js +1 -1
  114. package/dist/tripleliftBidAdapter.js +1 -1
  115. package/dist/ttdBidAdapter.js +1 -1
  116. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  117. package/dist/uid2IdSystem.js +1 -1
  118. package/dist/underdogmediaBidAdapter.js +1 -1
  119. package/dist/undertoneBidAdapter.js +1 -1
  120. package/dist/vidazooBidAdapter.js +1 -1
  121. package/dist/videobyteBidAdapter.js +1 -1
  122. package/dist/visxBidAdapter.js +1 -1
  123. package/dist/vuukleBidAdapter.js +1 -1
  124. package/dist/widespaceBidAdapter.js +1 -1
  125. package/dist/winrBidAdapter.js +1 -1
  126. package/dist/yahoosspBidAdapter.js +1 -1
  127. package/dist/yieldlabBidAdapter.js +1 -1
  128. package/dist/yieldmoBidAdapter.js +1 -1
  129. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  130. package/modules/adgenerationBidAdapter.js +24 -15
  131. package/modules/admixerBidAdapter.js +15 -9
  132. package/modules/aidemBidAdapter.js +3 -1
  133. package/modules/ixBidAdapter.js +65 -47
  134. package/modules/kueezRtbBidAdapter.js +30 -33
  135. package/modules/mgidBidAdapter.js +9 -8
  136. package/modules/minutemediaBidAdapter.js +6 -0
  137. package/modules/minutemediaplusBidAdapter.js +30 -32
  138. package/modules/nexx360BidAdapter.js +2 -1
  139. package/modules/prebidServerBidAdapter/index.js +1 -3
  140. package/modules/prebidServerBidAdapter/ortbConverter.js +5 -1
  141. package/modules/pubmaticAnalyticsAdapter.js +3 -2
  142. package/modules/retailspotBidAdapter .md +32 -0
  143. package/modules/retailspotBidAdapter.js +186 -0
  144. package/modules/riseBidAdapter.js +6 -0
  145. package/modules/ttdBidAdapter.js +23 -22
  146. package/modules/vidazooBidAdapter.js +28 -32
  147. package/modules/yieldlabBidAdapter.js +27 -5
  148. package/package.json +1 -1
  149. package/src/adapterManager.js +4 -0
  150. package/src/adapters/bidderFactory.js +1 -0
  151. package/src/auction.js +2 -0
  152. package/src/prebid.js +36 -12
  153. package/src/utils/cpm.js +4 -1
  154. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  155. package/test/spec/modules/admixerBidAdapter_spec.js +64 -25
  156. package/test/spec/modules/aidemBidAdapter_spec.js +3 -0
  157. package/test/spec/modules/ixBidAdapter_spec.js +66 -1
  158. package/test/spec/modules/kueezRtbBidAdapter_spec.js +3 -2
  159. package/test/spec/modules/mgidBidAdapter_spec.js +9 -9
  160. package/test/spec/modules/minutemediaBidAdapter_spec.js +18 -0
  161. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +3 -2
  162. package/test/spec/modules/prebidServerBidAdapter_spec.js +96 -1
  163. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +6 -1
  164. package/test/spec/modules/retailspotBidAdapter_spec.js +426 -0
  165. package/test/spec/modules/riseBidAdapter_spec.js +18 -0
  166. package/test/spec/modules/ttdBidAdapter_spec.js +129 -2
  167. package/test/spec/modules/vidazooBidAdapter_spec.js +3 -2
  168. package/test/spec/modules/yieldlabBidAdapter_spec.js +8 -1
  169. package/test/spec/unit/core/bidderFactory_spec.js +9 -9
  170. package/test/spec/unit/pbjs_api_spec.js +59 -1
  171. package/test/spec/unit/utils/cpm_spec.js +56 -1
@@ -184,13 +184,12 @@ export const spec = {
184
184
 
185
185
  if (isNative(bidRequest, adType)) {
186
186
  // there may be publishers still rely on it
187
- const url = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
188
- bidResponse.adUrl = url;
187
+ bidResponse.adUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
189
188
  bidResponse.mediaType = NATIVE;
190
- const nativeImageAssetObj = find(matchedBid.native.assets, e => e.id === 2);
189
+ const nativeImageAssetObj = find(matchedBid.native.assets, asset => isMainImage(asset));
191
190
  const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : { url: '', w: 0, h: 0 };
192
- const nativeTitleAsset = find(matchedBid.native.assets, e => e.id === 1);
193
- const nativeBodyAsset = find(matchedBid.native.assets, e => e.id === 3);
191
+ const nativeTitleAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'title'));
192
+ const nativeBodyAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'data'));
194
193
  bidResponse.native = {
195
194
  title: nativeTitleAsset ? nativeTitleAsset.title.text : '',
196
195
  body: nativeBodyAsset ? nativeBodyAsset.data.value : '',
@@ -201,6 +200,7 @@ export const spec = {
201
200
  },
202
201
  clickUrl: matchedBid.native.link.url,
203
202
  impressionTrackers: matchedBid.native.imptrackers,
203
+ assets: matchedBid.native.assets,
204
204
  };
205
205
  }
206
206
 
@@ -505,4 +505,26 @@ function getBidFloor(bid, sizes) {
505
505
  return undefined;
506
506
  }
507
507
 
508
+ /**
509
+ * Checks if an object has a property with a given name and the property value is not null or undefined.
510
+ *
511
+ * @param {Object} obj - The object to check.
512
+ * @param {string} propName - The name of the property to check.
513
+ * @returns {boolean} Returns true if the object has a property with the given name and the property value is not null or undefined, otherwise false.
514
+ */
515
+ function hasValidProperty(obj, propName) {
516
+ return obj.hasOwnProperty(propName) && obj[propName] != null;
517
+ }
518
+
519
+ /**
520
+ * Checks if an asset object is a main image.
521
+ * A main image is defined as an image asset whose type value is 3.
522
+ *
523
+ * @param {Object} asset - The asset object to check.
524
+ * @returns {boolean} Returns true if the object has a property img.type with a value of 3, otherwise false.
525
+ */
526
+ function isMainImage(asset) {
527
+ return asset?.img?.type === 3
528
+ }
529
+
508
530
  registerBidder(spec);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.48.0",
3
+ "version": "7.49.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
@@ -612,6 +612,10 @@ adapterManager.callBidWonBidder = function(bidder, bid, adUnits) {
612
612
  tryCallBidderMethod(bidder, 'onBidWon', bid);
613
613
  };
614
614
 
615
+ adapterManager.callBidBillableBidder = function(bid) {
616
+ tryCallBidderMethod(bid.bidder, 'onBidBillable', bid);
617
+ };
618
+
615
619
  adapterManager.callSetTargetingBidder = function(bidder, bid) {
616
620
  tryCallBidderMethod(bidder, 'onSetTargeting', bid);
617
621
  };
@@ -306,6 +306,7 @@ export function newBidder(spec) {
306
306
  return true;
307
307
  }
308
308
  }
309
+
309
310
  return false;
310
311
  }
311
312
 
package/src/auction.js CHANGED
@@ -367,8 +367,10 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
367
367
  }
368
368
 
369
369
  function addWinningBid(winningBid) {
370
+ const winningAd = adUnits.find(adUnit => adUnit.transactionId === winningBid.transactionId);
370
371
  _winningBids = _winningBids.concat(winningBid);
371
372
  adapterManager.callBidWonBidder(winningBid.adapterCode || winningBid.bidder, winningBid, adUnits);
373
+ if (winningAd && !winningAd.deferBilling) adapterManager.callBidBillableBidder(winningBid);
372
374
  }
373
375
 
374
376
  function setBidTargeting(bid) {
package/src/prebid.js CHANGED
@@ -1001,18 +1001,7 @@ if (FEATURES.VIDEO) {
1001
1001
  * @alias module:pbjs.markWinningBidAsUsed
1002
1002
  */
1003
1003
  pbjsInstance.markWinningBidAsUsed = function (markBidRequest) {
1004
- let bids = [];
1005
-
1006
- if (markBidRequest.adUnitCode && markBidRequest.adId) {
1007
- bids = auctionManager.getBidsReceived()
1008
- .filter(bid => bid.adId === markBidRequest.adId && bid.adUnitCode === markBidRequest.adUnitCode);
1009
- } else if (markBidRequest.adUnitCode) {
1010
- bids = targeting.getWinningBids(markBidRequest.adUnitCode);
1011
- } else if (markBidRequest.adId) {
1012
- bids = auctionManager.getBidsReceived().filter(bid => bid.adId === markBidRequest.adId);
1013
- } else {
1014
- logWarn('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
1015
- }
1004
+ const bids = fetchReceivedBids(markBidRequest, 'Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
1016
1005
 
1017
1006
  if (bids.length > 0) {
1018
1007
  bids[0].status = CONSTANTS.BID_STATUS.RENDERED;
@@ -1020,6 +1009,23 @@ if (FEATURES.VIDEO) {
1020
1009
  }
1021
1010
  }
1022
1011
 
1012
+ const fetchReceivedBids = (bidRequest, warningMessage) => {
1013
+ let bids = [];
1014
+
1015
+ if (bidRequest.adUnitCode && bidRequest.adId) {
1016
+ bids = auctionManager.getBidsReceived()
1017
+ .filter(bid => bid.adId === bidRequest.adId && bid.adUnitCode === bidRequest.adUnitCode);
1018
+ } else if (bidRequest.adUnitCode) {
1019
+ bids = targeting.getWinningBids(bidRequest.adUnitCode);
1020
+ } else if (bidRequest.adId) {
1021
+ bids = auctionManager.getBidsReceived().filter(bid => bid.adId === bidRequest.adId);
1022
+ } else {
1023
+ logWarn(warningMessage);
1024
+ }
1025
+
1026
+ return bids;
1027
+ };
1028
+
1023
1029
  /**
1024
1030
  * Get Prebid config options
1025
1031
  * @param {Object} options
@@ -1097,4 +1103,22 @@ pbjsInstance.processQueue = function () {
1097
1103
  processQueue(pbjsInstance.cmd);
1098
1104
  };
1099
1105
 
1106
+ /**
1107
+ * @alias module:pbjs.triggerBilling
1108
+ */
1109
+ pbjsInstance.triggerBilling = (winningBid) => {
1110
+ const bids = fetchReceivedBids(winningBid, 'Improper use of triggerBilling. It requires a bid with at least an adUnitCode or an adId to function.');
1111
+ const triggerBillingBid = bids.find(bid => bid.requestId === winningBid.requestId) || bids[0];
1112
+
1113
+ if (bids.length > 0 && triggerBillingBid) {
1114
+ try {
1115
+ adapterManager.callBidBillableBidder(triggerBillingBid);
1116
+ } catch (e) {
1117
+ logError('Error when triggering billing :', e);
1118
+ }
1119
+ } else {
1120
+ logWarn('The bid provided to triggerBilling did not match any bids received.');
1121
+ }
1122
+ };
1123
+
1100
1124
  export default pbjsInstance;
package/src/utils/cpm.js CHANGED
@@ -4,7 +4,10 @@ import {logError} from '../utils.js';
4
4
 
5
5
  export function adjustCpm(cpm, bidResponse, bidRequest, {index = auctionManager.index, bs = bidderSettings} = {}) {
6
6
  bidRequest = bidRequest || index.getBidRequest(bidResponse);
7
- const bidCpmAdjustment = bs.get(bidResponse?.bidderCode || bidRequest?.bidder, 'bidCpmAdjustment');
7
+ const adapterCode = bidResponse?.adapterCode;
8
+ const bidderCode = bidResponse?.bidderCode || bidRequest?.bidder;
9
+ const adjustAlternateBids = bs.get(bidResponse?.adapterCode, 'adjustAlternateBids');
10
+ const bidCpmAdjustment = bs.getOwn(bidderCode, 'bidCpmAdjustment') || bs.get(adjustAlternateBids ? adapterCode : bidderCode, 'bidCpmAdjustment');
8
11
 
9
12
  if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
10
13
  try {
@@ -144,12 +144,12 @@ describe('AdgenerationAdapter', function () {
144
144
  }
145
145
  };
146
146
  const data = {
147
- banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
148
- bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
149
- native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&tp=https%3A%2F%2Fexample.com`,
150
- bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
151
- bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
152
- bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
147
+ banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
148
+ bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
149
+ native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&tp=https%3A%2F%2Fexample.com`,
150
+ bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
151
+ bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
152
+ bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
153
153
  };
154
154
  it('sends bid request to ENDPOINT via GET', function () {
155
155
  const request = spec.buildRequests(bidRequests, bidderRequest)[0];
@@ -100,33 +100,72 @@ describe('AdmixerAdapter', function () {
100
100
  });
101
101
  });
102
102
 
103
- describe('buildRequestsAdmixerADX', function () {
104
- let validRequest = [
105
- {
106
- bidder: BIDDER_CODE_ADX,
107
- params: {
108
- zone: ZONE_ID,
103
+ describe('buildRequests URL check', function () {
104
+ const requestParamsFor = (bidder) => ({
105
+ validRequest: [
106
+ {
107
+ bidder: bidder,
108
+ params: {
109
+ zone: ZONE_ID,
110
+ },
111
+ adUnitCode: 'adunit-code',
112
+ sizes: [
113
+ [300, 250],
114
+ [300, 600],
115
+ ],
116
+ bidId: '30b31c1838de1e',
117
+ bidderRequestId: '22edbae2733bf6',
118
+ auctionId: '1d1a030790a475',
109
119
  },
110
- adUnitCode: 'adunit-code',
111
- sizes: [
112
- [300, 250],
113
- [300, 600],
114
- ],
115
- bidId: '30b31c1838de1e',
116
- bidderRequestId: '22edbae2733bf6',
117
- auctionId: '1d1a030790a475',
118
- },
119
- ];
120
- let bidderRequest = {
121
- bidderCode: BIDDER_CODE_ADX,
122
- refererInfo: {
123
- page: 'https://example.com',
124
- },
125
- };
120
+ ],
121
+ bidderRequest: {
122
+ bidderCode: bidder,
123
+ refererInfo: {
124
+ page: 'https://example.com',
125
+ },
126
+ }
127
+ })
126
128
 
127
- it('sends bid request to ADX ENDPOINT', function () {
128
- const request = spec.buildRequests(validRequest, bidderRequest);
129
- expect(request.url).to.equal(ENDPOINT_URL_ADX);
129
+ it('build request for admixer', function () {
130
+ const requestParams = requestParamsFor('admixer');
131
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
132
+ expect(request.url).to.equal('https://inv-nets.admixer.net/prebid.1.2.aspx');
133
+ expect(request.method).to.equal('POST');
134
+ });
135
+ it('build request for go2net', function () {
136
+ const requestParams = requestParamsFor('go2net');
137
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
138
+ expect(request.url).to.equal('https://ads.go2net.com.ua/prebid.1.2.aspx');
139
+ expect(request.method).to.equal('POST');
140
+ });
141
+ it('build request for adblender', function () {
142
+ const requestParams = requestParamsFor('adblender');
143
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
144
+ expect(request.url).to.equal('https://inv-nets.admixer.net/prebid.1.2.aspx');
145
+ expect(request.method).to.equal('POST');
146
+ });
147
+ it('build request for adsyield', function () {
148
+ const requestParams = requestParamsFor('adsyield');
149
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
150
+ expect(request.url).to.equal('https://ads.adsyield.com/prebid.1.2.aspx');
151
+ expect(request.method).to.equal('POST');
152
+ });
153
+ it('build request for futureads', function () {
154
+ const requestParams = requestParamsFor('futureads');
155
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
156
+ expect(request.url).to.equal('https://ads.futureads.io/prebid.1.2.aspx');
157
+ expect(request.method).to.equal('POST');
158
+ });
159
+ it('build request for smn', function () {
160
+ const requestParams = requestParamsFor('smn');
161
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
162
+ expect(request.url).to.equal('https://ads.smn.rs/prebid.1.2.aspx');
163
+ expect(request.method).to.equal('POST');
164
+ });
165
+ it('build request for admixeradx', function () {
166
+ const requestParams = requestParamsFor('admixeradx');
167
+ const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
168
+ expect(request.url).to.equal('https://inv-nets.admixer.net/adxprebid.1.2.aspx');
130
169
  expect(request.method).to.equal('POST');
131
170
  });
132
171
  });
@@ -359,6 +359,9 @@ const WIN_NOTICE_APP = {
359
359
  'app_name': '{{APP_NAME}}',
360
360
  'app_store_url': '{{APP_STORE_URL}}',
361
361
  'inventory_source': '{{INVENTORY_SOURCE}}'
362
+ },
363
+ 'win_notice_ext': {
364
+ 'seatid': '{{SEAT_ID}}'
362
365
  }
363
366
  }
364
367
  },
@@ -725,6 +725,11 @@ describe('IndexexchangeAdapter', function () {
725
725
  refererInfo: {
726
726
  page: 'https://www.prebid.org',
727
727
  canonicalUrl: 'https://www.prebid.org/the/link/to/the/page'
728
+ },
729
+ ortb2: {
730
+ site: {
731
+ page: 'https://www.prebid.org'
732
+ }
728
733
  }
729
734
  };
730
735
 
@@ -2135,7 +2140,7 @@ describe('IndexexchangeAdapter', function () {
2135
2140
 
2136
2141
  const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
2137
2142
  const pageUrl = extractPayload(requestWithFirstPartyData).site.page;
2138
- const expectedPageUrl = DEFAULT_OPTION.refererInfo.page + '?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
2143
+ const expectedPageUrl = DEFAULT_OPTION.ortb2.site.page + '/?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
2139
2144
  expect(pageUrl).to.equal(expectedPageUrl);
2140
2145
  });
2141
2146
 
@@ -2233,6 +2238,66 @@ describe('IndexexchangeAdapter', function () {
2233
2238
  });
2234
2239
  });
2235
2240
 
2241
+ describe('getIxFirstPartyDataPageUrl', () => {
2242
+ beforeEach(() => {
2243
+ config.setConfig({ ix: { firstPartyData: { key1: 'value1', key2: 'value2' } } });
2244
+ });
2245
+
2246
+ afterEach(() => {
2247
+ config.resetConfig();
2248
+ });
2249
+
2250
+ it('should return the modified URL with first party data query parameters appended', () => {
2251
+ const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
2252
+ const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
2253
+ expect(pageUrl).to.equal('https://www.prebid.org/?key1=value1&key2=value2');
2254
+ });
2255
+
2256
+ it('should return the modified URL with first party data query parameters appended but not duplicated', () => {
2257
+ const bidderRequest = deepClone(DEFAULT_OPTION);
2258
+ bidderRequest.ortb2.site.page = 'https://www.prebid.org/?key1=value1'
2259
+ const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
2260
+ const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
2261
+ expect(pageUrl).to.equal('https://www.prebid.org/?key1=value1&key2=value2');
2262
+ });
2263
+
2264
+ it('should not overwrite existing query parameters with first party data', () => {
2265
+ config.setConfig({ ix: { firstPartyData: { key1: 'value1', key2: 'value2' } } });
2266
+ const bidderRequest = deepClone(DEFAULT_OPTION);
2267
+ bidderRequest.ortb2.site.page = 'https://www.prebid.org/?key1=existingValue1'
2268
+ const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, bidderRequest)[0];
2269
+ const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
2270
+ expect(pageUrl).to.equal('https://www.prebid.org/?key1=existingValue1&key2=value2');
2271
+ });
2272
+
2273
+ it('should return the original URL if no first party data is available', () => {
2274
+ config.setConfig({ ix: {} });
2275
+ const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
2276
+ const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
2277
+ expect(pageUrl).to.equal('https://www.prebid.org');
2278
+ });
2279
+
2280
+ it('should return the original URL referer page url if ortb2 does not exist', () => {
2281
+ config.setConfig({ ix: {} });
2282
+ const bidderRequest = deepClone(DEFAULT_OPTION);
2283
+ delete bidderRequest.ortb2;
2284
+ bidderRequest.refererInfo.page = 'https://example.com';
2285
+ const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, bidderRequest)[0];
2286
+ const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
2287
+ expect(pageUrl).to.equal('https://example.com');
2288
+ });
2289
+
2290
+ it('should use referer URL if the provided ortb2.site.page URL is not valid', () => {
2291
+ config.setConfig({ ix: { firstPartyData: { key1: 'value1', key2: 'value2' } } });
2292
+ const bidderRequest = deepClone(DEFAULT_OPTION);
2293
+ bidderRequest.ortb2.site.page = 'www.invalid-url*&?.com';
2294
+ bidderRequest.refererInfo.page = 'https://www.prebid.org';
2295
+ const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, bidderRequest)[0];
2296
+ const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
2297
+ expect(pageUrl).to.equal('https://www.prebid.org/?key1=value1&key2=value2');
2298
+ });
2299
+ });
2300
+
2236
2301
  describe('request should contain both banner and video requests', function () {
2237
2302
  const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]], {});
2238
2303
  it('should have banner request', () => {
@@ -1,7 +1,6 @@
1
1
  import {expect} from 'chai';
2
2
  import {
3
3
  spec as adapter,
4
- SUPPORTED_ID_SYSTEMS,
5
4
  createDomain,
6
5
  hashCode,
7
6
  extractPID,
@@ -18,6 +17,8 @@ import {useFakeTimers} from 'sinon';
18
17
  import {BANNER, VIDEO} from '../../../src/mediaTypes';
19
18
  import {config} from '../../../src/config';
20
19
 
20
+ export const TEST_ID_SYSTEMS = ['britepoolid', 'criteoId', 'id5id', 'idl_env', 'lipb', 'netId', 'parrableId', 'pubcid', 'tdid', 'pubProvidedId'];
21
+
21
22
  const SUB_DOMAIN = 'exchange';
22
23
 
23
24
  const BID = {
@@ -498,7 +499,7 @@ describe('KueezRtbBidAdapter', function () {
498
499
  });
499
500
 
500
501
  describe('user id system', function () {
501
- Object.keys(SUPPORTED_ID_SYSTEMS).forEach((idSystemProvider) => {
502
+ TEST_ID_SYSTEMS.forEach((idSystemProvider) => {
502
503
  const id = Date.now().toString();
503
504
  const bid = utils.deepClone(BID);
504
505
 
@@ -824,19 +824,19 @@ describe('Mgid bid adapter', function () {
824
824
  const sync = spec.getUserSyncs({iframeEnabled: true})
825
825
  expect(sync).to.have.length(1)
826
826
  expect(sync[0]).to.have.property('type', 'iframe')
827
- expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&consentData=&gdprApplies=0/)
827
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=&gdpr=0/)
828
828
  });
829
829
  it('should return frame object with gdpr consent', function () {
830
830
  const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent', gdprApplies: true})
831
831
  expect(sync).to.have.length(1)
832
832
  expect(sync[0]).to.have.property('type', 'iframe')
833
- expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&consentData=consent&gdprApplies=1/)
833
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent&gdpr=1/)
834
834
  });
835
835
  it('should return frame object with gdpr + usp', function () {
836
836
  const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
837
837
  expect(sync).to.have.length(1)
838
838
  expect(sync[0]).to.have.property('type', 'iframe')
839
- expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2/)
839
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
840
840
  });
841
841
  it('should return img object with gdpr + usp', function () {
842
842
  config.setConfig({userSync: {syncsPerBidder: undefined}});
@@ -844,23 +844,23 @@ describe('Mgid bid adapter', function () {
844
844
  expect(sync).to.have.length(USERSYNC_DEFAULT_CONFIG.syncsPerBidder)
845
845
  for (let i = 0; i < USERSYNC_DEFAULT_CONFIG.syncsPerBidder; i++) {
846
846
  expect(sync[i]).to.have.property('type', 'image')
847
- expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2/)
847
+ expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
848
848
  }
849
849
  });
850
850
  it('should return frame object with gdpr + usp', function () {
851
851
  const sync = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
852
852
  expect(sync).to.have.length(1)
853
853
  expect(sync[0]).to.have.property('type', 'iframe')
854
- expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2/)
854
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
855
855
  });
856
856
  it('should return img (pixels) objects with gdpr + usp', function () {
857
857
  const response = [{body: {ext: {cm: ['http://cm.mgid.com/i.gif?cdsp=1111', 'http://cm.mgid.com/i.gif']}}}]
858
858
  const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
859
859
  expect(sync).to.have.length(2)
860
860
  expect(sync[0]).to.have.property('type', 'image')
861
- expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2/)
861
+ expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
862
862
  expect(sync[1]).to.have.property('type', 'image')
863
- expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2/)
863
+ expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
864
864
  });
865
865
  });
866
866
 
@@ -874,9 +874,9 @@ describe('Mgid bid adapter', function () {
874
874
  const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'}, {gppString: 'gpp'})
875
875
  expect(sync).to.have.length(2)
876
876
  expect(sync[0]).to.have.property('type', 'image')
877
- expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2&gppString=gpp&coppa=1/)
877
+ expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2&gppString=gpp&coppa=1/)
878
878
  expect(sync[1]).to.have.property('type', 'image')
879
- expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&consentData=consent1&gdprApplies=1&uspString=consent2&gppString=gpp&coppa=1/)
879
+ expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2&gppString=gpp&coppa=1/)
880
880
  });
881
881
  });
882
882
 
@@ -293,6 +293,24 @@ describe('minutemediaAdapter', function () {
293
293
  expect(request.data.bids[0]).to.be.an('object');
294
294
  expect(request.data.bids[0]).to.have.property('floorPrice', 1.5);
295
295
  });
296
+
297
+ describe('COPPA Param', function() {
298
+ it('should set coppa equal 0 in bid request if coppa is set to false', function() {
299
+ const request = spec.buildRequests(bidRequests, bidderRequest);
300
+ expect(request.data.bids[0].coppa).to.be.equal(0);
301
+ });
302
+
303
+ it('should set coppa equal 1 in bid request if coppa is set to true', function() {
304
+ const bid = utils.deepClone(bidRequests[0]);
305
+ bid.ortb2 = {
306
+ 'regs': {
307
+ 'coppa': true,
308
+ }
309
+ };
310
+ const request = spec.buildRequests([bid], bidderRequest);
311
+ expect(request.data.bids[0].coppa).to.be.equal(1);
312
+ });
313
+ });
296
314
  });
297
315
 
298
316
  describe('interpretResponse', function () {
@@ -1,7 +1,6 @@
1
1
  import {expect} from 'chai';
2
2
  import {
3
3
  spec as adapter,
4
- SUPPORTED_ID_SYSTEMS,
5
4
  createDomain,
6
5
  hashCode,
7
6
  extractPID,
@@ -18,6 +17,8 @@ import {useFakeTimers} from 'sinon';
18
17
  import {BANNER, VIDEO} from '../../../src/mediaTypes';
19
18
  import {config} from '../../../src/config';
20
19
 
20
+ export const TEST_ID_SYSTEMS = ['britepoolid', 'criteoId', 'id5id', 'idl_env', 'lipb', 'netId', 'parrableId', 'pubcid', 'tdid', 'pubProvidedId'];
21
+
21
22
  const SUB_DOMAIN = 'exchange';
22
23
 
23
24
  const BID = {
@@ -498,7 +499,7 @@ describe('MinuteMediaPlus Bid Adapter', function () {
498
499
  });
499
500
 
500
501
  describe('user id system', function () {
501
- Object.keys(SUPPORTED_ID_SYSTEMS).forEach((idSystemProvider) => {
502
+ TEST_ID_SYSTEMS.forEach((idSystemProvider) => {
502
503
  const id = Date.now().toString();
503
504
  const bid = utils.deepClone(BID);
504
505
 
@@ -2463,7 +2463,7 @@ describe('S2S Adapter', function () {
2463
2463
  };
2464
2464
  const bcat = ['IAB25', 'IAB7-39'];
2465
2465
  const badv = ['blockedAdv-1.com', 'blockedAdv-2.com'];
2466
- const allowedBidders = ['rubicon', 'appnexus'];
2466
+ const allowedBidders = ['appnexus'];
2467
2467
 
2468
2468
  const expected = allowedBidders.map(bidder => ({
2469
2469
  bidders: [bidder],
@@ -2516,6 +2516,101 @@ describe('S2S Adapter', function () {
2516
2516
  expect(parsedRequestBody.bcat).to.deep.equal(bcat);
2517
2517
  });
2518
2518
 
2519
+ it('passes first party data in request for unknown when allowUnknownBidderCodes is true', () => {
2520
+ const cfg = { ...CONFIG, allowUnknownBidderCodes: true };
2521
+ config.setConfig({ s2sConfig: cfg });
2522
+
2523
+ const clonedReq = {...REQUEST, s2sConfig: cfg}
2524
+ const s2sBidRequest = utils.deepClone(clonedReq);
2525
+ const bidRequests = utils.deepClone(BID_REQUESTS);
2526
+
2527
+ const commonSite = {
2528
+ keywords: ['power tools'],
2529
+ search: 'drill'
2530
+ };
2531
+ const commonUser = {
2532
+ keywords: ['a', 'b'],
2533
+ gender: 'M'
2534
+ };
2535
+
2536
+ const site = {
2537
+ content: {userrating: 4},
2538
+ ext: {
2539
+ data: {
2540
+ pageType: 'article',
2541
+ category: 'tools'
2542
+ }
2543
+ }
2544
+ };
2545
+ const user = {
2546
+ yob: '1984',
2547
+ geo: { country: 'ca' },
2548
+ ext: {
2549
+ data: {
2550
+ registered: true,
2551
+ interests: ['cars']
2552
+ }
2553
+ }
2554
+ };
2555
+ const bcat = ['IAB25', 'IAB7-39'];
2556
+ const badv = ['blockedAdv-1.com', 'blockedAdv-2.com'];
2557
+ const allowedBidders = ['appnexus', 'unknown'];
2558
+
2559
+ const expected = allowedBidders.map(bidder => ({
2560
+ bidders: [bidder],
2561
+ config: {
2562
+ ortb2: {
2563
+ site: {
2564
+ content: { userrating: 4 },
2565
+ ext: {
2566
+ data: {
2567
+ pageType: 'article',
2568
+ category: 'tools'
2569
+ }
2570
+ }
2571
+ },
2572
+ user: {
2573
+ yob: '1984',
2574
+ geo: { country: 'ca' },
2575
+ ext: {
2576
+ data: {
2577
+ registered: true,
2578
+ interests: ['cars']
2579
+ }
2580
+ }
2581
+ },
2582
+ bcat: ['IAB25', 'IAB7-39'],
2583
+ badv: ['blockedAdv-1.com', 'blockedAdv-2.com']
2584
+ }
2585
+ }
2586
+ }));
2587
+ const commonContextExpected = utils.mergeDeep({
2588
+ 'page': 'http://mytestpage.com',
2589
+ 'domain': 'mytestpage.com',
2590
+ 'publisher': {
2591
+ 'id': '1',
2592
+ 'domain': 'mytestpage.com'
2593
+ }
2594
+ }, commonSite);
2595
+
2596
+ const ortb2Fragments = {
2597
+ global: {site: commonSite, user: commonUser, badv, bcat},
2598
+ bidder: Object.fromEntries(allowedBidders.map(bidder => [bidder, {site, user, bcat, badv}]))
2599
+ };
2600
+
2601
+ // adapter.callBids({ ...REQUEST, s2sConfig: cfg }, BID_REQUESTS, addBidResponse, done, ajax);
2602
+
2603
+ adapter.callBids(addFpdEnrichmentsToS2SRequest({...s2sBidRequest, ortb2Fragments}, bidRequests, cfg), bidRequests, addBidResponse, done, ajax);
2604
+ const parsedRequestBody = JSON.parse(server.requests[0].requestBody);
2605
+ // eslint-disable-next-line no-console
2606
+ console.log(parsedRequestBody);
2607
+ expect(parsedRequestBody.ext.prebid.bidderconfig).to.deep.equal(expected);
2608
+ expect(parsedRequestBody.site).to.deep.equal(commonContextExpected);
2609
+ expect(parsedRequestBody.user).to.deep.equal(commonUser);
2610
+ expect(parsedRequestBody.badv).to.deep.equal(badv);
2611
+ expect(parsedRequestBody.bcat).to.deep.equal(bcat);
2612
+ });
2613
+
2519
2614
  describe('pbAdSlot config', function () {
2520
2615
  it('should not send \"imp.ext.data.pbadslot\" if \"ortb2Imp.ext\" is undefined', function () {
2521
2616
  const consentConfig = { s2sConfig: CONFIG };