prebid.js 6.24.0 → 6.26.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 (178) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adgenerationBidAdapter.js +1 -1
  5. package/dist/adrelevantisBidAdapter.js +1 -1
  6. package/dist/adtelligentBidAdapter.js +1 -1
  7. package/dist/adxcgBidAdapter.js +1 -1
  8. package/dist/adyoulikeBidAdapter.js +1 -1
  9. package/dist/ajaBidAdapter.js +1 -1
  10. package/dist/amxBidAdapter.js +1 -1
  11. package/dist/amxIdSystem.js +1 -1
  12. package/dist/appierAnalyticsAdapter.js +1 -1
  13. package/dist/appnexusBidAdapter.js +1 -1
  14. package/dist/asoBidAdapter.js +1 -1
  15. package/dist/audiencerunBidAdapter.js +1 -1
  16. package/dist/axonixBidAdapter.js +1 -1
  17. package/dist/beopBidAdapter.js +1 -1
  18. package/dist/bidglassBidAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bluebillywigBidAdapter.js +1 -1
  21. package/dist/bridgewellBidAdapter.js +1 -1
  22. package/dist/brightMountainMediaBidAdapter.js +1 -1
  23. package/dist/concertBidAdapter.js +1 -1
  24. package/dist/connectadBidAdapter.js +1 -1
  25. package/dist/consumableBidAdapter.js +1 -1
  26. package/dist/conversantBidAdapter.js +1 -1
  27. package/dist/cpexIdSystem.js +1 -1
  28. package/dist/craftBidAdapter.js +1 -1
  29. package/dist/criteoBidAdapter.js +1 -1
  30. package/dist/currency.js +1 -1
  31. package/dist/dfpAdServerVideo.js +1 -1
  32. package/dist/dspxBidAdapter.js +1 -1
  33. package/dist/eplanningBidAdapter.js +1 -1
  34. package/dist/glimpseBidAdapter.js +1 -1
  35. package/dist/gmosspBidAdapter.js +1 -1
  36. package/dist/goldbachBidAdapter.js +1 -1
  37. package/dist/gravitoIdSystem.js +1 -0
  38. package/dist/gridBidAdapter.js +1 -1
  39. package/dist/gridNMBidAdapter.js +1 -1
  40. package/dist/gumgumBidAdapter.js +1 -1
  41. package/dist/h12mediaBidAdapter.js +1 -1
  42. package/dist/id5IdSystem.js +1 -1
  43. package/dist/impactifyBidAdapter.js +1 -1
  44. package/dist/improvedigitalBidAdapter.js +1 -1
  45. package/dist/inmarBidAdapter.js +1 -1
  46. package/dist/insticatorBidAdapter.js +1 -1
  47. package/dist/invibesBidAdapter.js +1 -1
  48. package/dist/ixBidAdapter.js +1 -1
  49. package/dist/jixieBidAdapter.js +1 -1
  50. package/dist/justpremiumBidAdapter.js +1 -1
  51. package/dist/kargoBidAdapter.js +1 -1
  52. package/dist/konduitAnalyticsAdapter.js +1 -1
  53. package/dist/liveIntentIdSystem.js +1 -1
  54. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  55. package/dist/logicadBidAdapter.js +1 -1
  56. package/dist/loglyliftBidAdapter.js +1 -1
  57. package/dist/malltvAnalyticsAdapter.js +1 -1
  58. package/dist/marsmediaBidAdapter.js +1 -1
  59. package/dist/mediafuseBidAdapter.js +1 -1
  60. package/dist/mediakeysBidAdapter.js +1 -1
  61. package/dist/mediasquareBidAdapter.js +1 -1
  62. package/dist/mgidBidAdapter.js +1 -1
  63. package/dist/minutemediaBidAdapter.js +1 -1
  64. package/dist/not-for-prod/prebid.js +123 -121
  65. package/dist/oguryBidAdapter.js +1 -1
  66. package/dist/oneVideoBidAdapter.js +1 -1
  67. package/dist/onetagBidAdapter.js +1 -1
  68. package/dist/ooloAnalyticsAdapter.js +1 -1
  69. package/dist/outbrainBidAdapter.js +1 -1
  70. package/dist/parrableIdSystem.js +1 -1
  71. package/dist/pixfutureBidAdapter.js +1 -1
  72. package/dist/prebid-core.js +3 -3
  73. package/dist/publinkIdSystem.js +1 -1
  74. package/dist/pubmaticBidAdapter.js +1 -1
  75. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  76. package/dist/pxyzBidAdapter.js +1 -1
  77. package/dist/quantcastBidAdapter.js +1 -1
  78. package/dist/readpeakBidAdapter.js +1 -1
  79. package/dist/relaidoBidAdapter.js +1 -1
  80. package/dist/rhythmoneBidAdapter.js +1 -1
  81. package/dist/riseBidAdapter.js +1 -1
  82. package/dist/rubiconAnalyticsAdapter.js +1 -1
  83. package/dist/rubiconBidAdapter.js +1 -1
  84. package/dist/seedingAllianceBidAdapter.js +1 -1
  85. package/dist/seedtagBidAdapter.js +1 -1
  86. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  87. package/dist/sharethroughBidAdapter.js +1 -1
  88. package/dist/smaatoBidAdapter.js +1 -1
  89. package/dist/smartadserverBidAdapter.js +1 -1
  90. package/dist/smartxBidAdapter.js +1 -1
  91. package/dist/smilewantedBidAdapter.js +1 -1
  92. package/dist/sonobiBidAdapter.js +1 -1
  93. package/dist/sortableBidAdapter.js +1 -1
  94. package/dist/sovrnAnalyticsAdapter.js +1 -1
  95. package/dist/sovrnBidAdapter.js +1 -1
  96. package/dist/sspBCBidAdapter.js +1 -1
  97. package/dist/sublimeBidAdapter.js +1 -1
  98. package/dist/synacormediaBidAdapter.js +1 -1
  99. package/dist/targetVideoBidAdapter.js +1 -1
  100. package/dist/teadsBidAdapter.js +1 -1
  101. package/dist/trionBidAdapter.js +1 -1
  102. package/dist/tripleliftBidAdapter.js +1 -1
  103. package/dist/trustpidSystem.js +1 -1
  104. package/dist/trustxBidAdapter.js +1 -1
  105. package/dist/ttdBidAdapter.js +1 -1
  106. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  107. package/dist/underdogmediaBidAdapter.js +1 -1
  108. package/dist/undertoneBidAdapter.js +1 -1
  109. package/dist/userId.js +1 -1
  110. package/dist/vidazooBidAdapter.js +1 -1
  111. package/dist/videobyteBidAdapter.js +1 -1
  112. package/dist/videoheroesBidAdapter.js +1 -0
  113. package/dist/vidoomyBidAdapter.js +1 -1
  114. package/dist/visxBidAdapter.js +1 -1
  115. package/dist/vuukleBidAdapter.js +1 -1
  116. package/dist/weboramaRtdProvider.js +1 -1
  117. package/dist/widespaceBidAdapter.js +1 -1
  118. package/dist/winrBidAdapter.js +1 -1
  119. package/dist/yahoosspBidAdapter.js +1 -1
  120. package/dist/yieldmoBidAdapter.js +1 -1
  121. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  122. package/dist/zeta_global_sspBidAdapter.js +1 -1
  123. package/integrationExamples/gpt/userId_example.html +3 -0
  124. package/integrationExamples/gpt/weboramaRtdProvider_example.html +65 -11
  125. package/modules/.submodules.json +2 -1
  126. package/modules/adagioBidAdapter.js +2 -0
  127. package/modules/adtelligentBidAdapter.js +3 -1
  128. package/modules/alkimiBidAdapter.md +10 -4
  129. package/modules/appnexusBidAdapter.js +13 -2
  130. package/modules/beopBidAdapter.js +51 -6
  131. package/modules/cpexIdSystem.js +1 -2
  132. package/modules/currency.js +4 -13
  133. package/modules/dacIdSystem.md +4 -4
  134. package/modules/dfpAdServerVideo.js +8 -0
  135. package/modules/gravitoIdSystem.js +57 -0
  136. package/modules/gravitoIdSystem.md +28 -0
  137. package/modules/improvedigitalBidAdapter.js +100 -43
  138. package/modules/invibesBidAdapter.js +55 -34
  139. package/modules/ixBidAdapter.js +62 -26
  140. package/modules/ixBidAdapter.md +42 -42
  141. package/modules/jixieBidAdapter.js +2 -0
  142. package/modules/kargoBidAdapter.js +23 -8
  143. package/modules/oguryBidAdapter.js +27 -1
  144. package/modules/trustpidSystem.js +9 -28
  145. package/modules/trustpidSystem.md +11 -34
  146. package/modules/userId/eids.js +6 -0
  147. package/modules/userId/index.js +30 -55
  148. package/modules/userId/userId.md +3 -11
  149. package/modules/videoheroesBidAdapter.js +267 -0
  150. package/modules/videoheroesBidAdapter.md +134 -0
  151. package/modules/vidoomyBidAdapter.js +2 -6
  152. package/modules/weboramaRtdProvider.js +515 -241
  153. package/modules/weboramaRtdProvider.md +488 -51
  154. package/modules/zeta_global_sspBidAdapter.js +1 -1
  155. package/package.json +4 -4
  156. package/src/adserver.js +7 -0
  157. package/src/hook.js +19 -1
  158. package/src/utils/promise.js +36 -0
  159. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  160. package/test/spec/modules/appnexusBidAdapter_spec.js +37 -10
  161. package/test/spec/modules/beopBidAdapter_spec.js +15 -2
  162. package/test/spec/modules/dfpAdServerVideo_spec.js +45 -0
  163. package/test/spec/modules/gravitoIdSystem_spec.js +51 -0
  164. package/test/spec/modules/improvedigitalBidAdapter_spec.js +289 -72
  165. package/test/spec/modules/invibesBidAdapter_spec.js +98 -7
  166. package/test/spec/modules/ixBidAdapter_spec.js +132 -26
  167. package/test/spec/modules/jixieBidAdapter_spec.js +17 -0
  168. package/test/spec/modules/kargoBidAdapter_spec.js +45 -3
  169. package/test/spec/modules/liveIntentIdSystem_spec.js +2 -2
  170. package/test/spec/modules/loglyliftBidAdapter_spec.js +8 -0
  171. package/test/spec/modules/oguryBidAdapter_spec.js +181 -3
  172. package/test/spec/modules/trustpidSystem_spec.js +42 -19
  173. package/test/spec/modules/userId_spec.js +18 -0
  174. package/test/spec/modules/videoheroesBidAdapter_spec.js +363 -0
  175. package/test/spec/modules/weboramaRtdProvider_spec.js +2333 -266
  176. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +37 -24
  177. package/test/spec/unit/utils/promise_spec.js +49 -0
  178. package/test/spec/modules/medianetRtdProvider_spec.js +0 -146
@@ -1,4 +1,5 @@
1
1
  import {expect} from 'chai';
2
+ import { config } from 'src/config.js';
2
3
  import {spec, resetInvibes, stubDomainOptions, readGdprConsent} from 'modules/invibesBidAdapter.js';
3
4
 
4
5
  describe('invibesBidAdapter:', function () {
@@ -93,6 +94,17 @@ describe('invibesBidAdapter:', function () {
93
94
  }
94
95
  };
95
96
 
97
+ let SetBidderAccess = function() {
98
+ config.setConfig({
99
+ deviceAccess: true
100
+ });
101
+ $$PREBID_GLOBAL$$.bidderSettings = {
102
+ invibes: {
103
+ storageAllowed: true
104
+ }
105
+ };
106
+ }
107
+
96
108
  beforeEach(function () {
97
109
  resetInvibes();
98
110
  document.cookie = '';
@@ -100,6 +112,7 @@ describe('invibesBidAdapter:', function () {
100
112
  });
101
113
 
102
114
  afterEach(function () {
115
+ $$PREBID_GLOBAL$$.bidderSettings = {};
103
116
  this.cStub1.restore();
104
117
  });
105
118
 
@@ -296,13 +309,40 @@ describe('invibesBidAdapter:', function () {
296
309
  top.window.invibes.optIn = 1;
297
310
  top.window.invibes.purposes = [true, false, false, false, false, false, false, false, false, false];
298
311
  localStorage.ivvcap = '{"9731":[1,1768600800000]}';
312
+ SetBidderAccess();
313
+
299
314
  const request = spec.buildRequests(bidRequests, {auctionStart: Date.now()});
315
+
300
316
  expect(request.data.capCounts).to.equal('9731=1');
301
317
  });
302
318
 
303
319
  it('does not have capped ids if local storage variable is correctly formatted but no opt in', function () {
320
+ let bidderRequest = {
321
+ auctionStart: Date.now(),
322
+ gdprConsent: {
323
+ vendorData: {
324
+ gdprApplies: true,
325
+ hasGlobalConsent: false,
326
+ purpose: {
327
+ consents: {
328
+ 1: false,
329
+ 2: false,
330
+ 3: false,
331
+ 4: false,
332
+ 5: false,
333
+ 6: false,
334
+ 7: false,
335
+ 8: false,
336
+ 9: false,
337
+ 10: false
338
+ }
339
+ }
340
+ }
341
+ }
342
+ };
343
+
304
344
  localStorage.ivvcap = '{"9731":[1,1768600800000]}';
305
- const request = spec.buildRequests(bidRequests, {auctionStart: Date.now()});
345
+ const request = spec.buildRequests(bidRequests, bidderRequest);
306
346
  expect(request.data.capCounts).to.equal('');
307
347
  });
308
348
 
@@ -369,6 +409,8 @@ describe('invibesBidAdapter:', function () {
369
409
  top.window.invibes.purposes = [true, false, false, false, false, false, false, false, false, false];
370
410
  global.document.cookie = 'ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}';
371
411
  let bidderRequest = {gdprConsent: {vendorData: {vendorConsents: {436: true}}}};
412
+ SetBidderAccess();
413
+
372
414
  let request = spec.buildRequests(bidRequests, bidderRequest);
373
415
  expect(request.data.lId).to.exist;
374
416
  });
@@ -496,7 +538,7 @@ describe('invibesBidAdapter:', function () {
496
538
  let request = spec.buildRequests(bidRequests, bidderRequest);
497
539
  expect(request.data.li.split(',')[1] && request.data.li.split(',')[6]).to.equal('true');
498
540
  });
499
- it('should send oi = 0 when vendorData is null', function () {
541
+ it('should send oi = 1 when vendorData is null (calculation will be performed by ADWEB)', function () {
500
542
  let bidderRequest = {
501
543
  gdprConsent: {
502
544
  vendorData: null
@@ -962,7 +1004,29 @@ describe('invibesBidAdapter:', function () {
962
1004
  UseAdUnitCode: true
963
1005
  };
964
1006
 
965
- var buildResponse = function(placementId, cid, blcids, creativeId) {
1007
+ var buildResponse = function(placementId, cid, blcids, creativeId, ShouldSetLId) {
1008
+ if (ShouldSetLId) {
1009
+ return {
1010
+ MultipositionEnabled: true,
1011
+ AdPlacements: [{
1012
+ Ads: [{
1013
+ BidPrice: 0.5,
1014
+ VideoExposedId: creativeId,
1015
+ Cid: cid,
1016
+ Blcids: blcids
1017
+ }],
1018
+ BidModel: {
1019
+ BidVersion: 1,
1020
+ PlacementId: placementId,
1021
+ AuctionStartTime: Date.now(),
1022
+ CreativeHtml: '<!-- Creative -->'
1023
+ }
1024
+ }],
1025
+ ShouldSetLId: true,
1026
+ LId: 'dvdjkams6nkq'
1027
+ }
1028
+ }
1029
+
966
1030
  return {
967
1031
  MultipositionEnabled: true,
968
1032
  AdPlacements: [{
@@ -1066,6 +1130,22 @@ describe('invibesBidAdapter:', function () {
1066
1130
  });
1067
1131
  });
1068
1132
 
1133
+ context('AdWeb generates LIDs', function() {
1134
+ it('works when no LID is not sent from AdWeb', function() {
1135
+ var firstResponse = buildResponse('12345', 1, [], 123);
1136
+
1137
+ var firstResult = spec.interpretResponse({body: firstResponse}, {bidRequests});
1138
+ expect(firstResult[0].creativeId).to.equal(123);
1139
+ });
1140
+
1141
+ it('sets lid when AdWeb sends it', function() {
1142
+ var firstResponse = buildResponse('12345', 1, [], 123, true);
1143
+
1144
+ spec.interpretResponse({body: firstResponse}, {bidRequests});
1145
+ expect(global.document.cookie.indexOf('ivbsdid')).to.greaterThanOrEqual(0);
1146
+ });
1147
+ });
1148
+
1069
1149
  context('in multiposition context, with conflicting ads', function() {
1070
1150
  it('registers the second ad when no conflict', function() {
1071
1151
  var firstResponse = buildResponse('12345', 1, [1], 123);
@@ -1123,22 +1203,33 @@ describe('invibesBidAdapter:', function () {
1123
1203
 
1124
1204
  it('returns an iframe with params if enabled', function () {
1125
1205
  top.window.invibes.optIn = 1;
1126
- global.document.cookie = 'ivvbks=17639.0,1,2';
1127
1206
  let response = spec.getUserSyncs({iframeEnabled: true});
1128
1207
  expect(response.type).to.equal('iframe');
1129
1208
  expect(response.url).to.include(SYNC_ENDPOINT);
1130
1209
  expect(response.url).to.include('optIn');
1131
- expect(response.url).to.include('ivvbks');
1132
1210
  });
1133
1211
 
1134
1212
  it('returns an iframe with params including if enabled', function () {
1135
1213
  top.window.invibes.optIn = 1;
1136
- global.document.cookie = 'ivvbks=17639.0,1,2;ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}';
1214
+ global.document.cookie = 'ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}';
1215
+ SetBidderAccess();
1216
+
1217
+ let response = spec.getUserSyncs({iframeEnabled: true});
1218
+ expect(response.type).to.equal('iframe');
1219
+ expect(response.url).to.include(SYNC_ENDPOINT);
1220
+ expect(response.url).to.include('optIn');
1221
+ expect(response.url).to.include('ivbsdid');
1222
+ });
1223
+
1224
+ it('returns an iframe with params including if enabled read from LocalStorage', function () {
1225
+ top.window.invibes.optIn = 1;
1226
+ localStorage.ivbsdid = 'dvdjkams6nkq';
1227
+ SetBidderAccess();
1228
+
1137
1229
  let response = spec.getUserSyncs({iframeEnabled: true});
1138
1230
  expect(response.type).to.equal('iframe');
1139
1231
  expect(response.url).to.include(SYNC_ENDPOINT);
1140
1232
  expect(response.url).to.include('optIn');
1141
- expect(response.url).to.include('ivvbks');
1142
1233
  expect(response.url).to.include('ivbsdid');
1143
1234
  });
1144
1235
 
@@ -193,6 +193,35 @@ describe('IndexexchangeAdapter', function () {
193
193
  }
194
194
  ];
195
195
 
196
+ const DEFAULT_VIDEO_VALID_BID_NO_VIDEO_PARAMS = [
197
+ {
198
+ bidder: 'ix',
199
+ params: {
200
+ siteId: '456'
201
+ },
202
+ sizes: [400, 100],
203
+ mediaTypes: {
204
+ video: {
205
+ context: 'instream',
206
+ playerSize: [[400, 100]],
207
+ mimes: [
208
+ 'video/mp4',
209
+ 'video/webm'
210
+ ],
211
+ minduration: 0,
212
+ maxduration: 60,
213
+ protocols: [2]
214
+ }
215
+ },
216
+ adUnitCode: 'div-gpt-ad-1460505748562-0',
217
+ transactionId: '173f49a8-7549-4218-a23c-e7ba59b47230',
218
+ bidId: '1a2b3c4e',
219
+ bidderRequestId: '11a22b33c44e',
220
+ auctionId: '1aa2bb3cc4de',
221
+ schain: SAMPLE_SCHAIN
222
+ }
223
+ ];
224
+
196
225
  const DEFAULT_VIDEO_VALID_BID = [
197
226
  {
198
227
  bidder: 'ix',
@@ -236,7 +265,7 @@ describe('IndexexchangeAdapter', function () {
236
265
  mediaTypes: {
237
266
  video: {
238
267
  context: 'outstream',
239
- playerSize: [600, 700]
268
+ playerSize: [[600, 700]]
240
269
  },
241
270
  banner: {
242
271
  sizes: [[300, 250], [300, 600], [400, 500]]
@@ -271,7 +300,7 @@ describe('IndexexchangeAdapter', function () {
271
300
  mediaTypes: {
272
301
  video: {
273
302
  context: 'outstream',
274
- playerSize: [300, 250]
303
+ playerSize: [[300, 250]]
275
304
  },
276
305
  banner: {
277
306
  sizes: [[300, 250], [300, 600]]
@@ -371,7 +400,10 @@ describe('IndexexchangeAdapter', function () {
371
400
  ],
372
401
  seat: '3971'
373
402
  }
374
- ]
403
+ ],
404
+ ext: {
405
+ videoplayerurl: 'https://test.com/video-renderer.js'
406
+ }
375
407
  };
376
408
 
377
409
  const DEFAULT_VIDEO_BID_RESPONSE_WITH_MTYPE_SET = {
@@ -564,6 +596,24 @@ describe('IndexexchangeAdapter', function () {
564
596
  });
565
597
 
566
598
  describe('isBidRequestValid', function () {
599
+ it('should return false if outstream player size is less than 300x250 and IX renderer is preferred', function () {
600
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
601
+ bid.mediaTypes.video.context = 'outstream';
602
+ bid.mediaTypes.video.playerSize = [[300, 249]];
603
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
604
+ });
605
+
606
+ it('should return true if outstream player size is less than 300x250 and IX renderer is not preferred', function () {
607
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
608
+ bid.mediaTypes.video.renderer = {
609
+ url: 'test',
610
+ render: () => {}
611
+ };
612
+ bid.mediaTypes.video.context = 'outstream';
613
+ bid.mediaTypes.video.playerSize = [[300, 249]];
614
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
615
+ });
616
+
567
617
  it('should return true when required params found for a banner or video ad', function () {
568
618
  expect(spec.isBidRequestValid(DEFAULT_BANNER_VALID_BID[0])).to.equal(true);
569
619
  expect(spec.isBidRequestValid(DEFAULT_VIDEO_VALID_BID[0])).to.equal(true);
@@ -624,7 +674,7 @@ describe('IndexexchangeAdapter', function () {
624
674
  const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
625
675
  bid.mediaTypes = {
626
676
  video: {
627
- playerSize: [300, 250]
677
+ playerSize: [[300, 250]]
628
678
  }
629
679
  };
630
680
  bid.params.size = [100, 200];
@@ -695,22 +745,6 @@ describe('IndexexchangeAdapter', function () {
695
745
  expect(spec.isBidRequestValid(bid)).to.equal(true);
696
746
  });
697
747
 
698
- it('should set bid[].renderer if renderer not defined at mediaType.video level', function () {
699
- const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
700
- data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: DEFAULT_MULTIFORMAT_BANNER_VALID_BID
701
- });
702
- expect(bid[0].renderer).to.be.exist;
703
- });
704
-
705
- it('should not set bid[].renderer if renderer defined at mediaType.video level', function () {
706
- const outstreamAdUnit = DEFAULT_MULTIFORMAT_BANNER_VALID_BID;
707
- outstreamAdUnit[0].mediaTypes.video.renderer = {}
708
- const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
709
- data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: DEFAULT_MULTIFORMAT_BANNER_VALID_BID
710
- });
711
- expect(bid[0].renderer).to.be.undefined;
712
- });
713
-
714
748
  it('should return false when there is only bidFloor', function () {
715
749
  const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
716
750
  bid.params.bidFloor = 50;
@@ -1835,7 +1869,6 @@ describe('IndexexchangeAdapter', function () {
1835
1869
 
1836
1870
  describe('request should contain both banner and video requests', function () {
1837
1871
  const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]]);
1838
-
1839
1872
  it('should have banner request', () => {
1840
1873
  const bannerImpression = JSON.parse(request[0].data.r).imp[0];
1841
1874
 
@@ -2177,6 +2210,16 @@ describe('IndexexchangeAdapter', function () {
2177
2210
  const { ext: { gpid } } = JSON.parse(requests[0].data.r).imp[0];
2178
2211
  expect(gpid).to.equal(GPID);
2179
2212
  });
2213
+
2214
+ it('should build video request when if video obj is not provided at params level', () => {
2215
+ const request = spec.buildRequests([DEFAULT_VIDEO_VALID_BID_NO_VIDEO_PARAMS[0]]);
2216
+ const videoImpression = JSON.parse(request[0].data.r).imp[0];
2217
+
2218
+ expect(JSON.parse(request[0].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
2219
+ expect(videoImpression.id).to.equal(DEFAULT_VIDEO_VALID_BID_NO_VIDEO_PARAMS[0].bidId);
2220
+ expect(videoImpression.video.w).to.equal(DEFAULT_VIDEO_VALID_BID_NO_VIDEO_PARAMS[0].mediaTypes.video.playerSize[0][0]);
2221
+ expect(videoImpression.video.h).to.equal(DEFAULT_VIDEO_VALID_BID_NO_VIDEO_PARAMS[0].mediaTypes.video.playerSize[0][1]);
2222
+ });
2180
2223
  });
2181
2224
 
2182
2225
  describe('buildRequestMultiFormat', function () {
@@ -2246,8 +2289,8 @@ describe('IndexexchangeAdapter', function () {
2246
2289
  expect(JSON.parse(request[1].data.r).imp).to.have.lengthOf(1);
2247
2290
  expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
2248
2291
  expect(videoImpression.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
2249
- expect(videoImpression.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[0]);
2250
- expect(videoImpression.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[1]);
2292
+ expect(videoImpression.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[0][0]);
2293
+ expect(videoImpression.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[0][1]);
2251
2294
  });
2252
2295
 
2253
2296
  it('should contain all correct IXdiag properties', function () {
@@ -2255,10 +2298,11 @@ describe('IndexexchangeAdapter', function () {
2255
2298
  expect(diagObj.iu).to.equal(0);
2256
2299
  expect(diagObj.nu).to.equal(0);
2257
2300
  expect(diagObj.ou).to.equal(2);
2258
- expect(diagObj.ren).to.equal(false);
2301
+ expect(diagObj.ren).to.equal(true);
2259
2302
  expect(diagObj.mfu).to.equal(2);
2260
2303
  expect(diagObj.allu).to.equal(2);
2261
2304
  expect(diagObj.version).to.equal('$prebid.version$');
2305
+ expect(diagObj.url).to.equal('http://localhost:9876/context.html')
2262
2306
  });
2263
2307
  });
2264
2308
  });
@@ -2489,6 +2533,68 @@ describe('IndexexchangeAdapter', function () {
2489
2533
  expect(result[0]).to.deep.equal(expectedParse[0]);
2490
2534
  });
2491
2535
 
2536
+ it('should set bid[].renderer if renderer not defined at mediaType.video level', function () {
2537
+ const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
2538
+ data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: DEFAULT_MULTIFORMAT_BANNER_VALID_BID
2539
+ });
2540
+ expect(bid[0].renderer).to.exist;
2541
+ });
2542
+
2543
+ it('should set renderer URL by parsing video response', function () {
2544
+ const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
2545
+ data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: DEFAULT_MULTIFORMAT_BANNER_VALID_BID
2546
+ });
2547
+ expect(bid[0].renderer.url).to.equal(DEFAULT_VIDEO_BID_RESPONSE.ext.videoplayerurl);
2548
+ });
2549
+
2550
+ it('should not set bid[].renderer if renderer defined at mediaType.video level', function () {
2551
+ let outstreamAdUnit = utils.deepClone(DEFAULT_MULTIFORMAT_BANNER_VALID_BID);
2552
+ outstreamAdUnit[0].mediaTypes.video.renderer = {
2553
+ url: 'test',
2554
+ render: function() {}
2555
+ };
2556
+ const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
2557
+ data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: outstreamAdUnit
2558
+ });
2559
+ expect(bid[0].renderer).to.be.undefined;
2560
+ });
2561
+
2562
+ it('should not set bid[].renderer if renderer defined at the ad unit level', function () {
2563
+ let outstreamAdUnit = utils.deepClone(DEFAULT_MULTIFORMAT_BANNER_VALID_BID);
2564
+ outstreamAdUnit[0].renderer = {
2565
+ url: 'test',
2566
+ render: function() {}
2567
+ };
2568
+ const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
2569
+ data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: outstreamAdUnit
2570
+ });
2571
+ expect(bid[0].renderer).to.be.undefined;
2572
+ });
2573
+
2574
+ it('should set bid[].renderer if ad unit renderer is invalid', function () {
2575
+ let outstreamAdUnit = utils.deepClone(DEFAULT_MULTIFORMAT_BANNER_VALID_BID);
2576
+ outstreamAdUnit[0].mediaTypes.video.renderer = {
2577
+ url: 'test'
2578
+ };
2579
+ const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
2580
+ data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: outstreamAdUnit
2581
+ });
2582
+ expect(bid[0].renderer).to.exist;
2583
+ });
2584
+
2585
+ it('should set bid[].renderer if ad unit renderer is a backup', function () {
2586
+ let outstreamAdUnit = utils.deepClone(DEFAULT_MULTIFORMAT_BANNER_VALID_BID);
2587
+ outstreamAdUnit[0].mediaTypes.video.renderer = {
2588
+ url: 'test',
2589
+ render: function() {},
2590
+ backupOnly: true
2591
+ };
2592
+ const bid = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, {
2593
+ data: DEFAULT_BIDDER_REQUEST_DATA, validBidRequests: outstreamAdUnit
2594
+ });
2595
+ expect(bid[0].renderer).to.exist;
2596
+ });
2597
+
2492
2598
  it('should get correct bid response for video ad and set bid.vastXml when mtype is 2 (video)', function () {
2493
2599
  const expectedParse = [
2494
2600
  {
@@ -2710,7 +2816,7 @@ describe('IndexexchangeAdapter', function () {
2710
2816
  });
2711
2817
  });
2712
2818
 
2713
- describe('LocalStorage ixdiag', () => {
2819
+ describe('LocalStorage error codes', () => {
2714
2820
  let TODAY = new Date().toISOString().slice(0, 10);
2715
2821
  const key = 'ixdiag';
2716
2822
 
@@ -2837,7 +2943,7 @@ describe('IndexexchangeAdapter', function () {
2837
2943
 
2838
2944
  expect(spec.isBidRequestValid(bid)).to.be.true;
2839
2945
  spec.buildRequests([bid]);
2840
- expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { [ERROR_CODES.VIDEO_DURATION_INVALID]: 2 } });
2946
+ expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { [ERROR_CODES.VIDEO_DURATION_INVALID]: 3 } });
2841
2947
  });
2842
2948
 
2843
2949
  it('should increment errors for errorCode', () => {
@@ -285,6 +285,23 @@ describe('jixie Adapter', function () {
285
285
  expect(payload.device).to.deep.include(content);
286
286
  });
287
287
 
288
+ it('schain info should be accessible when available', function () {
289
+ const schain = {
290
+ ver: '1.0',
291
+ complete: 1,
292
+ nodes: [{
293
+ asi: 'ssp.test',
294
+ sid: '00001',
295
+ hp: 1
296
+ }]
297
+ };
298
+ const oneSpecialBidReq = Object.assign({}, bidRequests_[0], { schain: schain });
299
+ const request = spec.buildRequests([oneSpecialBidReq], bidderRequest_);
300
+ const payload = JSON.parse(request.data);
301
+ expect(payload.schain).to.deep.equal(schain);
302
+ expect(payload.schain).to.deep.include(schain);
303
+ });
304
+
288
305
  it('should populate eids when supported userIds are available', function () {
289
306
  const oneSpecialBidReq = Object.assign({}, bidRequests_[0], {
290
307
  userId: {
@@ -451,6 +451,17 @@ describe('kargo adapter tests', function () {
451
451
  adm: '<div id="4"></div>',
452
452
  width: 300,
453
453
  height: 250,
454
+ mediaType: 'banner',
455
+ metadata: {},
456
+ currency: 'EUR'
457
+ },
458
+ 5: {
459
+ id: 'bar',
460
+ cpm: 2.5,
461
+ adm: '<VAST></VAST>',
462
+ width: 300,
463
+ height: 250,
464
+ mediaType: 'video',
454
465
  metadata: {},
455
466
  currency: 'EUR'
456
467
  }
@@ -476,6 +487,11 @@ describe('kargo adapter tests', function () {
476
487
  params: {
477
488
  placementId: 'bar'
478
489
  }
490
+ }, {
491
+ bidId: 5,
492
+ params: {
493
+ placementId: 'bar'
494
+ }
479
495
  }]
480
496
  });
481
497
  var expectation = [{
@@ -489,7 +505,10 @@ describe('kargo adapter tests', function () {
489
505
  dealId: undefined,
490
506
  netRevenue: true,
491
507
  currency: 'USD',
492
- meta: undefined
508
+ mediaType: 'banner',
509
+ meta: {
510
+ mediaType: 'banner'
511
+ }
493
512
  }, {
494
513
  requestId: '2',
495
514
  cpm: 2.5,
@@ -501,7 +520,9 @@ describe('kargo adapter tests', function () {
501
520
  dealId: 'dmpmptest1234',
502
521
  netRevenue: true,
503
522
  currency: 'USD',
523
+ mediaType: 'banner',
504
524
  meta: {
525
+ mediaType: 'banner',
505
526
  clickUrl: 'https://foobar.com',
506
527
  advertiserDomains: ['https://foobar.com']
507
528
  }
@@ -516,7 +537,10 @@ describe('kargo adapter tests', function () {
516
537
  dealId: undefined,
517
538
  netRevenue: true,
518
539
  currency: 'USD',
519
- meta: undefined
540
+ mediaType: 'banner',
541
+ meta: {
542
+ mediaType: 'banner'
543
+ }
520
544
  }, {
521
545
  requestId: '4',
522
546
  cpm: 2.5,
@@ -528,7 +552,25 @@ describe('kargo adapter tests', function () {
528
552
  dealId: undefined,
529
553
  netRevenue: true,
530
554
  currency: 'EUR',
531
- meta: undefined
555
+ mediaType: 'banner',
556
+ meta: {
557
+ mediaType: 'banner'
558
+ }
559
+ }, {
560
+ requestId: '5',
561
+ cpm: 2.5,
562
+ width: 300,
563
+ height: 250,
564
+ vastXml: '<VAST></VAST>',
565
+ ttl: 300,
566
+ creativeId: 'bar',
567
+ dealId: undefined,
568
+ netRevenue: true,
569
+ currency: 'EUR',
570
+ mediaType: 'video',
571
+ meta: {
572
+ mediaType: 'video'
573
+ }
532
574
  }];
533
575
  expect(resp).to.deep.equal(expectation);
534
576
  });
@@ -46,7 +46,7 @@ describe('LiveIntentId', function() {
46
46
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
47
47
  submoduleCallback(callBackSpy);
48
48
  let request = server.requests[1];
49
- expect(request.url).to.match(/.*us_privacy=1YNY.*&gdpr=1&gdpr_consent=consentDataString.*/);
49
+ expect(request.url).to.match(/.*us_privacy=1YNY.*&gdpr=1&n3pc=1&gdpr_consent=consentDataString.*/);
50
50
  const response = {
51
51
  unifiedId: 'a_unified_id',
52
52
  segments: [123, 234]
@@ -66,7 +66,7 @@ describe('LiveIntentId', function() {
66
66
  consentString: 'consentDataString'
67
67
  })
68
68
  liveIntentIdSubmodule.getId(defaultConfigParams);
69
- expect(server.requests[0].url).to.match(/https:\/\/rp.liadm.com\/j\?.*&us_privacy=1YNY.*&wpn=prebid.*&gdpr=1&gdpr_consent=consentDataString.*/);
69
+ expect(server.requests[0].url).to.match(/https:\/\/rp.liadm.com\/j\?.*&us_privacy=1YNY.*&wpn=prebid.*&gdpr=1&n3pc=1&n3pct=1&nb=1&gdpr_consent=consentDataString.*/);
70
70
  });
71
71
 
72
72
  it('should fire an event when getId and a hash is provided', function() {
@@ -50,6 +50,12 @@ describe('loglyliftBidAdapter', function () {
50
50
  },
51
51
  sponsoredBy: {
52
52
  required: true
53
+ },
54
+ cta: {
55
+ required: true
56
+ },
57
+ privacyLink: {
58
+ required: true
53
59
  }
54
60
  }
55
61
  }
@@ -114,6 +120,8 @@ describe('loglyliftBidAdapter', function () {
114
120
  ],
115
121
  sponsoredBy: 'logly',
116
122
  title: 'Native Title',
123
+ privacyLink: 'https://www.logly.co.jp/optout.html',
124
+ cta: '詳細はこちら',
117
125
  }
118
126
  }],
119
127
  }