prebid.js 7.44.0 → 7.46.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 (309) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/acuityAdsBidAdapter.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admaticBidAdapter.js +1 -1
  8. package/dist/adnuntiusBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adtrgtmeBidAdapter.js +1 -1
  11. package/dist/adxcgBidAdapter.js +1 -1
  12. package/dist/adyoulikeBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/appushBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/beyondmediaBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/braveBidAdapter.js +1 -1
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/brightcomBidAdapter.js +1 -1
  29. package/dist/brightcomSSPBidAdapter.js +1 -1
  30. package/dist/carodaBidAdapter.js +1 -1
  31. package/dist/chtnwBidAdapter.js +1 -1
  32. package/dist/coinzillaBidAdapter.js +1 -1
  33. package/dist/compassBidAdapter.js +1 -1
  34. package/dist/concertBidAdapter.js +1 -1
  35. package/dist/connectIdSystem.js +1 -1
  36. package/dist/connectadBidAdapter.js +1 -1
  37. package/dist/consumableBidAdapter.js +1 -1
  38. package/dist/contentexchangeBidAdapter.js +1 -1
  39. package/dist/conversantAnalyticsAdapter.js +1 -1
  40. package/dist/conversantBidAdapter.js +1 -1
  41. package/dist/craftBidAdapter.js +1 -1
  42. package/dist/criteoBidAdapter.js +1 -1
  43. package/dist/cwireBidAdapter.js +1 -1
  44. package/dist/debugging-standalone.js +1 -1
  45. package/dist/dependencies.json +15 -0
  46. package/dist/domainOverrideToRootDomain.js +1 -0
  47. package/dist/dspxBidAdapter.js +1 -1
  48. package/dist/eplanningBidAdapter.js +1 -1
  49. package/dist/eskimiBidAdapter.js +1 -0
  50. package/dist/feedadBidAdapter.js +1 -1
  51. package/dist/finativeBidAdapter.js +1 -1
  52. package/dist/freewheel-sspBidAdapter.js +1 -1
  53. package/dist/glimpseBidAdapter.js +1 -1
  54. package/dist/globalsunBidAdapter.js +1 -1
  55. package/dist/gmosspBidAdapter.js +1 -1
  56. package/dist/goldbachBidAdapter.js +1 -1
  57. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  58. package/dist/gridBidAdapter.js +1 -1
  59. package/dist/growthCodeIdSystem.js +1 -1
  60. package/dist/gumgumBidAdapter.js +1 -1
  61. package/dist/h12mediaBidAdapter.js +1 -1
  62. package/dist/id5IdSystem.js +1 -1
  63. package/dist/improvedigitalBidAdapter.js +1 -1
  64. package/dist/inmarBidAdapter.js +1 -1
  65. package/dist/insticatorBidAdapter.js +1 -1
  66. package/dist/iqzoneBidAdapter.js +1 -1
  67. package/dist/ivsBidAdapter.js +1 -0
  68. package/dist/ixBidAdapter.js +1 -1
  69. package/dist/justpremiumBidAdapter.js +1 -1
  70. package/dist/jwplayerVideoProvider.js +1 -1
  71. package/dist/kargoBidAdapter.js +1 -1
  72. package/dist/koblerBidAdapter.js +1 -1
  73. package/dist/konduitAnalyticsAdapter.js +1 -1
  74. package/dist/kueezBidAdapter.js +1 -1
  75. package/dist/kueezRtbBidAdapter.js +1 -1
  76. package/dist/kulturemediaBidAdapter.js +1 -1
  77. package/dist/lassoBidAdapter.js +1 -1
  78. package/dist/lifestreetBidAdapter.js +1 -1
  79. package/dist/liveIntentIdSystem.js +1 -1
  80. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  81. package/dist/logicadBidAdapter.js +1 -1
  82. package/dist/loglyliftBidAdapter.js +1 -1
  83. package/dist/luponmediaBidAdapter.js +1 -1
  84. package/dist/magniteAnalyticsAdapter.js +1 -1
  85. package/dist/malltvAnalyticsAdapter.js +1 -1
  86. package/dist/marsmediaBidAdapter.js +1 -1
  87. package/dist/mathildeadsBidAdapter.js +1 -1
  88. package/dist/mediafuseBidAdapter.js +1 -1
  89. package/dist/medianetBidAdapter.js +1 -1
  90. package/dist/mediasquareBidAdapter.js +1 -1
  91. package/dist/mgidBidAdapter.js +1 -1
  92. package/dist/minutemediaBidAdapter.js +1 -1
  93. package/dist/minutemediaplusBidAdapter.js +1 -1
  94. package/dist/nativoBidAdapter.js +1 -1
  95. package/dist/neuwoRtdProvider.js +1 -1
  96. package/dist/nexx360BidAdapter.js +1 -1
  97. package/dist/not-for-prod/prebid.js +165 -162
  98. package/dist/oguryBidAdapter.js +1 -1
  99. package/dist/onetagBidAdapter.js +1 -1
  100. package/dist/onomagicBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxBidAdapter.js +1 -1
  103. package/dist/openxOrtbBidAdapter.js +1 -1
  104. package/dist/operaadsBidAdapter.js +1 -1
  105. package/dist/optidigitalBidAdapter.js +1 -1
  106. package/dist/ortbConverter.js +1 -1
  107. package/dist/outbrainBidAdapter.js +1 -1
  108. package/dist/pairIdSystem.js +1 -0
  109. package/dist/parrableIdSystem.js +1 -1
  110. package/dist/pixfutureBidAdapter.js +1 -1
  111. package/dist/prebid-core.js +1 -1
  112. package/dist/publinkIdSystem.js +1 -1
  113. package/dist/pubmaticBidAdapter.js +1 -1
  114. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  115. package/dist/pubxBidAdapter.js +1 -1
  116. package/dist/pxyzBidAdapter.js +1 -1
  117. package/dist/quantcastBidAdapter.js +1 -1
  118. package/dist/readpeakBidAdapter.js +1 -1
  119. package/dist/relaidoBidAdapter.js +1 -1
  120. package/dist/rhythmoneBidAdapter.js +1 -1
  121. package/dist/riseBidAdapter.js +1 -1
  122. package/dist/rubiconAnalyticsAdapter.js +1 -1
  123. package/dist/rubiconBidAdapter.js +1 -1
  124. package/dist/seedingAllianceBidAdapter.js +1 -1
  125. package/dist/seedtagBidAdapter.js +1 -1
  126. package/dist/sharedIdSystem.js +1 -1
  127. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  128. package/dist/sharethroughBidAdapter.js +1 -1
  129. package/dist/shinezBidAdapter.js +1 -1
  130. package/dist/smaatoBidAdapter.js +1 -1
  131. package/dist/smartadserverBidAdapter.js +1 -1
  132. package/dist/smarthubBidAdapter.js +1 -1
  133. package/dist/smartxBidAdapter.js +1 -1
  134. package/dist/smilewantedBidAdapter.js +1 -1
  135. package/dist/sonobiBidAdapter.js +1 -1
  136. package/dist/sovrnAnalyticsAdapter.js +1 -1
  137. package/dist/sovrnBidAdapter.js +1 -1
  138. package/dist/sspBCBidAdapter.js +1 -1
  139. package/dist/stvBidAdapter.js +1 -1
  140. package/dist/sublimeBidAdapter.js +1 -1
  141. package/dist/synacormediaBidAdapter.js +1 -1
  142. package/dist/targetVideoBidAdapter.js +1 -1
  143. package/dist/teadsBidAdapter.js +1 -1
  144. package/dist/trionBidAdapter.js +1 -1
  145. package/dist/tripleliftBidAdapter.js +1 -1
  146. package/dist/truereachBidAdapter.js +1 -1
  147. package/dist/ttdBidAdapter.js +1 -1
  148. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  149. package/dist/uid2IdSystem.js +1 -1
  150. package/dist/underdogmediaBidAdapter.js +1 -1
  151. package/dist/undertoneBidAdapter.js +1 -1
  152. package/dist/userId.js +1 -1
  153. package/dist/vidazooBidAdapter.js +1 -1
  154. package/dist/videobyteBidAdapter.js +1 -1
  155. package/dist/videoheroesBidAdapter.js +1 -1
  156. package/dist/vidoomyBidAdapter.js +1 -1
  157. package/dist/visiblemeasuresBidAdapter.js +1 -1
  158. package/dist/visxBidAdapter.js +1 -1
  159. package/dist/vrtcalBidAdapter.js +1 -1
  160. package/dist/vuukleBidAdapter.js +1 -1
  161. package/dist/widespaceBidAdapter.js +1 -1
  162. package/dist/winrBidAdapter.js +1 -1
  163. package/dist/yahoosspBidAdapter.js +1 -1
  164. package/dist/yieldmoBidAdapter.js +1 -1
  165. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  166. package/dist/yieldoneBidAdapter.js +1 -1
  167. package/integrationExamples/gpt/fledge_example.html +103 -0
  168. package/integrationExamples/gpt/prebidServer_fledge_example.html +111 -0
  169. package/libraries/domainOverrideToRootDomain/index.js +39 -0
  170. package/libraries/ortbConverter/processors/video.js +1 -0
  171. package/modules/acuityAdsBidAdapter.js +1 -1
  172. package/modules/admaticBidAdapter.js +7 -2
  173. package/modules/adnuntiusBidAdapter.js +3 -1
  174. package/modules/amxBidAdapter.js +1 -1
  175. package/modules/amxIdSystem.js +23 -20
  176. package/modules/amxIdSystem.md +7 -7
  177. package/modules/appnexusBidAdapter.js +108 -102
  178. package/modules/appushBidAdapter.js +1 -1
  179. package/modules/beyondmediaBidAdapter.js +1 -1
  180. package/modules/bidwatchAnalyticsAdapter.js +2 -0
  181. package/modules/braveBidAdapter.js +1 -1
  182. package/modules/brightcomBidAdapter.js +1 -1
  183. package/modules/brightcomSSPBidAdapter.js +1 -1
  184. package/modules/coinzillaBidAdapter.js +1 -2
  185. package/modules/compassBidAdapter.js +1 -1
  186. package/modules/connectIdSystem.js +96 -21
  187. package/modules/connectIdSystem.md +6 -5
  188. package/modules/contentexchangeBidAdapter.js +1 -1
  189. package/modules/conversantBidAdapter.js +3 -0
  190. package/modules/criteoBidAdapter.js +5 -1
  191. package/modules/eskimiBidAdapter.js +72 -0
  192. package/modules/eskimiBidAdapter.md +34 -0
  193. package/modules/freewheel-sspBidAdapter.js +8 -0
  194. package/modules/glimpseBidAdapter.js +1 -2
  195. package/modules/globalsunBidAdapter.js +1 -1
  196. package/modules/gridBidAdapter.js +43 -20
  197. package/modules/growthCodeIdSystem.js +18 -15
  198. package/modules/gumgumBidAdapter.js +1 -1
  199. package/modules/iqzoneBidAdapter.js +1 -1
  200. package/modules/ivsBidAdapter.js +85 -0
  201. package/modules/ivsBidAdapter.md +34 -0
  202. package/modules/ixBidAdapter.js +72 -105
  203. package/modules/jwplayerVideoProvider.js +25 -32
  204. package/modules/kargoBidAdapter.js +473 -246
  205. package/modules/koblerBidAdapter.js +1 -2
  206. package/modules/kueezBidAdapter.js +1 -1
  207. package/modules/kueezRtbBidAdapter.js +16 -4
  208. package/modules/liveIntentIdSystem.js +8 -0
  209. package/modules/luponmediaBidAdapter.js +1 -1
  210. package/modules/magniteAnalyticsAdapter.js +76 -3
  211. package/modules/mathildeadsBidAdapter.js +1 -1
  212. package/modules/medianetBidAdapter.js +1 -1
  213. package/modules/mediasquareBidAdapter.js +2 -1
  214. package/modules/mgidBidAdapter.js +178 -26
  215. package/modules/minutemediaBidAdapter.js +1 -1
  216. package/modules/minutemediaplusBidAdapter.js +16 -4
  217. package/modules/nativoBidAdapter.js +110 -21
  218. package/modules/neuwoRtdProvider.js +0 -2
  219. package/modules/oguryBidAdapter.js +3 -2
  220. package/modules/onomagicBidAdapter.js +1 -2
  221. package/modules/openxBidAdapter.js +192 -563
  222. package/modules/openxBidAdapter.md +22 -20
  223. package/modules/openxOrtbBidAdapter.js +13 -11
  224. package/modules/openxOrtbBidAdapter.md +5 -3
  225. package/modules/operaadsBidAdapter.js +1 -1
  226. package/modules/pairIdSystem.js +79 -0
  227. package/modules/pubmaticBidAdapter.js +13 -10
  228. package/modules/pubxBidAdapter.js +5 -2
  229. package/modules/riseBidAdapter.js +1 -1
  230. package/modules/sharedIdSystem.js +4 -27
  231. package/modules/sharethroughBidAdapter.js +1 -1
  232. package/modules/shinezBidAdapter.js +1 -1
  233. package/modules/smarthubBidAdapter.js +1 -1
  234. package/modules/synacormediaBidAdapter.js +1 -3
  235. package/modules/truereachBidAdapter.js +1 -2
  236. package/modules/userId/eids.js +24 -0
  237. package/modules/userId/eids.md +16 -0
  238. package/modules/videoheroesBidAdapter.js +1 -1
  239. package/modules/vidoomyBidAdapter.js +33 -4
  240. package/modules/visiblemeasuresBidAdapter.js +1 -1
  241. package/modules/vrtcalBidAdapter.js +1 -1
  242. package/modules/yieldmoBidAdapter.js +15 -5
  243. package/modules/yieldoneBidAdapter.js +1 -1
  244. package/package.json +1 -1
  245. package/src/Renderer.js +2 -1
  246. package/src/config.js +78 -127
  247. package/src/native.js +5 -1
  248. package/test/spec/auctionmanager_spec.js +2 -2
  249. package/test/spec/libraries/domainOverrideToRootDomain/index_spec.js +77 -0
  250. package/test/spec/modules/1plusXRtdProvider_spec.js +8 -7
  251. package/test/spec/modules/acuityAdsBidAdapter_spec.js +2 -1
  252. package/test/spec/modules/adagioBidAdapter_spec.js +0 -25
  253. package/test/spec/modules/admaticBidAdapter_spec.js +1 -1
  254. package/test/spec/modules/adnuntiusBidAdapter_spec.js +2 -1
  255. package/test/spec/modules/amxIdSystem_spec.js +13 -26
  256. package/test/spec/modules/appnexusBidAdapter_spec.js +464 -448
  257. package/test/spec/modules/appushBidAdapter_spec.js +2 -1
  258. package/test/spec/modules/axonixBidAdapter_spec.js +0 -27
  259. package/test/spec/modules/beyondmediaBidAdapter_spec.js +2 -1
  260. package/test/spec/modules/big-richmediaBidAdapter_spec.js +68 -64
  261. package/test/spec/modules/compassBidAdapter_spec.js +2 -1
  262. package/test/spec/modules/connectIdSystem_spec.js +420 -242
  263. package/test/spec/modules/contentexchangeBidAdapter_spec.js +2 -1
  264. package/test/spec/modules/conversantBidAdapter_spec.js +1 -0
  265. package/test/spec/modules/criteoBidAdapter_spec.js +33 -1
  266. package/test/spec/modules/eids_spec.js +30 -0
  267. package/test/spec/modules/eskimiBidAdapter_spec.js +155 -0
  268. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +37 -0
  269. package/test/spec/modules/globalsunBidAdapter_spec.js +2 -1
  270. package/test/spec/modules/gridBidAdapter_spec.js +8 -0
  271. package/test/spec/modules/iqzoneBidAdapter_spec.js +2 -1
  272. package/test/spec/modules/ivsBidAdapter_spec.js +197 -0
  273. package/test/spec/modules/ixBidAdapter_spec.js +141 -71
  274. package/test/spec/modules/kargoBidAdapter_spec.js +297 -140
  275. package/test/spec/modules/koblerBidAdapter_spec.js +0 -20
  276. package/test/spec/modules/kueezRtbBidAdapter_spec.js +22 -2
  277. package/test/spec/modules/liveIntentIdSystem_spec.js +10 -0
  278. package/test/spec/modules/luponmediaBidAdapter_spec.js +1 -1
  279. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +129 -1
  280. package/test/spec/modules/mathildeadsBidAdapter_spec.js +2 -1
  281. package/test/spec/modules/mgidBidAdapter_spec.js +184 -36
  282. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +22 -2
  283. package/test/spec/modules/nativoBidAdapter_spec.js +101 -0
  284. package/test/spec/modules/neuwoRtdProvider_spec.js +0 -1
  285. package/test/spec/modules/oguryBidAdapter_spec.js +19 -4
  286. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  287. package/test/spec/modules/openxBidAdapter_spec.js +1157 -1936
  288. package/test/spec/modules/openxOrtbBidAdapter_spec.js +12 -39
  289. package/test/spec/modules/pairIdSystem_spec.js +68 -0
  290. package/test/spec/modules/pubCommonId_spec.js +0 -17
  291. package/test/spec/modules/pubmaticBidAdapter_spec.js +868 -867
  292. package/test/spec/modules/pubxBidAdapter_spec.js +10 -2
  293. package/test/spec/modules/realvuAnalyticsAdapter_spec.js +0 -5
  294. package/test/spec/modules/sharedIdSystem_spec.js +0 -46
  295. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  296. package/test/spec/modules/smarthubBidAdapter_spec.js +2 -1
  297. package/test/spec/modules/synacormediaBidAdapter_spec.js +0 -26
  298. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +17 -4
  299. package/test/spec/modules/vidoomyBidAdapter_spec.js +58 -0
  300. package/test/spec/modules/visiblemeasuresBidAdapter_spec.js +2 -1
  301. package/test/spec/modules/vrtcalBidAdapter_spec.js +3 -2
  302. package/test/spec/modules/yieldmoBidAdapter_spec.js +19 -1
  303. package/test/spec/renderer_spec.js +1 -2
  304. package/test/spec/unit/pbjs_api_spec.js +19 -3
  305. package/test/test_index.js +13 -3
  306. package/dist/gridNMBidAdapter.js +0 -1
  307. package/modules/gridNMBidAdapter.js +0 -422
  308. package/modules/gridNMBidAdapter.md +0 -39
  309. package/test/spec/modules/gridNMBidAdapter_spec.js +0 -636
@@ -257,11 +257,15 @@ describe('AppNexusAdapter', function () {
257
257
  transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843'
258
258
  }];
259
259
 
260
- let types = ['banner', 'video'];
260
+ let types = ['banner'];
261
261
  if (FEATURES.NATIVE) {
262
262
  types.push('native');
263
263
  }
264
264
 
265
+ if (FEATURES.VIDEO) {
266
+ types.push('video');
267
+ }
268
+
265
269
  types.forEach(type => {
266
270
  getAdUnitsStub.callsFake(function (...args) {
267
271
  return adUnits;
@@ -290,122 +294,303 @@ describe('AppNexusAdapter', function () {
290
294
  expect(payload.tags[0].ad_types).to.not.exist;
291
295
  });
292
296
 
293
- it('should populate the ad_types array on outstream requests', function () {
294
- const bidRequest = Object.assign({}, bidRequests[0]);
295
- bidRequest.mediaTypes = {};
296
- bidRequest.mediaTypes.video = { context: 'outstream' };
297
+ if (FEATURES.VIDEO) {
298
+ it('should populate the ad_types array on outstream requests', function () {
299
+ const bidRequest = Object.assign({}, bidRequests[0]);
300
+ bidRequest.mediaTypes = {};
301
+ bidRequest.mediaTypes.video = { context: 'outstream' };
297
302
 
298
- const request = spec.buildRequests([bidRequest]);
299
- const payload = JSON.parse(request.data);
303
+ const request = spec.buildRequests([bidRequest]);
304
+ const payload = JSON.parse(request.data);
300
305
 
301
- expect(payload.tags[0].ad_types).to.deep.equal(['video']);
302
- expect(payload.tags[0].hb_source).to.deep.equal(1);
303
- });
306
+ expect(payload.tags[0].ad_types).to.deep.equal(['video']);
307
+ expect(payload.tags[0].hb_source).to.deep.equal(1);
308
+ });
304
309
 
305
- it('sends bid request to ENDPOINT via POST', function () {
306
- const request = spec.buildRequests(bidRequests);
307
- expect(request.url).to.equal(ENDPOINT);
308
- expect(request.method).to.equal('POST');
309
- });
310
+ it('should attach valid video params to the tag', function () {
311
+ let bidRequest = Object.assign({},
312
+ bidRequests[0],
313
+ {
314
+ params: {
315
+ placementId: '10433394',
316
+ video: {
317
+ id: 123,
318
+ minduration: 100,
319
+ foobar: 'invalid'
320
+ }
321
+ }
322
+ }
323
+ );
310
324
 
311
- it('should attach valid video params to the tag', function () {
312
- let bidRequest = Object.assign({},
313
- bidRequests[0],
314
- {
325
+ const request = spec.buildRequests([bidRequest]);
326
+ const payload = JSON.parse(request.data);
327
+ expect(payload.tags[0].video).to.deep.equal({
328
+ id: 123,
329
+ minduration: 100
330
+ });
331
+ expect(payload.tags[0].hb_source).to.deep.equal(1);
332
+ });
333
+
334
+ it('should include ORTB video values when video params were not set', function () {
335
+ let bidRequest = deepClone(bidRequests[0]);
336
+ bidRequest.params = {
337
+ placementId: '1234235',
338
+ video: {
339
+ skippable: true,
340
+ playback_method: ['auto_play_sound_off', 'auto_play_sound_unknown'],
341
+ context: 'outstream'
342
+ }
343
+ };
344
+ bidRequest.mediaTypes = {
345
+ video: {
346
+ playerSize: [640, 480],
347
+ context: 'outstream',
348
+ mimes: ['video/mp4'],
349
+ skip: 0,
350
+ minduration: 5,
351
+ api: [1, 5, 6],
352
+ playbackmethod: [2, 4]
353
+ }
354
+ };
355
+
356
+ const request = spec.buildRequests([bidRequest]);
357
+ const payload = JSON.parse(request.data);
358
+
359
+ expect(payload.tags[0].video).to.deep.equal({
360
+ minduration: 5,
361
+ playback_method: 2,
362
+ skippable: true,
363
+ context: 4
364
+ });
365
+ expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
366
+ });
367
+
368
+ it('should add video property when adUnit includes a renderer', function () {
369
+ const videoData = {
370
+ mediaTypes: {
371
+ video: {
372
+ context: 'outstream',
373
+ mimes: ['video/mp4']
374
+ }
375
+ },
315
376
  params: {
316
377
  placementId: '10433394',
317
378
  video: {
318
- id: 123,
319
- minduration: 100,
320
- foobar: 'invalid'
379
+ skippable: true,
380
+ playback_method: ['auto_play_sound_off']
321
381
  }
322
382
  }
323
- }
324
- );
383
+ };
325
384
 
326
- const request = spec.buildRequests([bidRequest]);
327
- const payload = JSON.parse(request.data);
328
- expect(payload.tags[0].video).to.deep.equal({
329
- id: 123,
330
- minduration: 100
331
- });
332
- expect(payload.tags[0].hb_source).to.deep.equal(1);
333
- });
385
+ let bidRequest1 = deepClone(bidRequests[0]);
386
+ bidRequest1 = Object.assign({}, bidRequest1, videoData, {
387
+ renderer: {
388
+ url: 'https://test.renderer.url',
389
+ render: function () { }
390
+ }
391
+ });
334
392
 
335
- it('should include ORTB video values when video params were not set', function () {
336
- let bidRequest = deepClone(bidRequests[0]);
337
- bidRequest.params = {
338
- placementId: '1234235',
339
- video: {
393
+ let bidRequest2 = deepClone(bidRequests[0]);
394
+ bidRequest2.adUnitCode = 'adUnit_code_2';
395
+ bidRequest2 = Object.assign({}, bidRequest2, videoData);
396
+
397
+ const request = spec.buildRequests([bidRequest1, bidRequest2]);
398
+ const payload = JSON.parse(request.data);
399
+ expect(payload.tags[0].video).to.deep.equal({
340
400
  skippable: true,
341
- playback_method: ['auto_play_sound_off', 'auto_play_sound_unknown'],
342
- context: 'outstream'
343
- }
344
- };
345
- bidRequest.mediaTypes = {
346
- video: {
347
- playerSize: [640, 480],
348
- context: 'outstream',
349
- mimes: ['video/mp4'],
350
- skip: 0,
351
- minduration: 5,
352
- api: [1, 5, 6],
353
- playbackmethod: [2, 4]
354
- }
355
- };
401
+ playback_method: 2,
402
+ custom_renderer_present: true
403
+ });
404
+ expect(payload.tags[1].video).to.deep.equal({
405
+ skippable: true,
406
+ playback_method: 2
407
+ });
408
+ });
356
409
 
357
- const request = spec.buildRequests([bidRequest]);
358
- const payload = JSON.parse(request.data);
410
+ it('should duplicate adpod placements into batches and set correct maxduration', function () {
411
+ let bidRequest = Object.assign({},
412
+ bidRequests[0],
413
+ {
414
+ params: { placementId: '14542875' }
415
+ },
416
+ {
417
+ mediaTypes: {
418
+ video: {
419
+ context: 'adpod',
420
+ playerSize: [640, 480],
421
+ adPodDurationSec: 300,
422
+ durationRangeSec: [15, 30],
423
+ }
424
+ }
425
+ }
426
+ );
359
427
 
360
- expect(payload.tags[0].video).to.deep.equal({
361
- minduration: 5,
362
- playback_method: 2,
363
- skippable: true,
364
- context: 4
428
+ const request = spec.buildRequests([bidRequest]);
429
+ const payload1 = JSON.parse(request[0].data);
430
+ const payload2 = JSON.parse(request[1].data);
431
+
432
+ // 300 / 15 = 20 total
433
+ expect(payload1.tags.length).to.equal(15);
434
+ expect(payload2.tags.length).to.equal(5);
435
+
436
+ expect(payload1.tags[0]).to.deep.equal(payload1.tags[1]);
437
+ expect(payload1.tags[0].video.maxduration).to.equal(30);
438
+
439
+ expect(payload2.tags[0]).to.deep.equal(payload1.tags[1]);
440
+ expect(payload2.tags[0].video.maxduration).to.equal(30);
365
441
  });
366
- expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
367
- });
368
442
 
369
- it('should add video property when adUnit includes a renderer', function () {
370
- const videoData = {
371
- mediaTypes: {
372
- video: {
373
- context: 'outstream',
374
- mimes: ['video/mp4']
443
+ it('should round down adpod placements when numbers are uneven', function () {
444
+ let bidRequest = Object.assign({},
445
+ bidRequests[0],
446
+ {
447
+ params: { placementId: '14542875' }
448
+ },
449
+ {
450
+ mediaTypes: {
451
+ video: {
452
+ context: 'adpod',
453
+ playerSize: [640, 480],
454
+ adPodDurationSec: 123,
455
+ durationRangeSec: [45],
456
+ }
457
+ }
375
458
  }
376
- },
377
- params: {
378
- placementId: '10433394',
379
- video: {
380
- skippable: true,
381
- playback_method: ['auto_play_sound_off']
459
+ );
460
+
461
+ const request = spec.buildRequests([bidRequest]);
462
+ const payload = JSON.parse(request.data);
463
+ expect(payload.tags.length).to.equal(2);
464
+ });
465
+
466
+ it('should duplicate adpod placements when requireExactDuration is set', function () {
467
+ let bidRequest = Object.assign({},
468
+ bidRequests[0],
469
+ {
470
+ params: { placementId: '14542875' }
471
+ },
472
+ {
473
+ mediaTypes: {
474
+ video: {
475
+ context: 'adpod',
476
+ playerSize: [640, 480],
477
+ adPodDurationSec: 300,
478
+ durationRangeSec: [15, 30],
479
+ requireExactDuration: true,
480
+ }
481
+ }
382
482
  }
383
- }
384
- };
483
+ );
385
484
 
386
- let bidRequest1 = deepClone(bidRequests[0]);
387
- bidRequest1 = Object.assign({}, bidRequest1, videoData, {
388
- renderer: {
389
- url: 'https://test.renderer.url',
390
- render: function () { }
391
- }
485
+ // 20 total placements with 15 max impressions = 2 requests
486
+ const request = spec.buildRequests([bidRequest]);
487
+ expect(request.length).to.equal(2);
488
+
489
+ // 20 spread over 2 requests = 15 in first request, 5 in second
490
+ const payload1 = JSON.parse(request[0].data);
491
+ const payload2 = JSON.parse(request[1].data);
492
+ expect(payload1.tags.length).to.equal(15);
493
+ expect(payload2.tags.length).to.equal(5);
494
+
495
+ // 10 placements should have max/min at 15
496
+ // 10 placemenst should have max/min at 30
497
+ const payload1tagsWith15 = payload1.tags.filter(tag => tag.video.maxduration === 15);
498
+ const payload1tagsWith30 = payload1.tags.filter(tag => tag.video.maxduration === 30);
499
+ expect(payload1tagsWith15.length).to.equal(10);
500
+ expect(payload1tagsWith30.length).to.equal(5);
501
+
502
+ // 5 placemenst with min/max at 30 were in the first request
503
+ // so 5 remaining should be in the second
504
+ const payload2tagsWith30 = payload2.tags.filter(tag => tag.video.maxduration === 30);
505
+ expect(payload2tagsWith30.length).to.equal(5);
392
506
  });
393
507
 
394
- let bidRequest2 = deepClone(bidRequests[0]);
395
- bidRequest2.adUnitCode = 'adUnit_code_2';
396
- bidRequest2 = Object.assign({}, bidRequest2, videoData);
508
+ it('should set durations for placements when requireExactDuration is set and numbers are uneven', function () {
509
+ let bidRequest = Object.assign({},
510
+ bidRequests[0],
511
+ {
512
+ params: { placementId: '14542875' }
513
+ },
514
+ {
515
+ mediaTypes: {
516
+ video: {
517
+ context: 'adpod',
518
+ playerSize: [640, 480],
519
+ adPodDurationSec: 105,
520
+ durationRangeSec: [15, 30, 60],
521
+ requireExactDuration: true,
522
+ }
523
+ }
524
+ }
525
+ );
397
526
 
398
- const request = spec.buildRequests([bidRequest1, bidRequest2]);
399
- const payload = JSON.parse(request.data);
400
- expect(payload.tags[0].video).to.deep.equal({
401
- skippable: true,
402
- playback_method: 2,
403
- custom_renderer_present: true
527
+ const request = spec.buildRequests([bidRequest]);
528
+ const payload = JSON.parse(request.data);
529
+ expect(payload.tags.length).to.equal(7);
530
+
531
+ const tagsWith15 = payload.tags.filter(tag => tag.video.maxduration === 15);
532
+ const tagsWith30 = payload.tags.filter(tag => tag.video.maxduration === 30);
533
+ const tagsWith60 = payload.tags.filter(tag => tag.video.maxduration === 60);
534
+ expect(tagsWith15.length).to.equal(3);
535
+ expect(tagsWith30.length).to.equal(3);
536
+ expect(tagsWith60.length).to.equal(1);
404
537
  });
405
- expect(payload.tags[1].video).to.deep.equal({
406
- skippable: true,
407
- playback_method: 2
538
+
539
+ it('should break adpod request into batches', function () {
540
+ let bidRequest = Object.assign({},
541
+ bidRequests[0],
542
+ {
543
+ params: { placementId: '14542875' }
544
+ },
545
+ {
546
+ mediaTypes: {
547
+ video: {
548
+ context: 'adpod',
549
+ playerSize: [640, 480],
550
+ adPodDurationSec: 225,
551
+ durationRangeSec: [5],
552
+ }
553
+ }
554
+ }
555
+ );
556
+
557
+ const request = spec.buildRequests([bidRequest]);
558
+ const payload1 = JSON.parse(request[0].data);
559
+ const payload2 = JSON.parse(request[1].data);
560
+ const payload3 = JSON.parse(request[2].data);
561
+
562
+ expect(payload1.tags.length).to.equal(15);
563
+ expect(payload2.tags.length).to.equal(15);
564
+ expect(payload3.tags.length).to.equal(15);
565
+ });
566
+
567
+ it('should contain hb_source value for adpod', function () {
568
+ let bidRequest = Object.assign({},
569
+ bidRequests[0],
570
+ {
571
+ params: { placementId: '14542875' }
572
+ },
573
+ {
574
+ mediaTypes: {
575
+ video: {
576
+ context: 'adpod',
577
+ playerSize: [640, 480],
578
+ adPodDurationSec: 300,
579
+ durationRangeSec: [15, 30],
580
+ }
581
+ }
582
+ }
583
+ );
584
+ const request = spec.buildRequests([bidRequest])[0];
585
+ const payload = JSON.parse(request.data);
586
+ expect(payload.tags[0].hb_source).to.deep.equal(7);
408
587
  });
588
+ } // VIDEO
589
+
590
+ it('sends bid request to ENDPOINT via POST', function () {
591
+ const request = spec.buildRequests(bidRequests);
592
+ expect(request.url).to.equal(ENDPOINT);
593
+ expect(request.method).to.equal('POST');
409
594
  });
410
595
 
411
596
  it('should attach valid user params to the tag', function () {
@@ -486,185 +671,6 @@ describe('AppNexusAdapter', function () {
486
671
  expect(payload.tags[0].reserve).to.exist.and.to.equal(3);
487
672
  });
488
673
 
489
- it('should duplicate adpod placements into batches and set correct maxduration', function () {
490
- let bidRequest = Object.assign({},
491
- bidRequests[0],
492
- {
493
- params: { placement_id: '14542875' }
494
- },
495
- {
496
- mediaTypes: {
497
- video: {
498
- context: 'adpod',
499
- playerSize: [640, 480],
500
- adPodDurationSec: 300,
501
- durationRangeSec: [15, 30],
502
- }
503
- }
504
- }
505
- );
506
-
507
- const request = spec.buildRequests([bidRequest]);
508
- const payload1 = JSON.parse(request[0].data);
509
- const payload2 = JSON.parse(request[1].data);
510
-
511
- // 300 / 15 = 20 total
512
- expect(payload1.tags.length).to.equal(15);
513
- expect(payload2.tags.length).to.equal(5);
514
-
515
- expect(payload1.tags[0]).to.deep.equal(payload1.tags[1]);
516
- expect(payload1.tags[0].video.maxduration).to.equal(30);
517
-
518
- expect(payload2.tags[0]).to.deep.equal(payload1.tags[1]);
519
- expect(payload2.tags[0].video.maxduration).to.equal(30);
520
- });
521
-
522
- it('should round down adpod placements when numbers are uneven', function () {
523
- let bidRequest = Object.assign({},
524
- bidRequests[0],
525
- {
526
- params: { placement_id: '14542875' }
527
- },
528
- {
529
- mediaTypes: {
530
- video: {
531
- context: 'adpod',
532
- playerSize: [640, 480],
533
- adPodDurationSec: 123,
534
- durationRangeSec: [45],
535
- }
536
- }
537
- }
538
- );
539
-
540
- const request = spec.buildRequests([bidRequest]);
541
- const payload = JSON.parse(request.data);
542
- expect(payload.tags.length).to.equal(2);
543
- });
544
-
545
- it('should duplicate adpod placements when requireExactDuration is set', function () {
546
- let bidRequest = Object.assign({},
547
- bidRequests[0],
548
- {
549
- params: { placement_id: '14542875' }
550
- },
551
- {
552
- mediaTypes: {
553
- video: {
554
- context: 'adpod',
555
- playerSize: [640, 480],
556
- adPodDurationSec: 300,
557
- durationRangeSec: [15, 30],
558
- requireExactDuration: true,
559
- }
560
- }
561
- }
562
- );
563
-
564
- // 20 total placements with 15 max impressions = 2 requests
565
- const request = spec.buildRequests([bidRequest]);
566
- expect(request.length).to.equal(2);
567
-
568
- // 20 spread over 2 requests = 15 in first request, 5 in second
569
- const payload1 = JSON.parse(request[0].data);
570
- const payload2 = JSON.parse(request[1].data);
571
- expect(payload1.tags.length).to.equal(15);
572
- expect(payload2.tags.length).to.equal(5);
573
-
574
- // 10 placements should have max/min at 15
575
- // 10 placemenst should have max/min at 30
576
- const payload1tagsWith15 = payload1.tags.filter(tag => tag.video.maxduration === 15);
577
- const payload1tagsWith30 = payload1.tags.filter(tag => tag.video.maxduration === 30);
578
- expect(payload1tagsWith15.length).to.equal(10);
579
- expect(payload1tagsWith30.length).to.equal(5);
580
-
581
- // 5 placemenst with min/max at 30 were in the first request
582
- // so 5 remaining should be in the second
583
- const payload2tagsWith30 = payload2.tags.filter(tag => tag.video.maxduration === 30);
584
- expect(payload2tagsWith30.length).to.equal(5);
585
- });
586
-
587
- it('should set durations for placements when requireExactDuration is set and numbers are uneven', function () {
588
- let bidRequest = Object.assign({},
589
- bidRequests[0],
590
- {
591
- params: { placement_id: '14542875' }
592
- },
593
- {
594
- mediaTypes: {
595
- video: {
596
- context: 'adpod',
597
- playerSize: [640, 480],
598
- adPodDurationSec: 105,
599
- durationRangeSec: [15, 30, 60],
600
- requireExactDuration: true,
601
- }
602
- }
603
- }
604
- );
605
-
606
- const request = spec.buildRequests([bidRequest]);
607
- const payload = JSON.parse(request.data);
608
- expect(payload.tags.length).to.equal(7);
609
-
610
- const tagsWith15 = payload.tags.filter(tag => tag.video.maxduration === 15);
611
- const tagsWith30 = payload.tags.filter(tag => tag.video.maxduration === 30);
612
- const tagsWith60 = payload.tags.filter(tag => tag.video.maxduration === 60);
613
- expect(tagsWith15.length).to.equal(3);
614
- expect(tagsWith30.length).to.equal(3);
615
- expect(tagsWith60.length).to.equal(1);
616
- });
617
-
618
- it('should break adpod request into batches', function () {
619
- let bidRequest = Object.assign({},
620
- bidRequests[0],
621
- {
622
- params: { placement_id: '14542875' }
623
- },
624
- {
625
- mediaTypes: {
626
- video: {
627
- context: 'adpod',
628
- playerSize: [640, 480],
629
- adPodDurationSec: 225,
630
- durationRangeSec: [5],
631
- }
632
- }
633
- }
634
- );
635
-
636
- const request = spec.buildRequests([bidRequest]);
637
- const payload1 = JSON.parse(request[0].data);
638
- const payload2 = JSON.parse(request[1].data);
639
- const payload3 = JSON.parse(request[2].data);
640
-
641
- expect(payload1.tags.length).to.equal(15);
642
- expect(payload2.tags.length).to.equal(15);
643
- expect(payload3.tags.length).to.equal(15);
644
- });
645
-
646
- it('should contain hb_source value for adpod', function () {
647
- let bidRequest = Object.assign({},
648
- bidRequests[0],
649
- {
650
- params: { placement_id: '14542875' }
651
- },
652
- {
653
- mediaTypes: {
654
- video: {
655
- context: 'adpod',
656
- playerSize: [640, 480],
657
- adPodDurationSec: 300,
658
- durationRangeSec: [15, 30],
659
- }
660
- }
661
- }
662
- );
663
- const request = spec.buildRequests([bidRequest])[0];
664
- const payload = JSON.parse(request.data);
665
- expect(payload.tags[0].hb_source).to.deep.equal(7);
666
- });
667
-
668
674
  it('should contain hb_source value for other media', function () {
669
675
  let bidRequest = Object.assign({},
670
676
  bidRequests[0],
@@ -1392,27 +1398,31 @@ describe('AppNexusAdapter', function () {
1392
1398
  });
1393
1399
 
1394
1400
  it('should populate iab_support object at the root level if omid support is detected', function () {
1395
- // with bid.params.frameworks
1396
- let bidRequest_A = Object.assign({}, bidRequests[0], {
1397
- params: {
1398
- frameworks: [1, 2, 5, 6],
1399
- video: {
1400
- frameworks: [1, 2, 5, 6]
1401
+ let request, payload;
1402
+
1403
+ if (FEATURES.VIDEO) {
1404
+ // with bid.params.frameworks
1405
+ let bidRequest_A = Object.assign({}, bidRequests[0], {
1406
+ params: {
1407
+ frameworks: [1, 2, 5, 6],
1408
+ video: {
1409
+ frameworks: [1, 2, 5, 6]
1410
+ }
1401
1411
  }
1402
- }
1403
- });
1404
- let request = spec.buildRequests([bidRequest_A]);
1405
- let payload = JSON.parse(request.data);
1406
- expect(payload.iab_support).to.be.an('object');
1407
- expect(payload.iab_support).to.deep.equal({
1408
- omidpn: 'Appnexus',
1409
- omidpv: '$prebid.version$'
1410
- });
1411
- expect(payload.tags[0].banner_frameworks).to.be.an('array');
1412
- expect(payload.tags[0].banner_frameworks).to.deep.equal([1, 2, 5, 6]);
1413
- expect(payload.tags[0].video_frameworks).to.be.an('array');
1414
- expect(payload.tags[0].video_frameworks).to.deep.equal([1, 2, 5, 6]);
1415
- expect(payload.tags[0].video.frameworks).to.not.exist;
1412
+ });
1413
+ request = spec.buildRequests([bidRequest_A]);
1414
+ payload = JSON.parse(request.data);
1415
+ expect(payload.iab_support).to.be.an('object');
1416
+ expect(payload.iab_support).to.deep.equal({
1417
+ omidpn: 'Appnexus',
1418
+ omidpv: '$prebid.version$'
1419
+ });
1420
+ expect(payload.tags[0].banner_frameworks).to.be.an('array');
1421
+ expect(payload.tags[0].banner_frameworks).to.deep.equal([1, 2, 5, 6]);
1422
+ expect(payload.tags[0].video_frameworks).to.be.an('array');
1423
+ expect(payload.tags[0].video_frameworks).to.deep.equal([1, 2, 5, 6]);
1424
+ expect(payload.tags[0].video.frameworks).to.not.exist;
1425
+ }
1416
1426
 
1417
1427
  // without bid.params.frameworks
1418
1428
  const bidRequest_B = Object.assign({}, bidRequests[0]);
@@ -1422,19 +1432,21 @@ describe('AppNexusAdapter', function () {
1422
1432
  expect(payload.tags[0].banner_frameworks).to.not.exist;
1423
1433
  expect(payload.tags[0].video_frameworks).to.not.exist;
1424
1434
 
1425
- // with video.frameworks but it is not an array
1426
- const bidRequest_C = Object.assign({}, bidRequests[0], {
1427
- params: {
1428
- video: {
1429
- frameworks: "'1', '2', '3', '6'"
1435
+ if (FEATURES.VIDEO) {
1436
+ // with video.frameworks but it is not an array
1437
+ const bidRequest_C = Object.assign({}, bidRequests[0], {
1438
+ params: {
1439
+ video: {
1440
+ frameworks: "'1', '2', '3', '6'"
1441
+ }
1430
1442
  }
1431
- }
1432
- });
1433
- request = spec.buildRequests([bidRequest_C]);
1434
- payload = JSON.parse(request.data);
1435
- expect(payload.iab_support).to.not.exist;
1436
- expect(payload.tags[0].banner_frameworks).to.not.exist;
1437
- expect(payload.tags[0].video_frameworks).to.not.exist;
1443
+ });
1444
+ request = spec.buildRequests([bidRequest_C]);
1445
+ payload = JSON.parse(request.data);
1446
+ expect(payload.iab_support).to.not.exist;
1447
+ expect(payload.tags[0].banner_frameworks).to.not.exist;
1448
+ expect(payload.tags[0].video_frameworks).to.not.exist;
1449
+ }
1438
1450
  });
1439
1451
  })
1440
1452
 
@@ -1591,116 +1603,118 @@ describe('AppNexusAdapter', function () {
1591
1603
  expect(result.length).to.equal(0);
1592
1604
  });
1593
1605
 
1594
- it('handles outstream video responses', function () {
1595
- let response = {
1596
- 'tags': [{
1597
- 'uuid': '84ab500420319d',
1598
- 'ads': [{
1599
- 'ad_type': 'video',
1600
- 'cpm': 0.500000,
1601
- 'notify_url': 'imptracker.com',
1602
- 'rtb': {
1603
- 'video': {
1604
- 'content': '<!-- VAST Creative -->'
1605
- }
1606
- },
1607
- 'javascriptTrackers': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
1606
+ if (FEATURES.VIDEO) {
1607
+ it('handles outstream video responses', function () {
1608
+ let response = {
1609
+ 'tags': [{
1610
+ 'uuid': '84ab500420319d',
1611
+ 'ads': [{
1612
+ 'ad_type': 'video',
1613
+ 'cpm': 0.500000,
1614
+ 'notify_url': 'imptracker.com',
1615
+ 'rtb': {
1616
+ 'video': {
1617
+ 'content': '<!-- VAST Creative -->'
1618
+ }
1619
+ },
1620
+ 'javascriptTrackers': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
1621
+ }]
1608
1622
  }]
1609
- }]
1610
- };
1611
- let bidderRequest = {
1612
- bids: [{
1613
- bidId: '84ab500420319d',
1614
- adUnitCode: 'code',
1615
- mediaTypes: {
1616
- video: {
1617
- context: 'outstream'
1623
+ };
1624
+ let bidderRequest = {
1625
+ bids: [{
1626
+ bidId: '84ab500420319d',
1627
+ adUnitCode: 'code',
1628
+ mediaTypes: {
1629
+ video: {
1630
+ context: 'outstream'
1631
+ }
1618
1632
  }
1619
- }
1620
- }]
1621
- }
1633
+ }]
1634
+ }
1622
1635
 
1623
- let result = spec.interpretResponse({ body: response }, { bidderRequest });
1624
- expect(result[0]).to.have.property('vastXml');
1625
- expect(result[0]).to.have.property('vastImpUrl');
1626
- expect(result[0]).to.have.property('mediaType', 'video');
1627
- });
1636
+ let result = spec.interpretResponse({ body: response }, { bidderRequest });
1637
+ expect(result[0]).to.have.property('vastXml');
1638
+ expect(result[0]).to.have.property('vastImpUrl');
1639
+ expect(result[0]).to.have.property('mediaType', 'video');
1640
+ });
1628
1641
 
1629
- it('handles instream video responses', function () {
1630
- let response = {
1631
- 'tags': [{
1632
- 'uuid': '84ab500420319d',
1633
- 'ads': [{
1634
- 'ad_type': 'video',
1635
- 'cpm': 0.500000,
1636
- 'notify_url': 'imptracker.com',
1637
- 'rtb': {
1638
- 'video': {
1639
- 'asset_url': 'https://sample.vastURL.com/here/vid'
1640
- }
1641
- },
1642
- 'javascriptTrackers': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
1642
+ it('handles instream video responses', function () {
1643
+ let response = {
1644
+ 'tags': [{
1645
+ 'uuid': '84ab500420319d',
1646
+ 'ads': [{
1647
+ 'ad_type': 'video',
1648
+ 'cpm': 0.500000,
1649
+ 'notify_url': 'imptracker.com',
1650
+ 'rtb': {
1651
+ 'video': {
1652
+ 'asset_url': 'https://sample.vastURL.com/here/vid'
1653
+ }
1654
+ },
1655
+ 'javascriptTrackers': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
1656
+ }]
1643
1657
  }]
1644
- }]
1645
- };
1646
- let bidderRequest = {
1647
- bids: [{
1648
- bidId: '84ab500420319d',
1649
- adUnitCode: 'code',
1650
- mediaTypes: {
1651
- video: {
1652
- context: 'instream'
1658
+ };
1659
+ let bidderRequest = {
1660
+ bids: [{
1661
+ bidId: '84ab500420319d',
1662
+ adUnitCode: 'code',
1663
+ mediaTypes: {
1664
+ video: {
1665
+ context: 'instream'
1666
+ }
1653
1667
  }
1654
- }
1655
- }]
1656
- }
1668
+ }]
1669
+ }
1657
1670
 
1658
- let result = spec.interpretResponse({ body: response }, { bidderRequest });
1659
- expect(result[0]).to.have.property('vastUrl');
1660
- expect(result[0]).to.have.property('vastImpUrl');
1661
- expect(result[0]).to.have.property('mediaType', 'video');
1662
- });
1671
+ let result = spec.interpretResponse({ body: response }, { bidderRequest });
1672
+ expect(result[0]).to.have.property('vastUrl');
1673
+ expect(result[0]).to.have.property('vastImpUrl');
1674
+ expect(result[0]).to.have.property('mediaType', 'video');
1675
+ });
1663
1676
 
1664
- it('handles adpod responses', function () {
1665
- let response = {
1666
- 'tags': [{
1667
- 'uuid': '84ab500420319d',
1668
- 'ads': [{
1669
- 'ad_type': 'video',
1670
- 'brand_category_id': 10,
1671
- 'cpm': 0.500000,
1672
- 'notify_url': 'imptracker.com',
1673
- 'rtb': {
1674
- 'video': {
1675
- 'asset_url': 'https://sample.vastURL.com/here/adpod',
1676
- 'duration_ms': 30000,
1677
+ it('handles adpod responses', function () {
1678
+ let response = {
1679
+ 'tags': [{
1680
+ 'uuid': '84ab500420319d',
1681
+ 'ads': [{
1682
+ 'ad_type': 'video',
1683
+ 'brand_category_id': 10,
1684
+ 'cpm': 0.500000,
1685
+ 'notify_url': 'imptracker.com',
1686
+ 'rtb': {
1687
+ 'video': {
1688
+ 'asset_url': 'https://sample.vastURL.com/here/adpod',
1689
+ 'duration_ms': 30000,
1690
+ }
1691
+ },
1692
+ 'viewability': {
1693
+ 'config': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
1677
1694
  }
1678
- },
1679
- 'viewability': {
1680
- 'config': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
1681
- }
1695
+ }]
1682
1696
  }]
1683
- }]
1684
- };
1697
+ };
1685
1698
 
1686
- let bidderRequest = {
1687
- bids: [{
1688
- bidId: '84ab500420319d',
1689
- adUnitCode: 'code',
1690
- mediaTypes: {
1691
- video: {
1692
- context: 'adpod'
1699
+ let bidderRequest = {
1700
+ bids: [{
1701
+ bidId: '84ab500420319d',
1702
+ adUnitCode: 'code',
1703
+ mediaTypes: {
1704
+ video: {
1705
+ context: 'adpod'
1706
+ }
1693
1707
  }
1694
- }
1695
- }]
1696
- };
1697
- bfStub.returns('1');
1708
+ }]
1709
+ };
1710
+ bfStub.returns('1');
1698
1711
 
1699
- let result = spec.interpretResponse({ body: response }, { bidderRequest });
1700
- expect(result[0]).to.have.property('vastUrl');
1701
- expect(result[0].video.context).to.equal('adpod');
1702
- expect(result[0].video.durationSeconds).to.equal(30);
1703
- });
1712
+ let result = spec.interpretResponse({ body: response }, { bidderRequest });
1713
+ expect(result[0]).to.have.property('vastUrl');
1714
+ expect(result[0].video.context).to.equal('adpod');
1715
+ expect(result[0].video.durationSeconds).to.equal(30);
1716
+ });
1717
+ }
1704
1718
 
1705
1719
  if (FEATURES.NATIVE) {
1706
1720
  it('handles native responses', function () {
@@ -1758,59 +1772,61 @@ describe('AppNexusAdapter', function () {
1758
1772
  });
1759
1773
  }
1760
1774
 
1761
- it('supports configuring outstream renderers', function () {
1762
- const outstreamResponse = deepClone(response);
1763
- outstreamResponse.tags[0].ads[0].rtb.video = {};
1764
- outstreamResponse.tags[0].ads[0].renderer_url = 'renderer.js';
1775
+ if (FEATURES.VIDEO) {
1776
+ it('supports configuring outstream renderers', function () {
1777
+ const outstreamResponse = deepClone(response);
1778
+ outstreamResponse.tags[0].ads[0].rtb.video = {};
1779
+ outstreamResponse.tags[0].ads[0].renderer_url = 'renderer.js';
1765
1780
 
1766
- const bidderRequest = {
1767
- bids: [{
1768
- bidId: '3db3773286ee59',
1769
- renderer: {
1770
- options: {
1771
- adText: 'configured'
1772
- }
1773
- },
1774
- mediaTypes: {
1775
- video: {
1776
- context: 'outstream'
1781
+ const bidderRequest = {
1782
+ bids: [{
1783
+ bidId: '3db3773286ee59',
1784
+ renderer: {
1785
+ options: {
1786
+ adText: 'configured'
1787
+ }
1788
+ },
1789
+ mediaTypes: {
1790
+ video: {
1791
+ context: 'outstream'
1792
+ }
1777
1793
  }
1778
- }
1779
- }]
1780
- };
1794
+ }]
1795
+ };
1781
1796
 
1782
- const result = spec.interpretResponse({ body: outstreamResponse }, { bidderRequest });
1783
- expect(result[0].renderer.config).to.deep.equal(
1784
- bidderRequest.bids[0].renderer.options
1785
- );
1786
- });
1797
+ const result = spec.interpretResponse({ body: outstreamResponse }, { bidderRequest });
1798
+ expect(result[0].renderer.config).to.deep.equal(
1799
+ bidderRequest.bids[0].renderer.options
1800
+ );
1801
+ });
1787
1802
 
1788
- it('should add deal_priority and deal_code', function () {
1789
- let responseWithDeal = deepClone(response);
1790
- responseWithDeal.tags[0].ads[0].ad_type = 'video';
1791
- responseWithDeal.tags[0].ads[0].deal_priority = 5;
1792
- responseWithDeal.tags[0].ads[0].deal_code = '123';
1793
- responseWithDeal.tags[0].ads[0].rtb.video = {
1794
- duration_ms: 1500,
1795
- player_width: 640,
1796
- player_height: 340,
1797
- };
1803
+ it('should add deal_priority and deal_code', function () {
1804
+ let responseWithDeal = deepClone(response);
1805
+ responseWithDeal.tags[0].ads[0].ad_type = 'video';
1806
+ responseWithDeal.tags[0].ads[0].deal_priority = 5;
1807
+ responseWithDeal.tags[0].ads[0].deal_code = '123';
1808
+ responseWithDeal.tags[0].ads[0].rtb.video = {
1809
+ duration_ms: 1500,
1810
+ player_width: 640,
1811
+ player_height: 340,
1812
+ };
1798
1813
 
1799
- let bidderRequest = {
1800
- bids: [{
1801
- bidId: '3db3773286ee59',
1802
- adUnitCode: 'code',
1803
- mediaTypes: {
1804
- video: {
1805
- context: 'adpod'
1814
+ let bidderRequest = {
1815
+ bids: [{
1816
+ bidId: '3db3773286ee59',
1817
+ adUnitCode: 'code',
1818
+ mediaTypes: {
1819
+ video: {
1820
+ context: 'adpod'
1821
+ }
1806
1822
  }
1807
- }
1808
- }]
1809
- }
1810
- let result = spec.interpretResponse({ body: responseWithDeal }, { bidderRequest });
1811
- expect(Object.keys(result[0].appnexus)).to.include.members(['buyerMemberId', 'dealPriority', 'dealCode']);
1812
- expect(result[0].video.dealTier).to.equal(5);
1813
- });
1823
+ }]
1824
+ }
1825
+ let result = spec.interpretResponse({ body: responseWithDeal }, { bidderRequest });
1826
+ expect(Object.keys(result[0].appnexus)).to.include.members(['buyerMemberId', 'dealPriority', 'dealCode']);
1827
+ expect(result[0].video.dealTier).to.equal(5);
1828
+ });
1829
+ }
1814
1830
 
1815
1831
  it('should add advertiser id', function () {
1816
1832
  let responseAdvertiserId = deepClone(response);