prebid.js 5.19.0 → 6.2.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 (161) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +4 -2
  3. package/browsers.json +13 -37
  4. package/gulpfile.js +1 -0
  5. package/karma.conf.maker.js +1 -1
  6. package/modules/adheseBidAdapter.js +7 -2
  7. package/modules/adkernelBidAdapter.js +1 -0
  8. package/modules/adlivetechBidAdapter.md +61 -0
  9. package/modules/admixerBidAdapter.js +2 -1
  10. package/modules/adnuntiusBidAdapter.js +2 -1
  11. package/modules/adomikAnalyticsAdapter.js +10 -4
  12. package/modules/adplusBidAdapter.js +203 -0
  13. package/modules/adplusBidAdapter.md +39 -0
  14. package/modules/adyoulikeBidAdapter.js +7 -2
  15. package/modules/airgridRtdProvider.js +1 -1
  16. package/modules/appnexusBidAdapter.js +28 -5
  17. package/modules/atsAnalyticsAdapter.js +67 -46
  18. package/modules/atsAnalyticsAdapter.md +1 -0
  19. package/modules/beachfrontBidAdapter.js +14 -17
  20. package/modules/betweenBidAdapter.js +2 -1
  21. package/modules/browsiRtdProvider.js +106 -18
  22. package/modules/cleanioRtdProvider.js +192 -0
  23. package/modules/cleanioRtdProvider.md +59 -0
  24. package/modules/codefuelBidAdapter.js +1 -3
  25. package/modules/codefuelBidAdapter.md +3 -3
  26. package/modules/craftBidAdapter.js +5 -3
  27. package/modules/datablocksBidAdapter.js +3 -3
  28. package/modules/dchain.js +149 -0
  29. package/modules/dchain.md +45 -0
  30. package/modules/deepintentBidAdapter.js +1 -1
  31. package/modules/deltaprojectsBidAdapter.js +252 -0
  32. package/modules/deltaprojectsBidAdapter.md +32 -0
  33. package/modules/emx_digitalBidAdapter.js +9 -1
  34. package/modules/engageyaBidAdapter.js +68 -54
  35. package/modules/freewheel-sspBidAdapter.js +6 -0
  36. package/modules/glimpseBidAdapter.js +31 -16
  37. package/modules/goldbachBidAdapter.js +1176 -0
  38. package/modules/goldbachBidAdapter.md +151 -0
  39. package/modules/gptPreAuction.js +11 -5
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gumgumBidAdapter.js +5 -1
  42. package/modules/id5IdSystem.md +6 -6
  43. package/modules/imRtdProvider.js +31 -0
  44. package/modules/intersectionRtdProvider.js +114 -0
  45. package/modules/invibesBidAdapter.js +15 -9
  46. package/modules/ipromBidAdapter.js +79 -0
  47. package/modules/ixBidAdapter.js +173 -22
  48. package/modules/jixieBidAdapter.js +8 -2
  49. package/modules/justpremiumBidAdapter.js +6 -1
  50. package/modules/limelightDigitalBidAdapter.js +2 -1
  51. package/modules/livewrappedAnalyticsAdapter.js +5 -0
  52. package/modules/luponmediaBidAdapter.js +570 -0
  53. package/modules/merkleIdSystem.js +5 -0
  54. package/modules/missenaBidAdapter.js +89 -0
  55. package/modules/multibid/index.js +3 -3
  56. package/modules/nativoBidAdapter.js +32 -2
  57. package/modules/oguryBidAdapter.js +2 -1
  58. package/modules/openxBidAdapter.js +7 -2
  59. package/modules/operaadsBidAdapter.js +21 -1
  60. package/modules/otmBidAdapter.js +146 -0
  61. package/modules/otmBidAdapter.md +27 -26
  62. package/modules/outbrainBidAdapter.js +5 -0
  63. package/modules/playwireBidAdapter.md +61 -0
  64. package/modules/prebidServerBidAdapter/index.js +3 -3
  65. package/modules/pubmaticBidAdapter.js +5 -3
  66. package/modules/relaidoBidAdapter.js +86 -65
  67. package/modules/richaudienceBidAdapter.js +1 -1
  68. package/modules/rtdModule/index.js +2 -2
  69. package/modules/saambaaBidAdapter.js +420 -0
  70. package/modules/saambaaBidAdapter.md +65 -68
  71. package/modules/seedtagBidAdapter.js +6 -0
  72. package/modules/smaatoBidAdapter.js +9 -1
  73. package/modules/smartxBidAdapter.js +17 -1
  74. package/modules/sonobiBidAdapter.js +7 -0
  75. package/modules/sortableBidAdapter.js +1 -0
  76. package/modules/sspBCBidAdapter.js +34 -3
  77. package/modules/tappxBidAdapter.js +3 -1
  78. package/modules/teadsBidAdapter.js +3 -0
  79. package/modules/trustxBidAdapter.js +18 -7
  80. package/modules/undertoneBidAdapter.js +8 -1
  81. package/modules/userId/index.js +27 -2
  82. package/modules/ventes.md +71 -0
  83. package/modules/ventesBidAdapter.js +410 -0
  84. package/modules/ventesBidAdapter.md +93 -0
  85. package/modules/vidoomyBidAdapter.js +51 -100
  86. package/modules/visxBidAdapter.js +20 -3
  87. package/modules/visxBidAdapter.md +4 -6
  88. package/modules/yahoosspBidAdapter.js +6 -6
  89. package/modules/yahoosspBidAdapter.md +1 -1
  90. package/modules/yieldlabBidAdapter.js +41 -10
  91. package/modules/yieldlabBidAdapter.md +91 -48
  92. package/modules/yieldoneBidAdapter.js +115 -11
  93. package/package.json +6 -1
  94. package/src/adapterManager.js +14 -8
  95. package/src/auction.js +14 -13
  96. package/src/targeting.js +2 -2
  97. package/src/utils.js +7 -0
  98. package/test/spec/integration/faker/googletag.js +6 -0
  99. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  100. package/test/spec/modules/adnuntiusBidAdapter_spec.js +18 -0
  101. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  102. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  103. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  104. package/test/spec/modules/appnexusBidAdapter_spec.js +65 -2
  105. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  106. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  107. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  108. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  109. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  110. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  111. package/test/spec/modules/dchain_spec.js +329 -0
  112. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  113. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  114. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  115. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  116. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  117. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  118. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  119. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  120. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  121. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  122. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  123. package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
  124. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  125. package/test/spec/modules/ixBidAdapter_spec.js +288 -5
  126. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  127. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  128. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  129. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  130. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +23 -4
  131. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  132. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  133. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  134. package/test/spec/modules/multibid_spec.js +31 -31
  135. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  136. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  137. package/test/spec/modules/openxBidAdapter_spec.js +5 -26
  138. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  139. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  140. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  141. package/test/spec/modules/prebidServerBidAdapter_spec.js +19 -2
  142. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  143. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  144. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  145. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  146. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  147. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  148. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  149. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  150. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  151. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  152. package/test/spec/modules/trustxBidAdapter_spec.js +45 -3
  153. package/test/spec/modules/userId_spec.js +51 -0
  154. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  155. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  156. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  157. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  158. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  159. package/test/spec/unit/core/adapterManager_spec.js +26 -7
  160. package/test/spec/unit/core/targeting_spec.js +44 -0
  161. package/wdio.conf.js +1 -1
@@ -507,6 +507,17 @@ describe('S2S Adapter', function () {
507
507
  resetSyncedStatus();
508
508
  });
509
509
 
510
+ it('should set id to auction ID and source.tid to tid', function () {
511
+ config.setConfig({ s2sConfig: CONFIG });
512
+
513
+ adapter.callBids(OUTSTREAM_VIDEO_REQUEST, BID_REQUESTS, addBidResponse, done, ajax);
514
+
515
+ const requestBid = JSON.parse(server.requests[0].requestBody);
516
+ expect(requestBid.id).to.equal('173afb6d132ba3');
517
+ expect(requestBid.source).to.be.an('object');
518
+ expect(requestBid.source.tid).to.equal('437fbbf5-33f5-487a-8e16-a7112903cfe5');
519
+ });
520
+
510
521
  it('should block request if config did not define p1Consent URL in endpoint object config', function() {
511
522
  let badConfig = utils.deepClone(CONFIG);
512
523
  badConfig.endpoint = { noP1Consent: 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction' };
@@ -1705,7 +1716,7 @@ describe('S2S Adapter', function () {
1705
1716
  expect(parsedRequestBody.ext.prebid.channel).to.deep.equal({name: 'pbjs', version: 'v$prebid.version$'});
1706
1717
  });
1707
1718
 
1708
- it('does not set pbjs version in request if channel does exist in s2sConfig', () => {
1719
+ it('extPrebid is now mergedDeep -> should include default channel as well', () => {
1709
1720
  const s2sBidRequest = utils.deepClone(REQUEST);
1710
1721
  const bidRequests = utils.deepClone(BID_REQUESTS);
1711
1722
 
@@ -1714,7 +1725,13 @@ describe('S2S Adapter', function () {
1714
1725
  adapter.callBids(s2sBidRequest, bidRequests, addBidResponse, done, ajax);
1715
1726
 
1716
1727
  const parsedRequestBody = JSON.parse(server.requests[0].requestBody);
1717
- expect(parsedRequestBody.ext.prebid.channel).to.deep.equal({test: 1});
1728
+
1729
+ // extPrebid is now deep merged with
1730
+ expect(parsedRequestBody.ext.prebid.channel).to.deep.equal({
1731
+ name: 'pbjs',
1732
+ test: 1,
1733
+ version: 'v$prebid.version$'
1734
+ });
1718
1735
  });
1719
1736
 
1720
1737
  it('passes first party data in request', () => {
@@ -3457,7 +3457,7 @@ describe('PubMatic adapter', function () {
3457
3457
  'h': 0,
3458
3458
  'dealId': 'ASEA-MS-KLY-TTD-DESKTOP-ID-VID-6S-030420',
3459
3459
  'ext': {
3460
- 'BidType': 1
3460
+ 'bidtype': 1
3461
3461
  }
3462
3462
  }],
3463
3463
  'ext': {
@@ -57,23 +57,34 @@ describe('RelaidoAdapter', function () {
57
57
  serverResponse = {
58
58
  body: {
59
59
  status: 'ok',
60
- price: 500,
61
- model: 'vcpm',
62
- currency: 'JPY',
63
- creativeId: 1000,
64
- uuid: relaido_uuid,
65
- vast: '<VAST version="3.0"><Ad><InLine></InLine></Ad></VAST>',
60
+ ads: [{
61
+ placementId: 100000,
62
+ width: 640,
63
+ height: 360,
64
+ bidId: '2ed93003f7bb99',
65
+ price: 500,
66
+ model: 'vcpm',
67
+ currency: 'JPY',
68
+ creativeId: 1000,
69
+ vast: '<VAST version="3.0"><Ad><InLine></InLine></Ad></VAST>',
70
+ syncUrl: 'https://relaido/sync.html',
71
+ adomain: ['relaido.co.jp', 'www.cmertv.co.jp'],
72
+ mediaType: 'video'
73
+ }],
66
74
  playerUrl: 'https://relaido/player.js',
67
- syncUrl: 'https://relaido/sync.html',
68
- adomain: ['relaido.co.jp', 'www.cmertv.co.jp']
75
+ syncUrl: 'https://api-dev.ulizaex.com/tr/v1/prebid/sync.html',
76
+ uuid: relaido_uuid,
69
77
  }
70
78
  };
71
79
  serverRequest = {
72
- method: 'GET',
73
- bidId: bidRequest.bidId,
74
- width: bidRequest.mediaTypes.video.playerSize[0][0],
75
- height: bidRequest.mediaTypes.video.playerSize[0][1],
76
- mediaType: 'video',
80
+ method: 'POST',
81
+ data: {
82
+ bids: [{
83
+ bidId: bidRequest.bidId,
84
+ width: bidRequest.mediaTypes.video.playerSize[0][0],
85
+ height: bidRequest.mediaTypes.video.playerSize[0][1],
86
+ mediaType: 'video'}]
87
+ }
77
88
  };
78
89
  });
79
90
 
@@ -195,28 +206,23 @@ describe('RelaidoAdapter', function () {
195
206
  describe('spec.buildRequests', function () {
196
207
  it('should build bid requests by video', function () {
197
208
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
198
- expect(bidRequests).to.have.lengthOf(1);
199
- const request = bidRequests[0];
200
- expect(request.method).to.equal('GET');
201
- expect(request.url).to.equal('https://api.relaido.jp/bid/v1/prebid/100000');
202
- expect(request.bidId).to.equal(bidRequest.bidId);
203
- expect(request.width).to.equal(bidRequest.mediaTypes.video.playerSize[0][0]);
204
- expect(request.height).to.equal(bidRequest.mediaTypes.video.playerSize[0][1]);
205
- expect(request.mediaType).to.equal('video');
206
- expect(request.data.ref).to.equal(bidderRequest.refererInfo.referer);
207
- expect(request.data.timeout_ms).to.equal(bidderRequest.timeout);
208
- expect(request.data.ad_unit_code).to.equal(bidRequest.adUnitCode);
209
- expect(request.data.auction_id).to.equal(bidRequest.auctionId);
210
- expect(request.data.bidder).to.equal(bidRequest.bidder);
211
- expect(request.data.bidder_request_id).to.equal(bidRequest.bidderRequestId);
212
- expect(request.data.bid_requests_count).to.equal(bidRequest.bidRequestsCount);
213
- expect(request.data.bid_id).to.equal(bidRequest.bidId);
214
- expect(request.data.transaction_id).to.equal(bidRequest.transactionId);
215
- expect(request.data.media_type).to.equal('video');
216
- expect(request.data.uuid).to.equal(relaido_uuid);
217
- expect(request.data.width).to.equal(bidRequest.mediaTypes.video.playerSize[0][0]);
218
- expect(request.data.height).to.equal(bidRequest.mediaTypes.video.playerSize[0][1]);
219
- expect(request.data.pv).to.equal('$prebid.version$');
209
+ const data = JSON.parse(bidRequests.data);
210
+ expect(data.bids).to.have.lengthOf(1);
211
+ const request = data.bids[0];
212
+ expect(bidRequests.method).to.equal('POST');
213
+ expect(bidRequests.url).to.equal('https://api.relaido.jp/bid/v1/sprebid');
214
+ expect(data.ref).to.equal(bidderRequest.refererInfo.referer);
215
+ expect(data.timeout_ms).to.equal(bidderRequest.timeout);
216
+ expect(request.ad_unit_code).to.equal(bidRequest.adUnitCode);
217
+ expect(request.auction_id).to.equal(bidRequest.auctionId);
218
+ expect(data.bidder).to.equal(bidRequest.bidder);
219
+ expect(request.bidder_request_id).to.equal(bidRequest.bidderRequestId);
220
+ expect(data.bid_requests_count).to.equal(bidRequest.bidRequestsCount);
221
+ expect(request.bid_id).to.equal(bidRequest.bidId);
222
+ expect(request.transaction_id).to.equal(bidRequest.transactionId);
223
+ expect(request.media_type).to.equal('video');
224
+ expect(data.uuid).to.equal(relaido_uuid);
225
+ expect(data.pv).to.equal('$prebid.version$');
220
226
  });
221
227
 
222
228
  it('should build bid requests by banner', function () {
@@ -236,9 +242,10 @@ describe('RelaidoAdapter', function () {
236
242
  }
237
243
  };
238
244
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
239
- expect(bidRequests).to.have.lengthOf(1);
240
- const request = bidRequests[0];
241
- expect(request.mediaType).to.equal('banner');
245
+ const data = JSON.parse(bidRequests.data);
246
+ expect(data.bids).to.have.lengthOf(1);
247
+ const request = data.bids[0];
248
+ expect(request.media_type).to.equal('banner');
242
249
  });
243
250
 
244
251
  it('should take 1x1 size', function () {
@@ -258,17 +265,18 @@ describe('RelaidoAdapter', function () {
258
265
  }
259
266
  };
260
267
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
261
- expect(bidRequests).to.have.lengthOf(1);
262
- const request = bidRequests[0];
268
+ const data = JSON.parse(bidRequests.data);
269
+ expect(data.bids).to.have.lengthOf(1);
270
+ const request = data.bids[0];
263
271
 
264
272
  expect(request.width).to.equal(1);
265
273
  });
266
274
 
267
275
  it('The referrer should be the last', function () {
268
276
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
269
- expect(bidRequests).to.have.lengthOf(1);
270
- const request = bidRequests[0];
271
- const keys = Object.keys(request.data);
277
+ const data = JSON.parse(bidRequests.data);
278
+ expect(data.bids).to.have.lengthOf(1);
279
+ const keys = Object.keys(data);
272
280
  expect(keys[0]).to.equal('version');
273
281
  expect(keys[keys.length - 1]).to.equal('ref');
274
282
  });
@@ -277,9 +285,9 @@ describe('RelaidoAdapter', function () {
277
285
  bidRequest.userId = {}
278
286
  bidRequest.userId.imuid = 'i.tjHcK_7fTcqnbrS_YA2vaw';
279
287
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
280
- expect(bidRequests).to.have.lengthOf(1);
281
- const request = bidRequests[0];
282
- expect(request.data.imuid).to.equal('i.tjHcK_7fTcqnbrS_YA2vaw');
288
+ const data = JSON.parse(bidRequests.data);
289
+ expect(data.bids).to.have.lengthOf(1);
290
+ expect(data.imuid).to.equal('i.tjHcK_7fTcqnbrS_YA2vaw');
283
291
  });
284
292
  });
285
293
 
@@ -288,29 +296,29 @@ describe('RelaidoAdapter', function () {
288
296
  const bidResponses = spec.interpretResponse(serverResponse, serverRequest);
289
297
  expect(bidResponses).to.have.lengthOf(1);
290
298
  const response = bidResponses[0];
291
- expect(response.requestId).to.equal(serverRequest.bidId);
292
- expect(response.width).to.equal(serverRequest.width);
293
- expect(response.height).to.equal(serverRequest.height);
294
- expect(response.cpm).to.equal(serverResponse.body.price);
295
- expect(response.currency).to.equal(serverResponse.body.currency);
296
- expect(response.creativeId).to.equal(serverResponse.body.creativeId);
297
- expect(response.vastXml).to.equal(serverResponse.body.vast);
298
- expect(response.meta.advertiserDomains).to.equal(serverResponse.body.adomain);
299
+ expect(response.requestId).to.equal(serverRequest.data.bids[0].bidId);
300
+ expect(response.width).to.equal(serverRequest.data.bids[0].width);
301
+ expect(response.height).to.equal(serverRequest.data.bids[0].height);
302
+ expect(response.cpm).to.equal(serverResponse.body.ads[0].price);
303
+ expect(response.currency).to.equal(serverResponse.body.ads[0].currency);
304
+ expect(response.creativeId).to.equal(serverResponse.body.ads[0].creativeId);
305
+ expect(response.vastXml).to.equal(serverResponse.body.ads[0].vast);
306
+ expect(response.meta.advertiserDomains).to.equal(serverResponse.body.ads[0].adomain);
299
307
  expect(response.meta.mediaType).to.equal(VIDEO);
300
308
  expect(response.ad).to.be.undefined;
301
309
  });
302
310
 
303
311
  it('should build bid response by banner', function () {
304
- serverRequest.mediaType = 'banner';
312
+ serverResponse.body.ads[0].mediaType = 'banner';
305
313
  const bidResponses = spec.interpretResponse(serverResponse, serverRequest);
306
314
  expect(bidResponses).to.have.lengthOf(1);
307
315
  const response = bidResponses[0];
308
- expect(response.requestId).to.equal(serverRequest.bidId);
309
- expect(response.width).to.equal(serverRequest.width);
310
- expect(response.height).to.equal(serverRequest.height);
311
- expect(response.cpm).to.equal(serverResponse.body.price);
312
- expect(response.currency).to.equal(serverResponse.body.currency);
313
- expect(response.creativeId).to.equal(serverResponse.body.creativeId);
316
+ expect(response.requestId).to.equal(serverRequest.data.bids[0].bidId);
317
+ expect(response.width).to.equal(serverRequest.data.bids[0].width);
318
+ expect(response.height).to.equal(serverRequest.data.bids[0].height);
319
+ expect(response.cpm).to.equal(serverResponse.body.ads[0].price);
320
+ expect(response.currency).to.equal(serverResponse.body.ads[0].currency);
321
+ expect(response.creativeId).to.equal(serverResponse.body.ads[0].creativeId);
314
322
  expect(response.vastXml).to.be.undefined;
315
323
  expect(response.ad).to.include(`<div id="rop-prebid">`);
316
324
  expect(response.ad).to.include(`<script src="https://relaido/player.js"></script>`);
@@ -370,8 +378,8 @@ describe('RelaidoAdapter', function () {
370
378
  it('Should create nurl pixel if bid nurl', function () {
371
379
  let bid = {
372
380
  bidder: bidRequest.bidder,
373
- creativeId: serverResponse.body.creativeId,
374
- cpm: serverResponse.body.price,
381
+ creativeId: serverResponse.body.ads[0].creativeId,
382
+ cpm: serverResponse.body.ads[0].price,
375
383
  params: [bidRequest.params],
376
384
  auctionId: bidRequest.auctionId,
377
385
  requestId: bidRequest.bidId,
@@ -274,6 +274,9 @@ describe('Seedtag Adapter', function() {
274
274
  expect(data.ga).to.equal(true)
275
275
  expect(data.cd).to.equal('consentString')
276
276
  })
277
+ it('should expose gvlid', function() {
278
+ expect(spec.gvlid).to.equal(157)
279
+ })
277
280
  })
278
281
  })
279
282
 
@@ -287,6 +287,23 @@ describe('smaatoBidAdapterTest', () => {
287
287
  expect(req.regs.ext.us_privacy).to.equal('uspConsentString');
288
288
  });
289
289
 
290
+ it('sends no schain if no schain exists', () => {
291
+ const reqs = spec.buildRequests([singleBannerBidRequest], defaultBidderRequest);
292
+
293
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
294
+ expect(req.source.ext.schain).to.not.exist;
295
+ });
296
+
297
+ it('sends instl if instl exists', () => {
298
+ const instl = { instl: 1 };
299
+ const bidRequestWithInstl = Object.assign({}, singleBannerBidRequest, {ortb2Imp: instl});
300
+
301
+ const reqs = spec.buildRequests([bidRequestWithInstl], defaultBidderRequest);
302
+
303
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
304
+ expect(req.imp[0].instl).to.equal(1);
305
+ });
306
+
290
307
  it('sends tmax', () => {
291
308
  const reqs = spec.buildRequests([singleBannerBidRequest], defaultBidderRequest);
292
309
 
@@ -435,6 +452,16 @@ describe('smaatoBidAdapterTest', () => {
435
452
  expect(req.imp[0].bidfloor).to.be.equal(0.456);
436
453
  });
437
454
 
455
+ it('sends instl if instl exists', () => {
456
+ const instl = { instl: 1 };
457
+ const bidRequestWithInstl = Object.assign({}, singleVideoBidRequest, {ortb2Imp: instl});
458
+
459
+ const reqs = spec.buildRequests([bidRequestWithInstl], defaultBidderRequest);
460
+
461
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
462
+ expect(req.imp[0].instl).to.equal(1);
463
+ });
464
+
438
465
  it('splits multi format bid requests', () => {
439
466
  const combinedBannerAndVideoBidRequest = {
440
467
  bidder: 'smaato',
@@ -516,6 +543,17 @@ describe('smaatoBidAdapterTest', () => {
516
543
  expect(req.imp[1].video.sequence).to.be.equal(2);
517
544
  });
518
545
 
546
+ it('sends instl if instl exists', () => {
547
+ const instl = { instl: 1 };
548
+ const bidRequestWithInstl = Object.assign({}, longFormVideoBidRequest, {ortb2Imp: instl});
549
+
550
+ const reqs = spec.buildRequests([bidRequestWithInstl], defaultBidderRequest);
551
+
552
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
553
+ expect(req.imp[0].instl).to.equal(1);
554
+ expect(req.imp[1].instl).to.equal(1);
555
+ });
556
+
519
557
  it('sends bidfloor when configured', () => {
520
558
  const longFormVideoBidRequestWithFloor = Object.assign({}, longFormVideoBidRequest);
521
559
  longFormVideoBidRequestWithFloor.getFloor = function(arg) {
@@ -854,6 +892,29 @@ describe('smaatoBidAdapterTest', () => {
854
892
  expect(req.user.ext.eids).to.have.length(2);
855
893
  });
856
894
  });
895
+
896
+ describe('schain in request', () => {
897
+ it('schain is added to source.ext.schain', () => {
898
+ const schain = {
899
+ ver: '1.0',
900
+ complete: 1,
901
+ nodes: [
902
+ {
903
+ 'asi': 'asi',
904
+ 'sid': 'sid',
905
+ 'rid': 'rid',
906
+ 'hp': 1
907
+ }
908
+ ]
909
+ };
910
+ const bidRequestWithSchain = Object.assign({}, singleBannerBidRequest, {schain: schain});
911
+
912
+ const reqs = spec.buildRequests([bidRequestWithSchain], defaultBidderRequest);
913
+
914
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
915
+ expect(req.source.ext.schain).to.deep.equal(schain);
916
+ });
917
+ });
857
918
  });
858
919
 
859
920
  describe('interpretResponse', () => {
@@ -189,6 +189,14 @@ describe('The smartx adapter', function () {
189
189
  domain: '',
190
190
  publisher: {
191
191
  id: '__name__'
192
+ },
193
+ content: {
194
+ ext: {
195
+ prebid: {
196
+ name: 'pbjs',
197
+ version: '$prebid.version$'
198
+ }
199
+ }
192
200
  }
193
201
  });
194
202
  });
@@ -525,6 +533,7 @@ describe('The smartx adapter', function () {
525
533
  bidderRequestObj.bidRequest.bids[0].params.outstream_options.title = 'abc';
526
534
  bidderRequestObj.bidRequest.bids[0].params.outstream_options.skipOffset = 2;
527
535
  bidderRequestObj.bidRequest.bids[0].params.outstream_options.desiredBitrate = 123;
536
+ bidderRequestObj.bidRequest.bids[0].params.outstream_options.visibilityThreshold = 30;
528
537
 
529
538
  responses[0].renderer.render(responses[0]);
530
539
 
@@ -238,14 +238,17 @@ describe('SonobiBidAdapter', function () {
238
238
  });
239
239
 
240
240
  describe('.buildRequests', function () {
241
+ let sandbox;
241
242
  beforeEach(function() {
242
243
  sinon.stub(userSync, 'canBidderRegisterSync');
243
244
  sinon.stub(utils, 'getGptSlotInfoForAdUnitCode')
244
- .onFirstCall().returns({gptSlot: '/123123/gpt_publisher/adunit-code-3', divId: 'adunit-code-3-div-id'})
245
+ .onFirstCall().returns({gptSlot: '/123123/gpt_publisher/adunit-code-3', divId: 'adunit-code-3-div-id'});
246
+ sandbox = sinon.createSandbox();
245
247
  });
246
248
  afterEach(function() {
247
249
  userSync.canBidderRegisterSync.restore();
248
250
  utils.getGptSlotInfoForAdUnitCode.restore();
251
+ sandbox.restore();
249
252
  });
250
253
  let bidRequest = [{
251
254
  'schain': {
@@ -333,6 +336,36 @@ describe('SonobiBidAdapter', function () {
333
336
  uspConsent: 'someCCPAString'
334
337
  };
335
338
 
339
+ it('should set fpd if there is any data in ortb2', function() {
340
+ const ortb2 = {
341
+ site: {
342
+ ext: {
343
+ data: {
344
+ pageType: 'article',
345
+ category: 'tools'
346
+ }
347
+ }
348
+ },
349
+ user: {
350
+ ext: {
351
+ data: {
352
+ registered: true,
353
+ interests: ['cars']
354
+ }
355
+ }
356
+ }
357
+ };
358
+
359
+ sandbox.stub(config, 'getConfig').callsFake(key => {
360
+ const config = {
361
+ ortb2: ortb2
362
+ };
363
+ return utils.deepAccess(config, key);
364
+ });
365
+ const bidRequests = spec.buildRequests(bidRequest, bidderRequests);
366
+ expect(bidRequests.data.fpd).to.equal(JSON.stringify(ortb2));
367
+ });
368
+
336
369
  it('should populate coppa as 1 if set in config', function () {
337
370
  config.setConfig({coppa: true});
338
371
  const bidRequests = spec.buildRequests(bidRequest, bidderRequests);
@@ -112,6 +112,13 @@ describe('sortableBidAdapter', function() {
112
112
  'key2': 'val2'
113
113
  }
114
114
  },
115
+ 'ortb2Imp': {
116
+ 'ext': {
117
+ 'data': {
118
+ 'pbadslot': 'abc/123'
119
+ }
120
+ }
121
+ },
115
122
  'sizes': [
116
123
  [300, 250]
117
124
  ],
@@ -176,6 +183,10 @@ describe('sortableBidAdapter', function() {
176
183
  expect(requestBody.imp[0].floor).to.equal(0.21);
177
184
  });
178
185
 
186
+ it('includes pbadslot in the bid request', function () {
187
+ expect(requestBody.imp[0].ext.gpid).to.equal('abc/123');
188
+ });
189
+
179
190
  it('sets domain and href correctly', function () {
180
191
  expect(requestBody.site.domain).to.equal('example.com');
181
192
  expect(requestBody.site.page).to.equal('http://example.com/page?param=val');
@@ -518,6 +518,33 @@ describe('SSPBC adapter', function () {
518
518
  expect(payload.user).to.be.an('object').and.to.have.property('[ortb_extensions.consent]', bidRequest.gdprConsent.consentString);
519
519
  });
520
520
 
521
+ it('should send net info and pvid', function () {
522
+ expect(payload.user).to.be.an('object').and.to.have.property('data').that.is.an('array');
523
+
524
+ const userData = payload.user.data;
525
+ expect(userData.length).to.equal(2);
526
+
527
+ const netInfo = userData[0];
528
+ expect(netInfo.id).to.equal('12');
529
+ expect(netInfo.name).to.equal('NetInfo');
530
+ expect(netInfo).to.have.property('segment').that.is.an('array');
531
+
532
+ const pvid = userData[1];
533
+ expect(pvid.id).to.equal('7');
534
+ expect(pvid.name).to.equal('pvid');
535
+ expect(pvid).to.have.property('segment').that.is.an('array');
536
+ expect(pvid.segment[0]).to.have.property('value');
537
+ });
538
+
539
+ it('pvid should be constant on a single page view', function () {
540
+ const userData1 = payload.user.data;
541
+ const userData2 = payloadNative.user.data;
542
+ const pvid1 = userData1[1];
543
+ const pvid2 = userData2[1];
544
+
545
+ expect(pvid1.segment[0].value).to.equal(pvid2.segment[0].value);
546
+ });
547
+
521
548
  it('should build correct native payload', function () {
522
549
  const nativeAssets = payloadNative.imp && payloadNative.imp[0].native.request;
523
550
 
@@ -543,13 +570,16 @@ describe('SSPBC adapter', function () {
543
570
  expect(videoAssets).to.have.property('api').that.is.an('array');
544
571
  });
545
572
 
546
- it('should create auxilary placement identifier (size_numUsed)', function () {
573
+ it('should create auxilary placement identifier (size_numUsed), that is constant for a given adUnit', function () {
547
574
  const extAssets1 = payload.imp && payload.imp[0].ext.data;
548
575
  const extAssets2 = payloadSingle.imp && payloadSingle.imp[0].ext.data;
549
576
 
550
- // note that payload comes from first, and payloadSingle from second auction in the test run
577
+ /*
578
+ note that payload comes from first, and payloadSingle from second auction in the test run
579
+ also, since both have same adUnitName, value of pbsize property should be the same
580
+ */
551
581
  expect(extAssets1).to.have.property('pbsize').that.equals('750x200_1')
552
- expect(extAssets2).to.have.property('pbsize').that.equals('750x200_2')
582
+ expect(extAssets2).to.have.property('pbsize').that.equals('750x200_1')
553
583
  });
554
584
  });
555
585
 
@@ -183,6 +183,10 @@ describe('Tappx bid adapter', function () {
183
183
  badBidRequest_v.bids.mediaTypes.video.playerSize = [320, 250];
184
184
  assert.isFalse(spec.isBidRequestValid(badBidRequest_v.bids));
185
185
  });
186
+
187
+ it('should export the TCF vendor ID', function () {
188
+ expect(spec.gvlid).to.equal(628);
189
+ })
186
190
  });
187
191
 
188
192
  /**
@@ -582,6 +582,138 @@ describe('teadsBidAdapter', () => {
582
582
  });
583
583
  });
584
584
 
585
+ describe('Global Placement Id', function () {
586
+ let bidRequests = [
587
+ {
588
+ 'bidder': 'teads',
589
+ 'params': {
590
+ 'placementId': 10433394,
591
+ 'pageId': 1234
592
+ },
593
+ 'adUnitCode': 'adunit-code-1',
594
+ 'sizes': [[300, 250], [300, 600]],
595
+ 'bidId': '30b31c1838de1e',
596
+ 'bidderRequestId': '22edbae2733bf6',
597
+ 'auctionId': '1d1a030790a475',
598
+ 'creativeId': 'er2ee',
599
+ 'deviceWidth': 1680
600
+ },
601
+ {
602
+ 'bidder': 'teads',
603
+ 'params': {
604
+ 'placementId': 10433395,
605
+ 'pageId': 1234
606
+ },
607
+ 'adUnitCode': 'adunit-code-2',
608
+ 'sizes': [[300, 250], [300, 600]],
609
+ 'bidId': '30b31c1838de1f',
610
+ 'bidderRequestId': '22edbae2733bf6',
611
+ 'auctionId': '1d1a030790a475',
612
+ 'creativeId': 'er2ef',
613
+ 'deviceWidth': 1680
614
+ }
615
+ ];
616
+
617
+ it('should add gpid if ortb2Imp.ext.data.pbadslot is present and is non empty (and ortb2Imp.ext.data.adserver.adslot is not present)', function () {
618
+ const updatedBidRequests = bidRequests.map(function(bidRequest, index) {
619
+ return {
620
+ ...bidRequest,
621
+ ortb2Imp: {
622
+ ext: {
623
+ data: {
624
+ pbadslot: '1111/home-left-' + index
625
+ }
626
+ }
627
+ }
628
+ };
629
+ }
630
+ );
631
+ const request = spec.buildRequests(updatedBidRequests, bidderResquestDefault);
632
+ const payload = JSON.parse(request.data);
633
+
634
+ expect(payload.data[0].gpid).to.equal('1111/home-left-0');
635
+ expect(payload.data[1].gpid).to.equal('1111/home-left-1');
636
+ });
637
+
638
+ it('should add gpid if ortb2Imp.ext.data.pbadslot is present and is non empty (even if ortb2Imp.ext.data.adserver.adslot is present and is non empty too)', function () {
639
+ const updatedBidRequests = bidRequests.map(function(bidRequest, index) {
640
+ return {
641
+ ...bidRequest,
642
+ ortb2Imp: {
643
+ ext: {
644
+ data: {
645
+ pbadslot: '1111/home-left-' + index,
646
+ adserver: {
647
+ adslot: '1111/home-left/div-' + index
648
+ }
649
+ }
650
+ }
651
+ }
652
+ };
653
+ }
654
+ );
655
+ const request = spec.buildRequests(updatedBidRequests, bidderResquestDefault);
656
+ const payload = JSON.parse(request.data);
657
+
658
+ expect(payload.data[0].gpid).to.equal('1111/home-left-0');
659
+ expect(payload.data[1].gpid).to.equal('1111/home-left-1');
660
+ });
661
+
662
+ it('should not add gpid if both ortb2Imp.ext.data.pbadslot and ortb2Imp.ext.data.adserver.adslot are present but empty', function () {
663
+ const updatedBidRequests = bidRequests.map(bidRequest => ({
664
+ ...bidRequest,
665
+ ortb2Imp: {
666
+ ext: {
667
+ data: {
668
+ pbadslot: '',
669
+ adserver: {
670
+ adslot: ''
671
+ }
672
+ }
673
+ }
674
+ }
675
+ }));
676
+
677
+ const request = spec.buildRequests(updatedBidRequests, bidderResquestDefault);
678
+ const payload = JSON.parse(request.data);
679
+
680
+ return payload.data.forEach(bid => {
681
+ expect(bid).not.to.have.property('gpid');
682
+ });
683
+ });
684
+
685
+ it('should not add gpid if both ortb2Imp.ext.data.pbadslot and ortb2Imp.ext.data.adserver.adslot are not present', function () {
686
+ const request = spec.buildRequests(bidRequests, bidderResquestDefault);
687
+ const payload = JSON.parse(request.data);
688
+
689
+ return payload.data.forEach(bid => {
690
+ expect(bid).not.to.have.property('gpid');
691
+ });
692
+ });
693
+
694
+ it('should add gpid if ortb2Imp.ext.data.pbadslot is not present but ortb2Imp.ext.data.adserver.adslot is present and is non empty', function () {
695
+ const updatedBidRequests = bidRequests.map(function(bidRequest, index) {
696
+ return {
697
+ ...bidRequest,
698
+ ortb2Imp: {
699
+ ext: {
700
+ data: {
701
+ adserver: {
702
+ adslot: '1111/home-left-' + index
703
+ }
704
+ }
705
+ }
706
+ }
707
+ };
708
+ });
709
+ const request = spec.buildRequests(updatedBidRequests, bidderResquestDefault);
710
+ const payload = JSON.parse(request.data);
711
+
712
+ expect(payload.data[0].gpid).to.equal('1111/home-left-0');
713
+ expect(payload.data[1].gpid).to.equal('1111/home-left-1');
714
+ });
715
+ });
716
+
585
717
  function checkMediaTypesSizes(mediaTypes, expectedSizes) {
586
718
  const bidRequestWithBannerSizes = Object.assign(bidRequests[0], mediaTypes);
587
719
  const requestWithBannerSizes = spec.buildRequests([bidRequestWithBannerSizes], bidderResquestDefault);