prebid.js 8.3.0 → 8.4.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 (203) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/admanBidAdapter.js +1 -1
  7. package/dist/adqueryBidAdapter.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/ajaBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/axonixBidAdapter.js +1 -1
  19. package/dist/bidglassBidAdapter.js +1 -1
  20. package/dist/big-richmediaBidAdapter.js +1 -1
  21. package/dist/brandmetricsRtdProvider.js +1 -1
  22. package/dist/bridBidAdapter.js +1 -1
  23. package/dist/bridgewellBidAdapter.js +1 -1
  24. package/dist/brightMountainMediaBidAdapter.js +1 -1
  25. package/dist/carodaBidAdapter.js +1 -1
  26. package/dist/chtnwBidAdapter.js +1 -1
  27. package/dist/concertBidAdapter.js +1 -1
  28. package/dist/connectadBidAdapter.js +1 -1
  29. package/dist/consumableBidAdapter.js +1 -1
  30. package/dist/conversantAnalyticsAdapter.js +1 -1
  31. package/dist/conversantBidAdapter.js +1 -1
  32. package/dist/craftBidAdapter.js +1 -1
  33. package/dist/criteoBidAdapter.js +1 -1
  34. package/dist/cwireBidAdapter.js +1 -1
  35. package/dist/dependencies.json +3 -0
  36. package/dist/dspxBidAdapter.js +1 -1
  37. package/dist/eplanningBidAdapter.js +1 -1
  38. package/dist/euidIdSystem.js +1 -1
  39. package/dist/feedadBidAdapter.js +1 -1
  40. package/dist/finativeBidAdapter.js +1 -1
  41. package/dist/freewheel-sspBidAdapter.js +1 -1
  42. package/dist/gdprEnforcement.js +1 -1
  43. package/dist/gmosspBidAdapter.js +1 -1
  44. package/dist/goldbachBidAdapter.js +1 -1
  45. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  46. package/dist/greenbidsRtdProvider.js +1 -1
  47. package/dist/gridBidAdapter.js +1 -1
  48. package/dist/gumgumBidAdapter.js +1 -1
  49. package/dist/h12mediaBidAdapter.js +1 -1
  50. package/dist/hypelabBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/imdsBidAdapter.js +1 -1
  53. package/dist/improvedigitalBidAdapter.js +1 -1
  54. package/dist/insticatorBidAdapter.js +1 -1
  55. package/dist/ixBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoBidAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/kueezRtbBidAdapter.js +1 -1
  61. package/dist/kulturemediaBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/logicadBidAdapter.js +1 -1
  65. package/dist/loglyliftBidAdapter.js +1 -1
  66. package/dist/magniteAnalyticsAdapter.js +1 -1
  67. package/dist/malltvAnalyticsAdapter.js +1 -1
  68. package/dist/marsmediaBidAdapter.js +1 -1
  69. package/dist/mediafuseBidAdapter.js +1 -1
  70. package/dist/mediasquareBidAdapter.js +1 -1
  71. package/dist/mgidBidAdapter.js +1 -1
  72. package/dist/minutemediaBidAdapter.js +1 -1
  73. package/dist/minutemediaplusBidAdapter.js +1 -1
  74. package/dist/nexx360BidAdapter.js +1 -1
  75. package/dist/not-for-prod/prebid.js +135 -135
  76. package/dist/oguryBidAdapter.js +1 -1
  77. package/dist/onetagBidAdapter.js +1 -1
  78. package/dist/ooloAnalyticsAdapter.js +1 -1
  79. package/dist/optidigitalBidAdapter.js +1 -1
  80. package/dist/outbrainBidAdapter.js +1 -1
  81. package/dist/parrableIdSystem.js +1 -1
  82. package/dist/pixfutureBidAdapter.js +1 -1
  83. package/dist/prebid-core.js +2 -2
  84. package/dist/publinkIdSystem.js +1 -1
  85. package/dist/pubmaticBidAdapter.js +1 -1
  86. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  87. package/dist/pulsepointBidAdapter.js +1 -1
  88. package/dist/pxyzBidAdapter.js +1 -1
  89. package/dist/quantcastBidAdapter.js +1 -1
  90. package/dist/readpeakBidAdapter.js +1 -1
  91. package/dist/relaidoBidAdapter.js +1 -1
  92. package/dist/retailspotBidAdapter.js +1 -1
  93. package/dist/rhythmoneBidAdapter.js +1 -1
  94. package/dist/riseBidAdapter.js +1 -1
  95. package/dist/rubiconBidAdapter.js +1 -1
  96. package/dist/seedingAllianceBidAdapter.js +1 -1
  97. package/dist/seedtagBidAdapter.js +1 -1
  98. package/dist/sharedIdSystem.js +1 -1
  99. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  100. package/dist/sharethroughBidAdapter.js +1 -1
  101. package/dist/shinezBidAdapter.js +1 -1
  102. package/dist/smaatoBidAdapter.js +1 -1
  103. package/dist/smartadserverBidAdapter.js +1 -1
  104. package/dist/smartxBidAdapter.js +1 -1
  105. package/dist/smilewantedBidAdapter.js +1 -1
  106. package/dist/sonobiBidAdapter.js +1 -1
  107. package/dist/sovrnAnalyticsAdapter.js +1 -1
  108. package/dist/sovrnBidAdapter.js +1 -1
  109. package/dist/sspBCBidAdapter.js +1 -1
  110. package/dist/stroeerCoreBidAdapter.js +1 -1
  111. package/dist/stvBidAdapter.js +1 -1
  112. package/dist/sublimeBidAdapter.js +1 -1
  113. package/dist/targetVideoBidAdapter.js +1 -1
  114. package/dist/teadsBidAdapter.js +1 -1
  115. package/dist/topicsFpdModule.js +1 -1
  116. package/dist/trionBidAdapter.js +1 -1
  117. package/dist/tripleliftBidAdapter.js +1 -1
  118. package/dist/ttdBidAdapter.js +1 -1
  119. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  120. package/dist/uid2IdSystem.js +1 -1
  121. package/dist/underdogmediaBidAdapter.js +1 -1
  122. package/dist/undertoneBidAdapter.js +1 -1
  123. package/dist/userId.js +1 -1
  124. package/dist/vidazooBidAdapter.js +1 -1
  125. package/dist/videobyteBidAdapter.js +1 -1
  126. package/dist/visxBidAdapter.js +1 -1
  127. package/dist/voxBidAdapter.js +1 -1
  128. package/dist/vuukleBidAdapter.js +1 -1
  129. package/dist/widespaceBidAdapter.js +1 -1
  130. package/dist/winrBidAdapter.js +1 -1
  131. package/dist/yahoosspBidAdapter.js +1 -1
  132. package/dist/yandexBidAdapter.js +1 -1
  133. package/dist/yieldmoBidAdapter.js +1 -1
  134. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  135. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
  136. package/integrationExamples/videoModule/jwplayer/eventListeners.html +2 -2
  137. package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
  138. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
  139. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
  140. package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
  141. package/integrationExamples/videoModule/videojs/bidMarkedAsUsed.html +1 -1
  142. package/integrationExamples/videoModule/videojs/bidRequestScheduling.html +1 -1
  143. package/integrationExamples/videoModule/videojs/eventListeners.html +1 -1
  144. package/integrationExamples/videoModule/videojs/eventsUI.html +1 -1
  145. package/integrationExamples/videoModule/videojs/gamAdServerMediation.html +1 -1
  146. package/integrationExamples/videoModule/videojs/mediaMetadata.html +1 -1
  147. package/integrationExamples/videoModule/videojs/playlist.html +1 -1
  148. package/modules/33acrossBidAdapter.js +24 -14
  149. package/modules/33acrossIdSystem.js +15 -4
  150. package/modules/adagioBidAdapter.js +0 -1
  151. package/modules/admanBidAdapter.js +4 -0
  152. package/modules/brandmetricsRtdProvider.js +36 -2
  153. package/modules/brandmetricsRtdProvider.md +17 -2
  154. package/modules/gdprEnforcement.js +27 -22
  155. package/modules/gridBidAdapter.js +19 -0
  156. package/modules/ixBidAdapter.js +40 -2
  157. package/modules/kargoBidAdapter.js +4 -0
  158. package/modules/minutemediaBidAdapter.js +17 -2
  159. package/modules/oguryBidAdapter.js +29 -16
  160. package/modules/pubmaticBidAdapter.js +16 -1
  161. package/modules/pulsepointBidAdapter.js +63 -424
  162. package/modules/pulsepointBidAdapter.md +39 -45
  163. package/modules/sharedIdSystem.js +1 -1
  164. package/modules/sovrnBidAdapter.js +5 -1
  165. package/modules/stroeerCoreBidAdapter.js +2 -3
  166. package/modules/teadsBidAdapter.js +2 -0
  167. package/modules/topicsFpdModule.js +4 -1
  168. package/modules/topicsFpdModule.md +4 -0
  169. package/modules/userId/index.js +2 -2
  170. package/modules/vidazooBidAdapter.js +5 -7
  171. package/modules/voxBidAdapter.js +16 -5
  172. package/modules/yahoosspBidAdapter.js +38 -33
  173. package/modules/yahoosspBidAdapter.md +96 -95
  174. package/modules/yandexBidAdapter.js +12 -15
  175. package/package.json +1 -1
  176. package/src/activities/redactor.js +1 -1
  177. package/src/auction.js +24 -2
  178. package/src/constants.json +3 -1
  179. package/src/fpd/sua.js +8 -2
  180. package/test/spec/auctionmanager_spec.js +29 -1
  181. package/test/spec/fpd/enrichment_spec.js +7 -1
  182. package/test/spec/fpd/sua_spec.js +12 -0
  183. package/test/spec/modules/33acrossBidAdapter_spec.js +188 -35
  184. package/test/spec/modules/33acrossIdSystem_spec.js +122 -27
  185. package/test/spec/modules/adagioBidAdapter_spec.js +0 -1
  186. package/test/spec/modules/brandmetricsRtdProvider_spec.js +69 -7
  187. package/test/spec/modules/gdprEnforcement_spec.js +43 -2
  188. package/test/spec/modules/gridBidAdapter_spec.js +42 -0
  189. package/test/spec/modules/ixBidAdapter_spec.js +72 -0
  190. package/test/spec/modules/kargoBidAdapter_spec.js +121 -106
  191. package/test/spec/modules/minutemediaBidAdapter_spec.js +36 -5
  192. package/test/spec/modules/oguryBidAdapter_spec.js +208 -108
  193. package/test/spec/modules/pubmaticBidAdapter_spec.js +119 -0
  194. package/test/spec/modules/pulsepointBidAdapter_spec.js +225 -486
  195. package/test/spec/modules/sovrnBidAdapter_spec.js +24 -4
  196. package/test/spec/modules/stroeerCoreBidAdapter_spec.js +8 -5
  197. package/test/spec/modules/teadsBidAdapter_spec.js +70 -21
  198. package/test/spec/modules/topicsFpdModule_spec.js +10 -4
  199. package/test/spec/modules/vidazooBidAdapter_spec.js +0 -5
  200. package/test/spec/modules/voxBidAdapter_spec.js +93 -0
  201. package/test/spec/modules/yahoosspBidAdapter_spec.js +402 -314
  202. package/test/spec/modules/yandexBidAdapter_spec.js +21 -3
  203. package/integrationExamples/gpt/inskin_example.html +0 -100
@@ -3,7 +3,6 @@ import { config } from 'src/config.js';
3
3
  import { BANNER, VIDEO } from 'src/mediaTypes.js';
4
4
  import { spec } from 'modules/yahoosspBidAdapter.js';
5
5
  import {createEidsArray} from '../../../modules/userId/eids';
6
- import {deepClone} from '../../../src/utils';
7
6
 
8
7
  const DEFAULT_BID_ID = '84ab500420319d';
9
8
  const DEFAULT_BID_DCN = '2093845709823475';
@@ -13,18 +12,20 @@ const DEFAULT_AD_UNIT_CODE = '/19968336/header-bid-tag-1';
13
12
  const DEFAULT_AD_UNIT_TYPE = 'banner';
14
13
  const DEFAULT_PARAMS_BID_OVERRIDE = {};
15
14
  const DEFAULT_VIDEO_CONTEXT = 'instream';
16
- const ADAPTER_VERSION = '1.0.2';
15
+ const ADAPTER_VERSION = '1.1.0';
16
+ const DEFAULT_BIDDER_CODE = 'yahooAds';
17
+ const VALID_BIDDER_CODES = [DEFAULT_BIDDER_CODE, 'yahoossp', 'yahooAdvertising'];
17
18
  const PREBID_VERSION = '$prebid.version$';
18
19
  const INTEGRATION_METHOD = 'prebid.js';
19
20
 
20
21
  // Utility functions
21
- const generateBidRequest = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode, ortb2}) => {
22
+ const generateBidRequest = ({bidderCode, bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode, ortb2}) => {
22
23
  const bidRequest = {
23
24
  adUnitCode,
24
25
  auctionId: 'b06c5141-fe8f-4cdf-9d7d-54415490a917',
25
26
  bidId,
26
27
  bidderRequestsCount: 1,
27
- bidder: 'yahoossp',
28
+ bidder: bidderCode,
28
29
  bidderRequestId: '7101db09af0db2',
29
30
  bidderWinsCount: 0,
30
31
  mediaTypes: {},
@@ -79,7 +80,7 @@ let generateBidderRequest = (bidRequestArray, adUnitCode, ortb2 = {}) => {
79
80
  adUnitCode: adUnitCode || 'default-adUnitCode',
80
81
  auctionId: 'd4c83a3b-18e4-4208-b98b-63848449c7aa',
81
82
  auctionStart: new Date().getTime(),
82
- bidderCode: 'yahoossp',
83
+ bidderCode: bidRequestArray[0].bidder,
83
84
  bidderRequestId: '112f1c7c5d399a',
84
85
  bids: bidRequestArray,
85
86
  refererInfo: {
@@ -107,8 +108,9 @@ let generateBidderRequest = (bidRequestArray, adUnitCode, ortb2 = {}) => {
107
108
  return bidderRequest;
108
109
  };
109
110
 
110
- const generateBuildRequestMock = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode, ortb2}) => {
111
+ const generateBuildRequestMock = ({bidderCode, bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode, ortb2}) => {
111
112
  const bidRequestConfig = {
113
+ bidderCode: bidderCode || DEFAULT_BIDDER_CODE,
112
114
  bidId: bidId || DEFAULT_BID_ID,
113
115
  pos: pos || DEFAULT_BID_POS,
114
116
  adUnitCode: adUnitCode || DEFAULT_AD_UNIT_CODE,
@@ -174,21 +176,28 @@ const generateResponseMock = (admPayloadType, vastVersion, videoContext) => {
174
176
  seatbid: [{ bid: [ bidResponse ], seat: 13107 }]
175
177
  }
176
178
  };
177
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: admPayloadType, videoContext: videoContext});
179
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: admPayloadType, videoContext});
178
180
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
179
-
180
181
  return {serverResponse, data, bidderRequest};
181
182
  }
182
183
 
183
184
  // Unit tests
184
- describe('YahooSSP Bid Adapter:', () => {
185
+ describe('Yahoo Advertising Bid Adapter:', () => {
186
+ beforeEach(() => {
187
+ config.resetConfig();
188
+ });
189
+
185
190
  describe('Validate basic properties', () => {
186
191
  it('should define the correct bidder code', () => {
187
- expect(spec.code).to.equal('yahoossp')
192
+ expect(spec.code).to.equal('yahooAds');
193
+ });
194
+
195
+ it('should define the correct bidder aliases', () => {
196
+ expect(spec.aliases).to.deep.equal(['yahoossp', 'yahooAdvertising']);
188
197
  });
189
198
 
190
199
  it('should define the correct vendor ID', () => {
191
- expect(spec.gvlid).to.equal(25)
200
+ expect(spec.gvlid).to.equal(25);
192
201
  });
193
202
  });
194
203
 
@@ -271,33 +280,62 @@ describe('YahooSSP Bid Adapter:', () => {
271
280
  });
272
281
 
273
282
  describe('user consent parameters are updated', () => {
274
- let syncOptions = {
283
+ const syncOptions = {
275
284
  iframeEnabled: true,
276
285
  pixelEnabled: true
277
286
  };
278
- let pixelObjects = spec.getUserSyncs(
279
- syncOptions,
280
- SERVER_RESPONSES,
281
- bidderRequest.gdprConsent,
282
- bidderRequest.uspConsent,
283
- bidderRequest.gppConsent
284
- );
285
- pixelObjects.forEach(pixelObject => {
286
- let url = pixelObject.url;
287
- let urlParams = new URL(url).searchParams;
288
- const expectedParams = {
289
- 'baz': 'true',
290
- 'gdpr_consent': bidderRequest.gdprConsent.consentString,
291
- 'gdpr': bidderRequest.gdprConsent.gdprApplies ? '1' : '0',
292
- 'us_privacy': bidderRequest.uspConsent,
293
- 'gpp': bidderRequest.gppConsent.gppString,
294
- 'gpp_sid': Array.isArray(bidderRequest.gppConsent.applicableSections) ? bidderRequest.gppConsent.applicableSections.join(',') : ''
295
- }
296
- for (const [key, value] of Object.entries(expectedParams)) {
297
- it(`Updates the ${key} consent param in user sync URL ${url}`, () => {
298
- expect(urlParams.get(key)).to.equal(value);
299
- });
300
- };
287
+ describe('when all consent data is set', () => {
288
+ const pixelObjects = spec.getUserSyncs(
289
+ syncOptions,
290
+ SERVER_RESPONSES,
291
+ bidderRequest.gdprConsent,
292
+ bidderRequest.uspConsent,
293
+ bidderRequest.gppConsent
294
+ );
295
+ pixelObjects.forEach(pixelObject => {
296
+ let url = pixelObject.url;
297
+ let urlParams = new URL(url).searchParams;
298
+ const expectedParams = {
299
+ 'baz': 'true',
300
+ 'gdpr_consent': bidderRequest.gdprConsent.consentString,
301
+ 'gdpr': bidderRequest.gdprConsent.gdprApplies ? '1' : '0',
302
+ 'us_privacy': bidderRequest.uspConsent,
303
+ 'gpp': bidderRequest.gppConsent.gppString,
304
+ 'gpp_sid': Array.isArray(bidderRequest.gppConsent.applicableSections) ? bidderRequest.gppConsent.applicableSections.join(',') : ''
305
+ }
306
+ for (const [key, value] of Object.entries(expectedParams)) {
307
+ it(`Updates the ${key} consent param in user sync URL ${url}`, () => {
308
+ expect(urlParams.get(key)).to.equal(value);
309
+ });
310
+ };
311
+ });
312
+ });
313
+
314
+ describe('when no consent data is set', () => {
315
+ const pixelObjects = spec.getUserSyncs(
316
+ syncOptions,
317
+ SERVER_RESPONSES,
318
+ undefined,
319
+ undefined,
320
+ undefined
321
+ );
322
+ pixelObjects.forEach(pixelObject => {
323
+ let url = pixelObject.url;
324
+ let urlParams = new URL(url).searchParams;
325
+ const expectedParams = {
326
+ 'baz': 'true',
327
+ 'gdpr_consent': '',
328
+ 'gdpr': '0',
329
+ 'us_privacy': '',
330
+ 'gpp': '',
331
+ 'gpp_sid': ''
332
+ }
333
+ for (const [key, value] of Object.entries(expectedParams)) {
334
+ it(`Updates the ${key} consent param in user sync URL ${url}`, () => {
335
+ expect(urlParams.get(key)).to.equal(value);
336
+ });
337
+ };
338
+ });
301
339
  });
302
340
  });
303
341
  });
@@ -647,9 +685,9 @@ describe('YahooSSP Bid Adapter:', () => {
647
685
  };
648
686
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
649
687
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
650
- expect(data.user[param]).to.be.a('object');
651
- expect(data.user[param]).to.be.deep.include({[param]: {a: '123', b: '456'}});
652
- config.setConfig({ortb2: {}});
688
+ const user = data.user;
689
+ expect(user[param]).to.be.a('object');
690
+ expect(user[param]).to.be.deep.include({[param]: {a: '123', b: '456'}});
653
691
  });
654
692
  });
655
693
 
@@ -669,12 +707,14 @@ describe('YahooSSP Bid Adapter:', () => {
669
707
  };
670
708
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
671
709
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
672
- expect(data.user.data[0][param]).to.exist;
673
- expect(data.user.data[0][param]).to.be.a('string');
674
- expect(data.user.data[0][param]).to.be.equal(ortb2.user.data[0][param]);
675
- expect(data.site.content.data[0][param]).to.exist;
676
- expect(data.site.content.data[0][param]).to.be.a('string');
677
- expect(data.site.content.data[0][param]).to.be.equal(ortb2.site.content.data[0][param]);
710
+ const user = data.user;
711
+ const site = data.site;
712
+ expect(user.data[0][param]).to.exist;
713
+ expect(user.data[0][param]).to.be.a('string');
714
+ expect(user.data[0][param]).to.be.equal(ortb2.user.data[0][param]);
715
+ expect(site.content.data[0][param]).to.exist;
716
+ expect(site.content.data[0][param]).to.be.a('string');
717
+ expect(site.content.data[0][param]).to.be.equal(ortb2.site.content.data[0][param]);
678
718
  });
679
719
  });
680
720
 
@@ -688,9 +728,10 @@ describe('YahooSSP Bid Adapter:', () => {
688
728
  };
689
729
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
690
730
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
691
- expect(data.user.data[0][param]).to.exist;
692
- expect(data.user.data[0][param]).to.be.a('array');
693
- expect(data.user.data[0][param]).to.be.equal(ortb2.user.data[0][param]);
731
+ const user = data.user;
732
+ expect(user.data[0][param]).to.exist;
733
+ expect(user.data[0][param]).to.be.a('array');
734
+ expect(user.data[0][param]).to.be.equal(ortb2.user.data[0][param]);
694
735
  });
695
736
  });
696
737
 
@@ -704,10 +745,10 @@ describe('YahooSSP Bid Adapter:', () => {
704
745
  };
705
746
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
706
747
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
707
- expect(data.user.data[0][param]).to.exist;
708
- expect(data.user.data[0][param]).to.be.a('object');
709
- expect(data.user.data[0][param]).to.be.equal(ortb2.user.data[0][param]);
710
- config.setConfig({ortb2: {}});
748
+ const user = data.user;
749
+ expect(user.data[0][param]).to.exist;
750
+ expect(user.data[0][param]).to.be.a('object');
751
+ expect(user.data[0][param]).to.be.equal(ortb2.user.data[0][param]);
711
752
  });
712
753
  });
713
754
 
@@ -815,26 +856,33 @@ describe('YahooSSP Bid Adapter:', () => {
815
856
  });
816
857
 
817
858
  describe('Endpoint & Impression Request Mode:', () => {
818
- it('should route request to config override endpoint', () => {
819
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
820
- const testOverrideEndpoint = 'http://foo.bar.baz.com/bidderRequest';
859
+ afterEach(() => {
821
860
  config.setConfig({
822
- yahoossp: {
823
- endpoint: testOverrideEndpoint
861
+ yahooAds: {
862
+ singleRequestMode: undefined
824
863
  }
825
864
  });
826
- const response = spec.buildRequests(validBidRequests, bidderRequest)[0];
827
- expect(response).to.deep.include(
828
- {
829
- method: 'POST',
830
- url: testOverrideEndpoint
831
- });
832
865
  });
833
866
 
834
- it('should route request to /bidRequest endpoint when dcn & pos present', () => {
835
- config.setConfig({
836
- yahoossp: {}
867
+ VALID_BIDDER_CODES.forEach(bidderCode => {
868
+ it(`should route request to config override endpoint for ${bidderCode} override config`, () => {
869
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({bidderCode});
870
+ const testOverrideEndpoint = 'http://foo.bar.baz.com/bidderRequest';
871
+ const cfg = {};
872
+ cfg[bidderCode] = {
873
+ endpoint: testOverrideEndpoint
874
+ };
875
+ config.setConfig(cfg);
876
+ const response = spec.buildRequests(validBidRequests, bidderRequest)[0];
877
+ expect(response).to.deep.include(
878
+ {
879
+ method: 'POST',
880
+ url: testOverrideEndpoint
881
+ });
837
882
  });
883
+ });
884
+
885
+ it('should route request to /bidRequest endpoint when dcn & pos present', () => {
838
886
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
839
887
  const response = spec.buildRequests(validBidRequests, bidderRequest);
840
888
  expect(response[0]).to.deep.include({
@@ -862,15 +910,15 @@ describe('YahooSSP Bid Adapter:', () => {
862
910
  bidderRequest.bids = validBidRequests;
863
911
 
864
912
  config.setConfig({
865
- yahoossp: {
913
+ yahooAds: {
866
914
  singleRequestMode: true
867
915
  }
868
916
  });
869
917
 
870
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
871
- expect(data.imp).to.be.an('array').with.lengthOf(2);
918
+ const responsePayload = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
919
+ expect(responsePayload.imp).to.be.an('array').with.lengthOf(2);
872
920
 
873
- expect(data.imp[0]).to.deep.include({
921
+ expect(responsePayload.imp[0]).to.deep.include({
874
922
  id: DEFAULT_BID_ID,
875
923
  ext: {
876
924
  pos: DEFAULT_BID_POS,
@@ -878,7 +926,7 @@ describe('YahooSSP Bid Adapter:', () => {
878
926
  }
879
927
  });
880
928
 
881
- expect(data.imp[1]).to.deep.include({
929
+ expect(responsePayload.imp[1]).to.deep.include({
882
930
  id: BID_ID_2,
883
931
  ext: {
884
932
  pos: BID_POS_2,
@@ -896,8 +944,9 @@ describe('YahooSSP Bid Adapter:', () => {
896
944
 
897
945
  it('buildRequests(): should return an array with the correct amount of request objects', () => {
898
946
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
899
- const response = spec.buildRequests(validBidRequests, bidderRequest).bidderRequest;
900
- expect(response.bids).to.be.an('array').to.have.lengthOf(1);
947
+ const reqs = spec.buildRequests(validBidRequests, bidderRequest);
948
+ expect(reqs).to.be.an('array').to.have.lengthOf(1);
949
+ expect(reqs[0]).to.be.an('object').that.has.keys('method', 'url', 'data', 'options', 'bidderRequest');
901
950
  });
902
951
  });
903
952
 
@@ -905,7 +954,7 @@ describe('YahooSSP Bid Adapter:', () => {
905
954
  it('should return request objects with the relevant custom headers and content type declaration', () => {
906
955
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
907
956
  bidderRequest.gdprConsent.gdprApplies = false;
908
- const options = spec.buildRequests(validBidRequests, bidderRequest).options;
957
+ const options = spec.buildRequests(validBidRequests, bidderRequest)[0].options;
909
958
  expect(options).to.deep.equal(
910
959
  {
911
960
  contentType: 'application/json',
@@ -921,6 +970,7 @@ describe('YahooSSP Bid Adapter:', () => {
921
970
  it('should set the allowed sources user eids', () => {
922
971
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
923
972
  validBidRequests[0].userIdAsEids = createEidsArray({
973
+ connectId: 'connectId_FROM_USER_ID_MODULE',
924
974
  admixerId: 'admixerId_FROM_USER_ID_MODULE',
925
975
  adtelligentId: 'adtelligentId_FROM_USER_ID_MODULE',
926
976
  amxId: 'amxId_FROM_USER_ID_MODULE',
@@ -933,9 +983,10 @@ describe('YahooSSP Bid Adapter:', () => {
933
983
  criteoId: 'criteoId_FROM_USER_ID_MODULE',
934
984
  fabrickId: 'fabrickId_FROM_USER_ID_MODULE',
935
985
  });
936
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
986
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
937
987
 
938
988
  expect(data.user.ext.eids).to.deep.equal([
989
+ {source: 'yahoo.com', uids: [{id: 'connectId_FROM_USER_ID_MODULE', atype: 3}]},
939
990
  {source: 'admixer.net', uids: [{id: 'admixerId_FROM_USER_ID_MODULE', atype: 3}]},
940
991
  {source: 'adtelligent.com', uids: [{id: 'adtelligentId_FROM_USER_ID_MODULE', atype: 3}]},
941
992
  {source: 'amxdt.net', uids: [{id: 'amxId_FROM_USER_ID_MODULE', atype: 1}]},
@@ -955,7 +1006,7 @@ describe('YahooSSP Bid Adapter:', () => {
955
1006
  validBidRequests[0].userIdAsEids = createEidsArray({
956
1007
  justId: 'justId_FROM_USER_ID_MODULE'
957
1008
  });
958
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1009
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
959
1010
 
960
1011
  expect(data.user.ext.eids).to.deep.equal([]);
961
1012
  });
@@ -964,7 +1015,7 @@ describe('YahooSSP Bid Adapter:', () => {
964
1015
  describe('Request Payload oRTB bid validation:', () => {
965
1016
  it('should generate a valid openRTB bid-request object in the data field', () => {
966
1017
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
967
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1018
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
968
1019
  expect(data.site).to.deep.equal({
969
1020
  id: bidderRequest.bids[0].params.dcn,
970
1021
  page: bidderRequest.refererInfo.page
@@ -1013,7 +1064,7 @@ describe('YahooSSP Bid Adapter:', () => {
1013
1064
  it('should generate a valid openRTB imp.ext object in the bid-request', () => {
1014
1065
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
1015
1066
  const bid = validBidRequests[0];
1016
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1067
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1017
1068
  expect(data.imp[0].ext).to.deep.equal({
1018
1069
  pos: bid.params.pos,
1019
1070
  dfp_ad_unit_code: DEFAULT_AD_UNIT_CODE
@@ -1023,7 +1074,7 @@ describe('YahooSSP Bid Adapter:', () => {
1023
1074
  it('should use siteId value as site.id in the outbound bid-request when using "pubId" integration mode', () => {
1024
1075
  let { validBidRequests, bidderRequest } = generateBuildRequestMock({pubIdMode: true});
1025
1076
  validBidRequests[0].params.siteId = '1234567';
1026
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1077
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1027
1078
  expect(data.site.id).to.equal('1234567');
1028
1079
  });
1029
1080
 
@@ -1039,7 +1090,7 @@ describe('YahooSSP Bid Adapter:', () => {
1039
1090
  }
1040
1091
  }
1041
1092
  let { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
1042
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1093
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1043
1094
  expect(data.site.publisher).to.deep.equal({
1044
1095
  ext: {
1045
1096
  publisherblob: 'pblob',
@@ -1060,7 +1111,7 @@ describe('YahooSSP Bid Adapter:', () => {
1060
1111
  }
1061
1112
  }
1062
1113
  let { validBidRequests, bidderRequest } = generateBuildRequestMock({pubIdMode: true, ortb2});
1063
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1114
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1064
1115
  expect(data.site.publisher).to.deep.equal({
1065
1116
  id: DEFAULT_PUBID,
1066
1117
  ext: {
@@ -1073,17 +1124,13 @@ describe('YahooSSP Bid Adapter:', () => {
1073
1124
  it('should use placementId value as imp.tagid in the outbound bid-request when using "pubId" integration mode', () => {
1074
1125
  let { validBidRequests, bidderRequest } = generateBuildRequestMock({pubIdMode: true});
1075
1126
  validBidRequests[0].params.placementId = 'header-300x250';
1076
- const data = spec.buildRequests(validBidRequests, bidderRequest).data;
1127
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1077
1128
  expect(data.imp[0].tagid).to.deep.equal('header-300x250');
1078
1129
  });
1079
1130
  });
1080
1131
 
1081
1132
  describe('Request Payload oRTB bid.imp validation:', () => {
1082
- // Validate Banner imp imp when yahoossp.mode=undefined
1083
- it('should generate a valid "Banner" imp object', () => {
1084
- config.setConfig({
1085
- yahoossp: {}
1086
- });
1133
+ it('should generate a valid "Banner" imp object when mode config override is undefined', () => {
1087
1134
  const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
1088
1135
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1089
1136
  expect(data.imp[0].video).to.not.exist;
@@ -1093,74 +1140,82 @@ describe('YahooSSP Bid Adapter:', () => {
1093
1140
  });
1094
1141
  });
1095
1142
 
1096
- // Validate Banner imp when yahoossp.mode="banner"
1097
- it('should generate a valid "Banner" imp object', () => {
1098
- config.setConfig({
1099
- yahoossp: { mode: 'banner' }
1100
- });
1101
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
1102
- const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1103
- expect(data.imp[0].video).to.not.exist;
1104
- expect(data.imp[0].banner).to.deep.equal({
1105
- mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
1106
- format: [{w: 300, h: 250}, {w: 300, h: 600}]
1143
+ // Validate Banner imp when config value for mode="banner"
1144
+ VALID_BIDDER_CODES.forEach(bidderCode => {
1145
+ it(`should generate a valid "Banner" imp object for ${bidderCode} config override`, () => {
1146
+ const cfg = {};
1147
+ cfg[bidderCode] = {
1148
+ mode: BANNER
1149
+ };
1150
+ config.setConfig(cfg);
1151
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({bidderCode});
1152
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1153
+ expect(data.imp[0].video).to.not.exist;
1154
+ expect(data.imp[0].banner).to.deep.equal({
1155
+ mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
1156
+ format: [{w: 300, h: 250}, {w: 300, h: 600}]
1157
+ });
1107
1158
  });
1108
- });
1109
1159
 
1110
- // Validate Video imp
1111
- it('should generate a valid "Video" only imp object', () => {
1112
- config.setConfig({
1113
- yahoossp: { mode: 'video' }
1114
- });
1115
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: 'video'});
1116
- const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1117
- expect(data.imp[0].banner).to.not.exist;
1118
- expect(data.imp[0].video).to.deep.equal({
1119
- mimes: ['video/mp4', 'application/javascript'],
1120
- w: 300,
1121
- h: 250,
1122
- api: [2],
1123
- protocols: [2, 5],
1124
- startdelay: 0,
1125
- linearity: 1,
1126
- maxbitrate: undefined,
1127
- maxduration: undefined,
1128
- minduration: undefined,
1129
- delivery: undefined,
1130
- pos: undefined,
1131
- playbackmethod: undefined,
1132
- rewarded: undefined,
1133
- placement: undefined
1160
+ // Validate Video imp
1161
+ it(`should generate a valid "Video" only imp object for ${bidderCode} config override`, () => {
1162
+ const cfg = {};
1163
+ cfg[bidderCode] = {
1164
+ mode: VIDEO
1165
+ };
1166
+ config.setConfig(cfg);
1167
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({bidderCode, adUnitType: 'video'});
1168
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1169
+ expect(data.imp[0].banner).to.not.exist;
1170
+ expect(data.imp[0].video).to.deep.equal({
1171
+ mimes: ['video/mp4', 'application/javascript'],
1172
+ w: 300,
1173
+ h: 250,
1174
+ api: [2],
1175
+ protocols: [2, 5],
1176
+ startdelay: 0,
1177
+ linearity: 1,
1178
+ maxbitrate: undefined,
1179
+ maxduration: undefined,
1180
+ minduration: undefined,
1181
+ delivery: undefined,
1182
+ pos: undefined,
1183
+ playbackmethod: undefined,
1184
+ rewarded: undefined,
1185
+ placement: undefined
1186
+ });
1134
1187
  });
1135
- });
1136
1188
 
1137
- // Validate multi-format Video+banner imp
1138
- it('should generate a valid multi-format "Video + Banner" imp object', () => {
1139
- config.setConfig({
1140
- yahoossp: { mode: 'all' }
1141
- });
1142
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: 'multi-format'});
1143
- const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1144
- expect(data.imp[0].banner).to.deep.equal({
1145
- mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
1146
- format: [{w: 300, h: 250}, {w: 300, h: 600}]
1147
- });
1148
- expect(data.imp[0].video).to.deep.equal({
1149
- mimes: ['video/mp4', 'application/javascript'],
1150
- w: 300,
1151
- h: 250,
1152
- api: [2],
1153
- protocols: [2, 5],
1154
- startdelay: 0,
1155
- linearity: 1,
1156
- maxbitrate: undefined,
1157
- maxduration: undefined,
1158
- minduration: undefined,
1159
- delivery: undefined,
1160
- pos: undefined,
1161
- playbackmethod: undefined,
1162
- rewarded: undefined,
1163
- placement: undefined
1189
+ // Validate multi-format Video+banner imp
1190
+ it(`should generate a valid multi-format "Video + Banner" imp object for ${bidderCode} config override`, () => {
1191
+ const cfg = {};
1192
+ cfg[bidderCode] = {
1193
+ mode: 'all'
1194
+ };
1195
+ config.setConfig(cfg);
1196
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({bidderCode, adUnitType: 'multi-format'});
1197
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1198
+ expect(data.imp[0].banner).to.deep.equal({
1199
+ mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
1200
+ format: [{w: 300, h: 250}, {w: 300, h: 600}]
1201
+ });
1202
+ expect(data.imp[0].video).to.deep.equal({
1203
+ mimes: ['video/mp4', 'application/javascript'],
1204
+ w: 300,
1205
+ h: 250,
1206
+ api: [2],
1207
+ protocols: [2, 5],
1208
+ startdelay: 0,
1209
+ linearity: 1,
1210
+ maxbitrate: undefined,
1211
+ maxduration: undefined,
1212
+ minduration: undefined,
1213
+ delivery: undefined,
1214
+ pos: undefined,
1215
+ playbackmethod: undefined,
1216
+ rewarded: undefined,
1217
+ placement: undefined
1218
+ });
1164
1219
  });
1165
1220
  });
1166
1221
 
@@ -1179,7 +1234,6 @@ describe('YahooSSP Bid Adapter:', () => {
1179
1234
  invalidKey5: undefined
1180
1235
  };
1181
1236
  const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1182
-
1183
1237
  expect(data.imp[0].ext.kvs).to.deep.equal({
1184
1238
  key1: 'String',
1185
1239
  key2: 123456,
@@ -1192,10 +1246,6 @@ describe('YahooSSP Bid Adapter:', () => {
1192
1246
  describe('Multiple adUnit validations:', () => {
1193
1247
  // Multiple banner adUnits
1194
1248
  it('should generate multiple bid-requests for each adUnit - 2 banner only', () => {
1195
- config.setConfig({
1196
- yahoossp: { mode: 'banner' }
1197
- });
1198
-
1199
1249
  const BID_ID_2 = '84ab50xxxxx';
1200
1250
  const BID_POS_2 = 'footer';
1201
1251
  const AD_UNIT_CODE_2 = 'test-ad-unit-code-123';
@@ -1209,12 +1259,12 @@ describe('YahooSSP Bid Adapter:', () => {
1209
1259
  validBidRequests = [bidRequest, bidRequest2, bidRequest3];
1210
1260
  bidderRequest.bids = validBidRequests;
1211
1261
 
1212
- const response = spec.buildRequests(validBidRequests, bidderRequest)
1213
- expect(response).to.be.a('array');
1214
- expect(response.length).to.equal(2);
1215
- response.forEach((obj) => {
1216
- expect(obj.data.imp[0].video).to.not.exist
1217
- expect(obj.data.imp[0].banner).to.deep.equal({
1262
+ const reqs = spec.buildRequests(validBidRequests, bidderRequest)
1263
+ expect(reqs).to.be.a('array');
1264
+ expect(reqs.length).to.equal(2);
1265
+ reqs.forEach(req => {
1266
+ expect(req.data.imp[0].video).to.not.exist
1267
+ expect(req.data.imp[0].banner).to.deep.equal({
1218
1268
  mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
1219
1269
  format: [{w: 300, h: 250}, {w: 300, h: 600}]
1220
1270
  });
@@ -1223,9 +1273,11 @@ describe('YahooSSP Bid Adapter:', () => {
1223
1273
 
1224
1274
  // Multiple video adUnits
1225
1275
  it('should generate multiple bid-requests for each adUnit - 2 video only', () => {
1226
- config.setConfig({
1227
- yahoossp: { mode: 'video' }
1228
- });
1276
+ const cfg = {};
1277
+ cfg[DEFAULT_BIDDER_CODE] = {
1278
+ mode: VIDEO
1279
+ };
1280
+ config.setConfig(cfg);
1229
1281
  const BID_ID_2 = '84ab50xxxxx';
1230
1282
  const BID_POS_2 = 'footer';
1231
1283
  const AD_UNIT_CODE_2 = 'test-ad-unit-code-123';
@@ -1233,18 +1285,18 @@ describe('YahooSSP Bid Adapter:', () => {
1233
1285
  const BID_POS_3 = 'hero';
1234
1286
  const AD_UNIT_CODE_3 = 'video-ad-unit';
1235
1287
 
1236
- let { bidRequest, validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: 'video'}); // video
1237
- const { bidRequest: bidRequest2 } = generateBuildRequestMock({bidId: BID_ID_2, pos: BID_POS_2, adUnitCode: AD_UNIT_CODE_2, adUnitType: 'video'}); // video
1238
- const { bidRequest: bidRequest3 } = generateBuildRequestMock({bidId: BID_ID_3, pos: BID_POS_3, adUnitCode: AD_UNIT_CODE_3}); // banner (should be filtered)
1288
+ let {bidRequest, validBidRequests, bidderRequest} = generateBuildRequestMock({adUnitType: 'video'}); // video
1289
+ const {bidRequest: bidRequest2} = generateBuildRequestMock({bidId: BID_ID_2, pos: BID_POS_2, adUnitCode: AD_UNIT_CODE_2, adUnitType: 'video'}); // video
1290
+ const {bidRequest: bidRequest3} = generateBuildRequestMock({bidId: BID_ID_3, pos: BID_POS_3, adUnitCode: AD_UNIT_CODE_3}); // banner (should be filtered)
1239
1291
  validBidRequests = [bidRequest, bidRequest2, bidRequest3];
1240
1292
  bidderRequest.bids = validBidRequests;
1241
1293
 
1242
- const response = spec.buildRequests(validBidRequests, bidderRequest)
1243
- expect(response).to.be.a('array');
1244
- expect(response.length).to.equal(2);
1245
- response.forEach((obj) => {
1246
- expect(obj.data.imp[0].banner).to.not.exist
1247
- expect(obj.data.imp[0].video).to.deep.equal({
1294
+ const reqs = spec.buildRequests(validBidRequests, bidderRequest)
1295
+ expect(reqs).to.be.a('array');
1296
+ expect(reqs.length).to.equal(2);
1297
+ reqs.forEach(req => {
1298
+ expect(req.data.imp[0].banner).to.not.exist
1299
+ expect(req.data.imp[0].video).to.deep.equal({
1248
1300
  mimes: ['video/mp4', 'application/javascript'],
1249
1301
  w: 300,
1250
1302
  h: 250,
@@ -1265,9 +1317,9 @@ describe('YahooSSP Bid Adapter:', () => {
1265
1317
  });
1266
1318
  // Mixed adUnits 1-banner, 1-video, 1-native (should filter out native)
1267
1319
  it('should generate multiple bid-requests for both "video & banner" adUnits', () => {
1268
- config.setConfig({
1269
- yahoossp: { mode: 'all' }
1270
- });
1320
+ const cfg = {};
1321
+ cfg[DEFAULT_BIDDER_CODE] = { mode: 'all' };
1322
+ config.setConfig(cfg);
1271
1323
  const BID_ID_2 = '84ab50xxxxx';
1272
1324
  const BID_POS_2 = 'footer';
1273
1325
  const AD_UNIT_CODE_2 = 'video-ad-unit';
@@ -1281,21 +1333,21 @@ describe('YahooSSP Bid Adapter:', () => {
1281
1333
  validBidRequests = [bidRequest, bidRequest2, bidRequest3];
1282
1334
  bidderRequest.bids = validBidRequests;
1283
1335
 
1284
- const response = spec.buildRequests(validBidRequests, bidderRequest);
1285
- expect(response).to.be.a('array');
1286
- expect(response.length).to.equal(2);
1287
- response.forEach((obj) => {
1288
- expect(obj.data.imp[0].native).to.not.exist;
1336
+ const reqs = spec.buildRequests(validBidRequests, bidderRequest);
1337
+ expect(reqs).to.be.a('array');
1338
+ expect(reqs.length).to.equal(2);
1339
+ reqs.forEach(req => {
1340
+ expect(req.data.imp[0].native).to.not.exist;
1289
1341
  });
1290
1342
 
1291
- const data1 = response[0].data;
1343
+ const data1 = reqs[0].data;
1292
1344
  expect(data1.imp[0].video).to.not.exist;
1293
1345
  expect(data1.imp[0].banner).to.deep.equal({
1294
1346
  mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
1295
1347
  format: [{w: 300, h: 250}, {w: 300, h: 600}]
1296
1348
  });
1297
1349
 
1298
- const data2 = response[1].data;
1350
+ const data2 = reqs[1].data;
1299
1351
  expect(data2.imp[0].banner).to.not.exist;
1300
1352
  expect(data2.imp[0].video).to.deep.equal({
1301
1353
  mimes: ['video/mp4', 'application/javascript'],
@@ -1318,90 +1370,98 @@ describe('YahooSSP Bid Adapter:', () => {
1318
1370
  });
1319
1371
 
1320
1372
  describe('Video params firstlook & bidOverride validations:', () => {
1321
- it('should first look at params.bidOverride for video placement data', () => {
1322
- config.setConfig({
1323
- yahoossp: { mode: 'video' }
1324
- });
1325
- const bidOverride = {
1326
- imp: {
1327
- video: {
1328
- mimes: ['video/mp4'],
1329
- w: 400,
1330
- h: 350,
1331
- api: [1],
1332
- protocols: [1, 3],
1333
- startdelay: 0,
1334
- linearity: 1,
1335
- maxbitrate: 400000,
1336
- maxduration: 3600,
1337
- minduration: 1500,
1338
- delivery: 1,
1339
- pos: 123456,
1340
- playbackmethod: 1,
1341
- rewarded: 1,
1342
- placement: 1
1373
+ VALID_BIDDER_CODES.forEach(bidderCode => {
1374
+ it(`should first look at params.bidOverride for video placement data for ${bidderCode} config override`, () => {
1375
+ const cfg = {};
1376
+ cfg[bidderCode] = {
1377
+ mode: VIDEO
1378
+ };
1379
+ config.setConfig(cfg);
1380
+ const bidOverride = {
1381
+ imp: {
1382
+ video: {
1383
+ mimes: ['video/mp4'],
1384
+ w: 400,
1385
+ h: 350,
1386
+ api: [1],
1387
+ protocols: [1, 3],
1388
+ startdelay: 0,
1389
+ linearity: 1,
1390
+ maxbitrate: 400000,
1391
+ maxduration: 3600,
1392
+ minduration: 1500,
1393
+ delivery: 1,
1394
+ pos: 123456,
1395
+ playbackmethod: 1,
1396
+ rewarded: 1,
1397
+ placement: 1
1398
+ }
1343
1399
  }
1344
1400
  }
1345
- }
1346
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: 'video', bidOverrideObject: bidOverride});
1347
- const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1348
- expect(data.imp[0].video).to.deep.equal(bidOverride.imp.video);
1349
- });
1350
-
1351
- it('should second look at bid.mediaTypes.video for video placement data', () => {
1352
- config.setConfig({
1353
- yahoossp: { mode: 'video' }
1354
- });
1355
- let { bidRequest, bidderRequest } = generateBuildRequestMock({adUnitType: 'video'});
1356
- bidRequest.mediaTypes.video = {
1357
- mimes: ['video/mp4'],
1358
- playerSize: [400, 350],
1359
- api: [1],
1360
- protocols: [1, 3],
1361
- startdelay: 0,
1362
- linearity: 1,
1363
- maxbitrate: 400000,
1364
- maxduration: 3600,
1365
- minduration: 1500,
1366
- delivery: 1,
1367
- pos: 123456,
1368
- playbackmethod: 1,
1369
- placement: 1
1370
- }
1371
- const validBidRequests = [bidRequest];
1372
- bidderRequest.bids = validBidRequests;
1373
- const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1374
- expect(data.imp[0].video).to.deep.equal({
1375
- mimes: ['video/mp4'],
1376
- w: 400,
1377
- h: 350,
1378
- api: [1],
1379
- protocols: [1, 3],
1380
- startdelay: 0,
1381
- linearity: 1,
1382
- maxbitrate: 400000,
1383
- maxduration: 3600,
1384
- minduration: 1500,
1385
- delivery: 1,
1386
- pos: 123456,
1387
- playbackmethod: 1,
1388
- placement: 1,
1389
- rewarded: undefined
1401
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({bidderCode, adUnitType: 'video', bidOverrideObject: bidOverride});
1402
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1403
+ expect(data.imp[0].video).to.deep.equal(bidOverride.imp.video);
1390
1404
  });
1391
- });
1392
1405
 
1393
- it('should use params.bidOverride.device.ip override', () => {
1394
- config.setConfig({
1395
- yahoossp: { mode: 'all' }
1406
+ it(`should second look at bid.mediaTypes.video for video placement data for ${bidderCode} config override`, () => {
1407
+ const cfg = {};
1408
+ cfg[bidderCode] = {
1409
+ mode: VIDEO
1410
+ };
1411
+ config.setConfig(cfg);
1412
+ let { bidRequest, bidderRequest } = generateBuildRequestMock({bidderCode, adUnitType: 'video'});
1413
+ bidRequest.mediaTypes.video = {
1414
+ mimes: ['video/mp4'],
1415
+ playerSize: [400, 350],
1416
+ api: [1],
1417
+ protocols: [1, 3],
1418
+ startdelay: 0,
1419
+ linearity: 1,
1420
+ maxbitrate: 400000,
1421
+ maxduration: 3600,
1422
+ minduration: 1500,
1423
+ delivery: 1,
1424
+ pos: 123456,
1425
+ playbackmethod: 1,
1426
+ placement: 1
1427
+ }
1428
+ const validBidRequests = [bidRequest];
1429
+ bidderRequest.bids = validBidRequests;
1430
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1431
+ expect(data.imp[0].video).to.deep.equal({
1432
+ mimes: ['video/mp4'],
1433
+ w: 400,
1434
+ h: 350,
1435
+ api: [1],
1436
+ protocols: [1, 3],
1437
+ startdelay: 0,
1438
+ linearity: 1,
1439
+ maxbitrate: 400000,
1440
+ maxduration: 3600,
1441
+ minduration: 1500,
1442
+ delivery: 1,
1443
+ pos: 123456,
1444
+ playbackmethod: 1,
1445
+ placement: 1,
1446
+ rewarded: undefined
1447
+ });
1396
1448
  });
1397
- const bidOverride = {
1398
- device: {
1399
- ip: '1.2.3.4'
1449
+
1450
+ it(`should use params.bidOverride.device.ip override for ${bidderCode} config override`, () => {
1451
+ const cfg = {};
1452
+ cfg[bidderCode] = {
1453
+ mode: 'all'
1454
+ };
1455
+ config.setConfig(cfg);
1456
+ const bidOverride = {
1457
+ device: {
1458
+ ip: '1.2.3.4'
1459
+ }
1400
1460
  }
1401
- }
1402
- const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: 'video', bidOverrideObject: bidOverride});
1403
- const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1404
- expect(data.device.ip).to.deep.equal(bidOverride.device.ip);
1461
+ const { validBidRequests, bidderRequest } = generateBuildRequestMock({bidderCode, adUnitType: 'video', bidOverrideObject: bidOverride});
1462
+ const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
1463
+ expect(data.device.ip).to.deep.equal(bidOverride.device.ip);
1464
+ });
1405
1465
  });
1406
1466
  });
1407
1467
  // #endregion buildRequests():
@@ -1417,6 +1477,22 @@ describe('YahooSSP Bid Adapter:', () => {
1417
1477
  });
1418
1478
 
1419
1479
  describe('for mediaTypes: "video"', () => {
1480
+ beforeEach(() => {
1481
+ config.setConfig({
1482
+ yahooAds: {
1483
+ mode: VIDEO
1484
+ }
1485
+ });
1486
+ });
1487
+
1488
+ afterEach(() => {
1489
+ config.setConfig({
1490
+ yahooAds: {
1491
+ mode: undefined
1492
+ }
1493
+ });
1494
+ });
1495
+
1420
1496
  it('should insert video VPAID payload into vastXml', () => {
1421
1497
  const { serverResponse, bidderRequest } = generateResponseMock('video');
1422
1498
  const response = spec.interpretResponse(serverResponse, {bidderRequest});
@@ -1434,28 +1510,38 @@ describe('YahooSSP Bid Adapter:', () => {
1434
1510
  expect(response[0].mediaType).to.equal('video');
1435
1511
  })
1436
1512
 
1437
- it('should insert video DAP O2 Player into ad', () => {
1438
- const { serverResponse, bidderRequest } = generateResponseMock('dap-o2', 'vpaid');
1439
- const response = spec.interpretResponse(serverResponse, {bidderRequest});
1440
- expect(response[0].ad).to.equal('<script>o2playerSettings</script>');
1441
- expect(response[0].vastUrl).to.be.undefined;
1442
- expect(response[0].vastXml).to.be.undefined;
1443
- expect(response[0].mediaType).to.equal('banner');
1444
- });
1513
+ describe('wrapped in video players for display inventory', () => {
1514
+ beforeEach(() => {
1515
+ config.setConfig({
1516
+ yahooAds: {
1517
+ mode: undefined
1518
+ }
1519
+ });
1520
+ });
1445
1521
 
1446
- it('should insert video DAP Unified Player into ad', () => {
1447
- const { serverResponse, bidderRequest } = generateResponseMock('dap-up', 'vpaid');
1448
- const response = spec.interpretResponse(serverResponse, {bidderRequest});
1449
- expect(response[0].ad).to.equal('<script>YAHOO.VideoPlatform.VideoPlayer</script>');
1450
- expect(response[0].vastUrl).to.be.undefined;
1451
- expect(response[0].vastXml).to.be.undefined;
1452
- expect(response[0].mediaType).to.equal('banner');
1453
- })
1522
+ it('should insert video DAP O2 Player into ad', () => {
1523
+ const { serverResponse, bidderRequest } = generateResponseMock('dap-o2', 'vpaid');
1524
+ const response = spec.interpretResponse(serverResponse, {bidderRequest});
1525
+ expect(response[0].ad).to.equal('<script>o2playerSettings</script>');
1526
+ expect(response[0].vastUrl).to.be.undefined;
1527
+ expect(response[0].vastXml).to.be.undefined;
1528
+ expect(response[0].mediaType).to.equal('banner');
1529
+ });
1530
+
1531
+ it('should insert video DAP Unified Player into ad', () => {
1532
+ const { serverResponse, bidderRequest } = generateResponseMock('dap-up', 'vpaid');
1533
+ const response = spec.interpretResponse(serverResponse, {bidderRequest});
1534
+ expect(response[0].ad).to.equal('<script>YAHOO.VideoPlatform.VideoPlayer</script>');
1535
+ expect(response[0].vastUrl).to.be.undefined;
1536
+ expect(response[0].vastXml).to.be.undefined;
1537
+ expect(response[0].mediaType).to.equal('banner');
1538
+ })
1539
+ });
1454
1540
  });
1455
1541
 
1456
1542
  describe('Support Advertiser domains', () => {
1457
1543
  it('should append bid-response adomain to meta.advertiserDomains', () => {
1458
- const { serverResponse, bidderRequest } = generateResponseMock('video', 'vpaid');
1544
+ const { serverResponse, bidderRequest } = generateResponseMock('banner');
1459
1545
  const response = spec.interpretResponse(serverResponse, {bidderRequest});
1460
1546
  expect(response[0].meta.advertiserDomains).to.be.a('array');
1461
1547
  expect(response[0].meta.advertiserDomains[0]).to.equal('advertiser-domain.com');
@@ -1490,53 +1576,55 @@ describe('YahooSSP Bid Adapter:', () => {
1490
1576
  });
1491
1577
 
1492
1578
  describe('Time To Live (ttl)', () => {
1493
- const UNSUPPORTED_TTL_FORMATS = ['string', [1, 2, 3], true, false, null, undefined];
1494
- UNSUPPORTED_TTL_FORMATS.forEach(param => {
1495
- it('should not allow unsupported global yahoossp.ttl formats and default to 300', () => {
1496
- const { serverResponse, bidderRequest } = generateResponseMock('banner');
1497
- config.setConfig({
1498
- yahoossp: { ttl: param }
1579
+ VALID_BIDDER_CODES.forEach(bidderCode => {
1580
+ const UNSUPPORTED_TTL_FORMATS = ['string', [1, 2, 3], true, false, null, undefined];
1581
+ UNSUPPORTED_TTL_FORMATS.forEach(param => {
1582
+ it(`should not allow unsupported global ${bidderCode}.ttl formats and default to 300`, () => {
1583
+ const { serverResponse, bidderRequest } = generateResponseMock('banner');
1584
+ const cfg = {};
1585
+ cfg['yahooAds'] = { ttl: param };
1586
+ config.setConfig(cfg);
1587
+ const response = spec.interpretResponse(serverResponse, {bidderRequest});
1588
+ expect(response[0].ttl).to.equal(300);
1499
1589
  });
1500
- const response = spec.interpretResponse(serverResponse, {bidderRequest});
1501
- expect(response[0].ttl).to.equal(300);
1502
- });
1503
1590
 
1504
- it('should not allow unsupported params.ttl formats and default to 300', () => {
1505
- const { serverResponse, bidderRequest } = generateResponseMock('banner');
1506
- bidderRequest.bids[0].params.ttl = param;
1507
- const response = spec.interpretResponse(serverResponse, {bidderRequest});
1508
- expect(response[0].ttl).to.equal(300);
1591
+ it('should not allow unsupported params.ttl formats and default to 300', () => {
1592
+ const { serverResponse, bidderRequest } = generateResponseMock('banner');
1593
+ bidderRequest.bids[0].params.ttl = param;
1594
+ const response = spec.interpretResponse(serverResponse, {bidderRequest});
1595
+ expect(response[0].ttl).to.equal(300);
1596
+ });
1509
1597
  });
1510
- });
1511
1598
 
1512
- const UNSUPPORTED_TTL_VALUES = [-1, 3601];
1513
- UNSUPPORTED_TTL_VALUES.forEach(param => {
1514
- it('should not allow invalid global yahoossp.ttl values 3600 < ttl < 0 and default to 300', () => {
1515
- const { serverResponse, bidderRequest } = generateResponseMock('banner');
1516
- config.setConfig({
1517
- yahoossp: { ttl: param }
1599
+ const UNSUPPORTED_TTL_VALUES = [-1, 3601];
1600
+ UNSUPPORTED_TTL_VALUES.forEach(param => {
1601
+ it('should not allow invalid global config ttl values 3600 < ttl < 0 and default to 300', () => {
1602
+ const { serverResponse, bidderRequest } = generateResponseMock('banner');
1603
+ config.setConfig({
1604
+ yahooAds: { ttl: param }
1605
+ });
1606
+ const response = spec.interpretResponse(serverResponse, {bidderRequest});
1607
+ expect(response[0].ttl).to.equal(300);
1608
+ });
1609
+
1610
+ it('should not allow invalid params.ttl values 3600 < ttl < 0 and default to 300', () => {
1611
+ const { serverResponse, bidderRequest } = generateResponseMock('banner');
1612
+ bidderRequest.bids[0].params.ttl = param;
1613
+ const response = spec.interpretResponse(serverResponse, {bidderRequest});
1614
+ expect(response[0].ttl).to.equal(300);
1518
1615
  });
1519
- const response = spec.interpretResponse(serverResponse, {bidderRequest});
1520
- expect(response[0].ttl).to.equal(300);
1521
1616
  });
1522
1617
 
1523
- it('should not allow invalid params.ttl values 3600 < ttl < 0 and default to 300', () => {
1618
+ it('should give presedence to Gloabl ttl over params.ttl ', () => {
1524
1619
  const { serverResponse, bidderRequest } = generateResponseMock('banner');
1525
- bidderRequest.bids[0].params.ttl = param;
1620
+ config.setConfig({
1621
+ yahooAds: { ttl: 500 }
1622
+ });
1623
+ bidderRequest.bids[0].params.ttl = 400;
1526
1624
  const response = spec.interpretResponse(serverResponse, {bidderRequest});
1527
- expect(response[0].ttl).to.equal(300);
1625
+ expect(response[0].ttl).to.equal(500);
1528
1626
  });
1529
1627
  });
1530
-
1531
- it('should give presedence to Gloabl ttl over params.ttl ', () => {
1532
- const { serverResponse, bidderRequest } = generateResponseMock('banner');
1533
- config.setConfig({
1534
- yahoossp: { ttl: 500 }
1535
- });
1536
- bidderRequest.bids[0].params.ttl = 400;
1537
- const response = spec.interpretResponse(serverResponse, {bidderRequest});
1538
- expect(response[0].ttl).to.equal(500);
1539
- });
1540
1628
  });
1541
1629
 
1542
1630
  describe('Aliasing support', () => {