prebid.js 7.10.0 → 7.13.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 (366) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +16 -10
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/workflows/codeql-analysis.yml +73 -0
  4. package/.github/workflows/issue_tracker.yml +1 -1
  5. package/README.md +0 -2
  6. package/babelConfig.js +10 -4
  7. package/dist/33acrossBidAdapter.js +1 -1
  8. package/dist/acuityAdsBidAdapter.js +1 -0
  9. package/dist/adagioBidAdapter.js +1 -1
  10. package/dist/adbookpspBidAdapter.js +1 -1
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/adkernelBidAdapter.js +1 -1
  13. package/dist/adrelevantisBidAdapter.js +1 -1
  14. package/dist/adriverBidAdapter.js +1 -1
  15. package/dist/adriverIdSystem.js +1 -1
  16. package/dist/adtelligentBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -0
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/alkimiBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aniviewBidAdapter.js +1 -1
  25. package/dist/aolBidAdapter.js +1 -1
  26. package/dist/appierAnalyticsAdapter.js +1 -1
  27. package/dist/appnexusBidAdapter.js +1 -1
  28. package/dist/asoBidAdapter.js +1 -1
  29. package/dist/audiencerunBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/beopBidAdapter.js +1 -1
  32. package/dist/betweenBidAdapter.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bluebillywigBidAdapter.js +1 -1
  37. package/dist/brandmetricsRtdProvider.js +1 -1
  38. package/dist/bridgewellBidAdapter.js +1 -1
  39. package/dist/brightMountainMediaBidAdapter.js +1 -1
  40. package/dist/browsiRtdProvider.js +1 -1
  41. package/dist/cleanioRtdProvider.js +1 -1
  42. package/dist/concertBidAdapter.js +1 -1
  43. package/dist/connectadBidAdapter.js +1 -1
  44. package/dist/consentManagement.js +1 -1
  45. package/dist/consentManagementUsp.js +1 -1
  46. package/dist/consumableBidAdapter.js +1 -1
  47. package/dist/conversantBidAdapter.js +1 -1
  48. package/dist/cpmstarBidAdapter.js +1 -1
  49. package/dist/craftBidAdapter.js +1 -1
  50. package/dist/criteoBidAdapter.js +1 -1
  51. package/dist/currency.js +1 -1
  52. package/dist/datawrkzBidAdapter.js +1 -0
  53. package/dist/debugging-standalone.js +1 -1
  54. package/dist/dfpAdServerVideo.js +1 -1
  55. package/dist/dgkeywordRtdProvider.js +1 -1
  56. package/dist/displayioBidAdapter.js +1 -3
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/enrichmentFpdModule.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/glimpseBidAdapter.js +1 -1
  62. package/dist/gmosspBidAdapter.js +1 -1
  63. package/dist/goldbachBidAdapter.js +1 -1
  64. package/dist/gridBidAdapter.js +1 -1
  65. package/dist/gridNMBidAdapter.js +1 -1
  66. package/dist/gumgumBidAdapter.js +1 -1
  67. package/dist/h12mediaBidAdapter.js +1 -1
  68. package/dist/id5IdSystem.js +1 -1
  69. package/dist/imRtdProvider.js +1 -1
  70. package/dist/impactifyBidAdapter.js +1 -1
  71. package/dist/improvedigitalBidAdapter.js +1 -1
  72. package/dist/inmarBidAdapter.js +1 -1
  73. package/dist/insticatorBidAdapter.js +1 -1
  74. package/dist/ixBidAdapter.js +1 -1
  75. package/dist/jixieBidAdapter.js +1 -1
  76. package/dist/justpremiumBidAdapter.js +1 -1
  77. package/dist/kargoBidAdapter.js +1 -1
  78. package/dist/konduitAnalyticsAdapter.js +1 -1
  79. package/dist/kueezBidAdapter.js +1 -1
  80. package/dist/lassoBidAdapter.js +1 -1
  81. package/dist/lifestreetBidAdapter.js +1 -0
  82. package/dist/limelightDigitalBidAdapter.js +1 -1
  83. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  84. package/dist/logicadBidAdapter.js +1 -1
  85. package/dist/loglyliftBidAdapter.js +1 -1
  86. package/dist/mabidderBidAdapter.js +1 -0
  87. package/dist/malltvAnalyticsAdapter.js +1 -1
  88. package/dist/marsmediaBidAdapter.js +1 -1
  89. package/dist/mediafuseBidAdapter.js +1 -1
  90. package/dist/mediagoBidAdapter.js +1 -0
  91. package/dist/mediakeysBidAdapter.js +1 -1
  92. package/dist/mediasquareBidAdapter.js +1 -1
  93. package/dist/mgidBidAdapter.js +1 -1
  94. package/dist/minutemediaBidAdapter.js +1 -1
  95. package/dist/nextMillenniumBidAdapter.js +1 -1
  96. package/dist/not-for-prod/prebid.js +153 -147
  97. package/dist/oguryBidAdapter.js +1 -1
  98. package/dist/oneKeyIdSystem.js +1 -0
  99. package/dist/oneKeyRtdProvider.js +1 -0
  100. package/dist/onetagBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxAnalyticsAdapter.js +1 -1
  103. package/dist/outbrainBidAdapter.js +1 -1
  104. package/dist/parrableIdSystem.js +1 -1
  105. package/dist/permutiveRtdProvider.js +1 -1
  106. package/dist/pixfutureBidAdapter.js +1 -1
  107. package/dist/prebid-core.js +2 -2
  108. package/dist/publinkIdSystem.js +1 -1
  109. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  110. package/dist/pubmaticBidAdapter.js +1 -1
  111. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  112. package/dist/pxyzBidAdapter.js +1 -1
  113. package/dist/quantcastBidAdapter.js +1 -1
  114. package/dist/rasBidAdapter.js +1 -1
  115. package/dist/readpeakBidAdapter.js +1 -1
  116. package/dist/relaidoBidAdapter.js +1 -1
  117. package/dist/rhythmoneBidAdapter.js +1 -1
  118. package/dist/riseBidAdapter.js +1 -1
  119. package/dist/rtbhouseBidAdapter.js +1 -1
  120. package/dist/rubiconAnalyticsAdapter.js +1 -1
  121. package/dist/rubiconBidAdapter.js +1 -1
  122. package/dist/seedingAllianceBidAdapter.js +1 -1
  123. package/dist/seedtagBidAdapter.js +1 -1
  124. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  125. package/dist/sharethroughBidAdapter.js +1 -1
  126. package/dist/shinezBidAdapter.js +1 -1
  127. package/dist/smaatoBidAdapter.js +1 -1
  128. package/dist/smartadserverBidAdapter.js +1 -1
  129. package/dist/smartxBidAdapter.js +1 -1
  130. package/dist/smilewantedBidAdapter.js +1 -1
  131. package/dist/sonobiBidAdapter.js +1 -1
  132. package/dist/sovrnAnalyticsAdapter.js +1 -1
  133. package/dist/sovrnBidAdapter.js +1 -1
  134. package/dist/sspBCBidAdapter.js +1 -1
  135. package/dist/sublimeBidAdapter.js +1 -1
  136. package/dist/synacormediaBidAdapter.js +1 -1
  137. package/dist/tappxBidAdapter.js +1 -1
  138. package/dist/targetVideoBidAdapter.js +1 -1
  139. package/dist/teadsBidAdapter.js +1 -1
  140. package/dist/trionBidAdapter.js +1 -1
  141. package/dist/tripleliftBidAdapter.js +1 -1
  142. package/dist/trustpidSystem.js +1 -1
  143. package/dist/ttdBidAdapter.js +1 -1
  144. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  145. package/dist/underdogmediaBidAdapter.js +1 -1
  146. package/dist/undertoneBidAdapter.js +1 -1
  147. package/dist/userId.js +1 -1
  148. package/dist/vidazooBidAdapter.js +1 -1
  149. package/dist/videobyteBidAdapter.js +1 -1
  150. package/dist/viewability.js +1 -1
  151. package/dist/visxBidAdapter.js +1 -1
  152. package/dist/vuukleBidAdapter.js +1 -1
  153. package/dist/widespaceBidAdapter.js +1 -1
  154. package/dist/winrBidAdapter.js +1 -1
  155. package/dist/yahoosspBidAdapter.js +1 -1
  156. package/dist/yieldmoBidAdapter.js +1 -1
  157. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  158. package/dist/zeta_global_sspBidAdapter.js +1 -1
  159. package/integrationExamples/gpt/permutiveRtdProvider_example.html +1 -1
  160. package/karma.conf.maker.js +2 -13
  161. package/modules/.submodules.json +2 -0
  162. package/modules/acuityAdsBidAdapter.js +207 -0
  163. package/modules/acuityAdsBidAdapter.md +79 -0
  164. package/modules/adagioBidAdapter.js +2 -3
  165. package/modules/adgenerationBidAdapter.js +2 -2
  166. package/modules/adkernelBidAdapter.js +28 -12
  167. package/modules/admixerBidAdapter.js +1 -1
  168. package/modules/adnowBidAdapter.js +1 -1
  169. package/modules/adpod.js +1 -1
  170. package/modules/adrelevantisBidAdapter.js +2 -2
  171. package/modules/adriverBidAdapter.js +5 -12
  172. package/modules/adriverIdSystem.js +2 -1
  173. package/modules/adtargetBidAdapter.js +1 -1
  174. package/modules/adtelligentBidAdapter.js +6 -2
  175. package/modules/adtrgtmeBidAdapter.js +333 -0
  176. package/modules/adtrgtmeBidAdapter.md +69 -0
  177. package/modules/adtrueBidAdapter.js +1 -1
  178. package/modules/adxpremiumAnalyticsAdapter.js +1 -1
  179. package/modules/adyoulikeBidAdapter.js +1 -1
  180. package/modules/alkimiBidAdapter.js +2 -1
  181. package/modules/aniviewBidAdapter.js +1 -1
  182. package/modules/appnexusBidAdapter.js +13 -93
  183. package/modules/apstreamBidAdapter.js +2 -2
  184. package/modules/beopBidAdapter.js +4 -4
  185. package/modules/betweenBidAdapter.js +4 -4
  186. package/modules/bidwatchAnalyticsAdapter.js +112 -59
  187. package/modules/bizzclickBidAdapter.js +1 -1
  188. package/modules/brightMountainMediaBidAdapter.js +1 -1
  189. package/modules/browsiRtdProvider.js +24 -10
  190. package/modules/cleanmedianetBidAdapter.js +1 -1
  191. package/modules/consentManagement.js +1 -1
  192. package/modules/consentManagementUsp.js +1 -1
  193. package/modules/consumableBidAdapter.js +43 -3
  194. package/modules/cpmstarBidAdapter.js +23 -13
  195. package/modules/criteoBidAdapter.js +19 -13
  196. package/modules/currency.js +1 -0
  197. package/modules/cwireBidAdapter.js +1 -1
  198. package/modules/datablocksBidAdapter.js +1 -1
  199. package/modules/datawrkzBidAdapter.js +633 -0
  200. package/modules/datawrkzBidAdapter.md +160 -0
  201. package/modules/dfpAdServerVideo.js +2 -2
  202. package/modules/dgkeywordRtdProvider.js +10 -1
  203. package/modules/displayioBidAdapter.js +92 -97
  204. package/modules/dspxBidAdapter.js +1 -1
  205. package/modules/e_volutionBidAdapter.js +3 -3
  206. package/modules/ebdrBidAdapter.js +1 -1
  207. package/modules/emx_digitalBidAdapter.js +1 -1
  208. package/modules/enrichmentFpdModule.js +11 -0
  209. package/modules/fabrickIdSystem.js +2 -2
  210. package/modules/gamoshiBidAdapter.js +1 -1
  211. package/modules/getintentBidAdapter.js +1 -1
  212. package/modules/gjirafaBidAdapter.js +2 -2
  213. package/modules/goldbachBidAdapter.js +8 -8
  214. package/modules/gothamadsBidAdapter.js +2 -2
  215. package/modules/gumgumBidAdapter.js +3 -3
  216. package/modules/h12mediaBidAdapter.js +1 -1
  217. package/modules/id5AnalyticsAdapter.js +1 -1
  218. package/modules/id5IdSystem.js +160 -111
  219. package/modules/id5IdSystem.md +16 -14
  220. package/modules/imRtdProvider.js +20 -7
  221. package/modules/imRtdProvider.md +3 -1
  222. package/modules/impactifyBidAdapter.js +1 -1
  223. package/modules/improvedigitalBidAdapter.js +50 -28
  224. package/modules/inskinBidAdapter.js +1 -1
  225. package/modules/insticatorBidAdapter.js +1 -1
  226. package/modules/integr8BidAdapter.js +2 -2
  227. package/modules/intentIqIdSystem.js +2 -2
  228. package/modules/interactiveOffersBidAdapter.js +1 -1
  229. package/modules/iqmBidAdapter.js +1 -1
  230. package/modules/ixBidAdapter.js +21 -328
  231. package/modules/ixBidAdapter.md +1 -19
  232. package/modules/kargoBidAdapter.js +4 -5
  233. package/modules/krushmediaBidAdapter.js +2 -2
  234. package/modules/lassoBidAdapter.js +3 -3
  235. package/modules/lifestreetBidAdapter.js +143 -0
  236. package/modules/limelightDigitalBidAdapter.js +2 -1
  237. package/modules/livewrappedAnalyticsAdapter.js +3 -3
  238. package/modules/lkqdBidAdapter.js +3 -3
  239. package/modules/loganBidAdapter.js +2 -2
  240. package/modules/luponmediaBidAdapter.js +3 -3
  241. package/modules/mabidderBidAdapter.js +60 -0
  242. package/modules/mabidderBidAdapter.md +31 -0
  243. package/modules/malltvBidAdapter.js +2 -2
  244. package/modules/mediagoBidAdapter.js +462 -0
  245. package/modules/mediagoBidAdapter.md +34 -0
  246. package/modules/mediakeysBidAdapter.js +2 -2
  247. package/modules/mgidBidAdapter.js +2 -2
  248. package/modules/nextMillenniumBidAdapter.js +25 -6
  249. package/modules/nobidBidAdapter.js +2 -2
  250. package/modules/novatiqIdSystem.js +1 -1
  251. package/modules/oneKeyIdSystem.js +78 -0
  252. package/modules/oneKeyIdSystem.md +109 -0
  253. package/modules/oneKeyRtdProvider.js +98 -0
  254. package/modules/oneKeyRtdProvider.md +127 -0
  255. package/modules/open8BidAdapter.js +1 -1
  256. package/modules/openwebBidAdapter.js +1 -1
  257. package/modules/openxAnalyticsAdapter.js +5 -744
  258. package/modules/openxAnalyticsAdapter.md +4 -0
  259. package/modules/openxBidAdapter.js +3 -3
  260. package/modules/permutiveRtdProvider.js +55 -8
  261. package/modules/pixfutureBidAdapter.js +1 -1
  262. package/modules/prebidmanagerAnalyticsAdapter.js +1 -1
  263. package/modules/priceFloors.js +1 -1
  264. package/modules/pubmaticAnalyticsAdapter.js +1 -1
  265. package/modules/pubmaticBidAdapter.js +19 -1
  266. package/modules/pubwiseAnalyticsAdapter.js +1 -1
  267. package/modules/pubwiseBidAdapter.js +3 -3
  268. package/modules/pubxBidAdapter.js +1 -1
  269. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  270. package/modules/quantcastIdSystem.js +1 -1
  271. package/modules/radsBidAdapter.js +1 -1
  272. package/modules/rasBidAdapter.js +8 -0
  273. package/modules/rasBidAdapter.md +14 -13
  274. package/modules/revcontentBidAdapter.js +1 -1
  275. package/modules/richaudienceBidAdapter.js +1 -1
  276. package/modules/rtbhouseBidAdapter.js +25 -1
  277. package/modules/schain.js +1 -1
  278. package/modules/seedtagBidAdapter.md +25 -56
  279. package/modules/showheroes-bsBidAdapter.js +1 -1
  280. package/modules/sizeMappingV2.js +1 -1
  281. package/modules/smaatoBidAdapter.js +2 -2
  282. package/modules/sonobiAnalyticsAdapter.js +1 -1
  283. package/modules/sonobiBidAdapter.js +4 -3
  284. package/modules/staqAnalyticsAdapter.js +1 -1
  285. package/modules/tappxBidAdapter.js +11 -2
  286. package/modules/targetVideoBidAdapter.js +1 -1
  287. package/modules/theAdxBidAdapter.js +2 -2
  288. package/modules/tpmnBidAdapter.js +1 -1
  289. package/modules/trionBidAdapter.js +2 -2
  290. package/modules/tripleliftBidAdapter.js +20 -1
  291. package/modules/trustpidSystem.js +6 -42
  292. package/modules/trustpidSystem.md +10 -10
  293. package/modules/underdogmediaBidAdapter.js +1 -1
  294. package/modules/userId/eids.js +26 -0
  295. package/modules/userId/userId.md +2 -2
  296. package/modules/vdoaiBidAdapter.js +1 -1
  297. package/modules/vidazooBidAdapter.js +7 -5
  298. package/modules/vidoomyBidAdapter.js +1 -1
  299. package/modules/viewability.js +14 -14
  300. package/modules/winrBidAdapter.js +1 -1
  301. package/modules/yahoosspBidAdapter.js +3 -3
  302. package/modules/yandexBidAdapter.js +1 -1
  303. package/modules/yieldmoBidAdapter.js +3 -3
  304. package/modules/yieldoneBidAdapter.js +2 -2
  305. package/modules/zeta_global_sspBidAdapter.js +24 -21
  306. package/package.json +3 -3
  307. package/src/Renderer.js +1 -1
  308. package/src/adloader.js +2 -1
  309. package/src/adserver.js +0 -56
  310. package/src/auction.js +60 -16
  311. package/src/bidfactory.js +1 -1
  312. package/src/native.js +75 -60
  313. package/src/refererDetection.js +12 -1
  314. package/src/sizeMapping.js +5 -7
  315. package/src/targeting.js +1 -1
  316. package/src/userSync.js +1 -1
  317. package/src/utils/promise.js +3 -1
  318. package/src/utils.js +27 -0
  319. package/src/video.js +5 -4
  320. package/src/videoCache.js +8 -2
  321. package/test/pages/instream.html +2 -2
  322. package/test/spec/modules/acuityAdsBidAdapter_spec.js +398 -0
  323. package/test/spec/modules/adagioBidAdapter_spec.js +2 -0
  324. package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
  325. package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
  326. package/test/spec/modules/adriverIdSystem_spec.js +3 -8
  327. package/test/spec/modules/adtelligentBidAdapter_spec.js +2 -0
  328. package/test/spec/modules/adtrgtmeBidAdapter_spec.js +802 -0
  329. package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
  330. package/test/spec/modules/appnexusBidAdapter_spec.js +1 -0
  331. package/test/spec/modules/beopBidAdapter_spec.js +11 -0
  332. package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
  333. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
  334. package/test/spec/modules/big-richmediaBidAdapter_spec.js +1 -0
  335. package/test/spec/modules/browsiRtdProvider_spec.js +40 -1
  336. package/test/spec/modules/consumableBidAdapter_spec.js +158 -0
  337. package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
  338. package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
  339. package/test/spec/modules/currency_spec.js +22 -0
  340. package/test/spec/modules/datawrkzBidAdapter_spec.js +656 -0
  341. package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
  342. package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
  343. package/test/spec/modules/enrichmentFpdModule_spec.js +16 -1
  344. package/test/spec/modules/fpdModule_spec.js +2 -1
  345. package/test/spec/modules/id5IdSystem_spec.js +529 -172
  346. package/test/spec/modules/imRtdProvider_spec.js +10 -5
  347. package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
  348. package/test/spec/modules/ixBidAdapter_spec.js +216 -123
  349. package/test/spec/modules/kargoBidAdapter_spec.js +11 -2
  350. package/test/spec/modules/lifestreetBidAdapter_spec.js +232 -0
  351. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +59 -7
  352. package/test/spec/modules/mabidderBidAdapter_spec.js +125 -0
  353. package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
  354. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
  355. package/test/spec/modules/oneKeyIdSystem_spec.js +107 -0
  356. package/test/spec/modules/oneKeyRtdProvider_spec.js +152 -0
  357. package/test/spec/modules/openxAnalyticsAdapter_spec.js +6 -638
  358. package/test/spec/modules/permutiveRtdProvider_spec.js +152 -2
  359. package/test/spec/modules/pubmaticBidAdapter_spec.js +69 -4
  360. package/test/spec/modules/rasBidAdapter_spec.js +2 -0
  361. package/test/spec/modules/tripleliftBidAdapter_spec.js +18 -0
  362. package/test/spec/modules/trustpidSystem_spec.js +27 -45
  363. package/test/spec/modules/vidazooBidAdapter_spec.js +36 -23
  364. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +59 -0
  365. package/test/spec/native_spec.js +257 -2
  366. package/test/spec/videoCache_spec.js +37 -7
@@ -0,0 +1,656 @@
1
+ import { expect } from 'chai';
2
+ import { config } from 'src/config.js';
3
+ import { spec } from 'modules/datawrkzBidAdapter.js';
4
+ import { newBidder } from 'src/adapters/bidderFactory.js';
5
+
6
+ const BIDDER_CODE = 'datawrkz';
7
+ const ENDPOINT_URL = 'https://at.datawrkz.com/exchange/openrtb23/';
8
+ const SITE_ID = 'site_id';
9
+ const FINAL_URL = ENDPOINT_URL + SITE_ID + '?hb=1';
10
+
11
+ describe('datawrkzAdapterTests', function () {
12
+ const adapter = newBidder(spec);
13
+
14
+ describe('inherited functions', function () {
15
+ it('exists and is a function', function () {
16
+ expect(adapter.callBids).to.exist.and.to.be.a('function');
17
+ });
18
+ });
19
+
20
+ describe('isBidRequestValid', function () {
21
+ let bid = {
22
+ 'bidder': BIDDER_CODE,
23
+ 'params': {
24
+ 'site_id': SITE_ID,
25
+ 'bidfloor': '1.0'
26
+ },
27
+ 'adUnitCode': 'adunit-code',
28
+ 'sizes': [[300, 250], [300, 600]],
29
+ 'bidId': '30b31c1838de1e',
30
+ 'bidderRequestId': '22edbae2733bf6',
31
+ 'auctionId': '1d1a030790a475',
32
+ };
33
+
34
+ it('should return true when required params found', function () {
35
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
36
+ });
37
+
38
+ it('should return false when params not found', function () {
39
+ let bid = Object.assign({}, bid);
40
+ delete bid.params;
41
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
42
+ });
43
+
44
+ it('should return false when required site_id param not found', function () {
45
+ let bid = Object.assign({}, bid);
46
+ bid.params = {'bidfloor': '1.0'}
47
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
48
+ });
49
+
50
+ it('should return false when adunit is adpod video', function () {
51
+ let bid = Object.assign({}, bid);
52
+ bid.params = {'bidfloor': '1.0', 'site_id': SITE_ID};
53
+ bid.mediaTypes = {
54
+ 'video': {
55
+ 'context': 'adpod'
56
+ }
57
+ }
58
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
59
+ });
60
+ });
61
+
62
+ describe('buildRequests', function () {
63
+ const consentString = '1YA-';
64
+ const bidderRequest = {
65
+ 'bidderCode': 'datawrkz',
66
+ 'auctionId': '1d1a030790a475',
67
+ 'bidderRequestId': '22edbae2733bf6',
68
+ 'timeout': 3000,
69
+ 'uspConsent': consentString,
70
+ 'gdprConsent': {'gdprApplies': true},
71
+ };
72
+ const bannerBidRequests = [{
73
+ 'bidder': BIDDER_CODE,
74
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
75
+ 'mediaTypes': {'banner': {'sizes': [[300, 250], [300, 600]]}},
76
+ 'adUnitCode': 'adUnitCode',
77
+ 'transactionId': 'transactionId',
78
+ 'sizes': [[300, 250], [300, 600]],
79
+ 'bidId': 'bidId',
80
+ 'bidderRequestId': 'bidderRequestId',
81
+ 'auctionId': 'auctionId',
82
+ }];
83
+ const bannerBidRequestsSingleArraySlotAndDeals = [{
84
+ 'bidder': BIDDER_CODE,
85
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00, 'deals': [{id: 'deal_1'}, {id: 'deal_2'}]},
86
+ 'mediaTypes': {'banner': {}},
87
+ 'adUnitCode': 'adUnitCode',
88
+ 'transactionId': 'transactionId',
89
+ 'sizes': [300, 250],
90
+ 'bidId': 'bidId',
91
+ 'bidderRequestId': 'bidderRequestId',
92
+ 'auctionId': 'auctionId',
93
+ }];
94
+ const nativeBidRequests = [{
95
+ 'bidder': BIDDER_CODE,
96
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
97
+ 'mediaTypes': {'native': {
98
+ 'title': {'required': true, 'len': 80},
99
+ 'image': {'required': true, 'sizes': [[300, 250]]},
100
+ 'icon': {'required': true, 'sizes': [[50, 50]]},
101
+ 'sponsoredBy': {'required': true},
102
+ 'cta': {'required': true},
103
+ 'body': {'required': true, 'len': 100}
104
+ }},
105
+ 'adUnitCode': 'adUnitCode',
106
+ 'transactionId': 'transactionId',
107
+ 'bidId': 'bidId',
108
+ 'bidderRequestId': 'bidderRequestId',
109
+ 'auctionId': 'auctionId',
110
+ }];
111
+ const nativeBidRequestsSingleArraySlotAndDeals = [{
112
+ 'bidder': BIDDER_CODE,
113
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00, 'deals': [{id: 'deal_1'}, {id: 'deal_2'}]},
114
+ 'mediaTypes': {'native': {
115
+ 'title': {'len': 80},
116
+ 'image': {'sizes': [300, 250]},
117
+ 'icon': {'sizes': [50, 50]},
118
+ 'sponsoredBy': {},
119
+ 'cta': {},
120
+ 'body': {'len': 100}
121
+ }},
122
+ 'adUnitCode': 'adUnitCode',
123
+ 'transactionId': 'transactionId',
124
+ 'bidId': 'bidId',
125
+ 'bidderRequestId': 'bidderRequestId',
126
+ 'auctionId': 'auctionId',
127
+ }];
128
+ const instreamVideoBidRequests = [{
129
+ 'bidder': BIDDER_CODE,
130
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
131
+ 'mediaTypes': {'video': {'context': 'instream', 'playerSize': [[640, 480]]}},
132
+ 'adUnitCode': 'adUnitCode',
133
+ 'transactionId': 'transactionId',
134
+ 'bidId': 'bidId',
135
+ 'bidderRequestId': 'bidderRequestId',
136
+ 'auctionId': 'auctionId',
137
+ }];
138
+ const instreamVideoBidRequestsSingleArraySlotAndDeals = [{
139
+ 'bidder': BIDDER_CODE,
140
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00, 'deals': [{id: 'deal_1'}, {id: 'deal_2'}]},
141
+ 'mediaTypes': {'video': {'context': 'instream', 'playerSize': [640, 480]}},
142
+ 'adUnitCode': 'adUnitCode',
143
+ 'transactionId': 'transactionId',
144
+ 'bidId': 'bidId',
145
+ 'bidderRequestId': 'bidderRequestId',
146
+ 'auctionId': 'auctionId',
147
+ }];
148
+ const outstreamVideoBidRequests = [{
149
+ 'bidder': BIDDER_CODE,
150
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
151
+ 'mediaTypes': {'video': {'context': 'outstream', 'playerSize': [[640, 480]], 'mimes': ['video/mp4', 'video/x-flv']}},
152
+ 'adUnitCode': 'adUnitCode',
153
+ 'transactionId': 'transactionId',
154
+ 'bidId': 'bidId',
155
+ 'bidderRequestId': 'bidderRequestId',
156
+ 'auctionId': 'auctionId',
157
+ }];
158
+ const outstreamVideoBidRequestsSingleArraySlotAndDeals = [{
159
+ 'bidder': BIDDER_CODE,
160
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00, 'deals': [{id: 'deal_1'}, {id: 'deal_2'}]},
161
+ 'mediaTypes': {'video': {'context': 'outstream', 'playerSize': [640, 480], 'mimes': ['video/mp4', 'video/x-flv']}},
162
+ 'adUnitCode': 'adUnitCode',
163
+ 'transactionId': 'transactionId',
164
+ 'bidId': 'bidId',
165
+ 'bidderRequestId': 'bidderRequestId',
166
+ 'auctionId': 'auctionId',
167
+ }];
168
+ const bidRequestsWithNoMediaType = [{
169
+ 'bidder': BIDDER_CODE,
170
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
171
+ 'adUnitCode': 'adUnitCode',
172
+ 'transactionId': 'transactionId',
173
+ 'bidId': 'bidId',
174
+ 'bidderRequestId': 'bidderRequestId',
175
+ 'auctionId': 'auctionId',
176
+ }];
177
+
178
+ it('empty bid requests', function () {
179
+ const requests = spec.buildRequests([], bidderRequest);
180
+ assert.lengthOf(requests, 0);
181
+ });
182
+
183
+ it('mediaTypes missing in bid request', function () {
184
+ const requests = spec.buildRequests(bidRequestsWithNoMediaType, bidderRequest);
185
+ assert.lengthOf(requests, 0);
186
+ });
187
+
188
+ it('invalid media type in bid request', function () {
189
+ bidRequestsWithNoMediaType[0].mediaTypes = {'test': {}};
190
+ const requests = spec.buildRequests(bidRequestsWithNoMediaType, bidderRequest);
191
+ assert.lengthOf(requests, 0);
192
+ });
193
+
194
+ it('size missing in bid request for banner', function () {
195
+ delete bidRequestsWithNoMediaType[0].mediaTypes.test;
196
+ bidRequestsWithNoMediaType[0].mediaTypes.banner = {};
197
+ const requests = spec.buildRequests(bidRequestsWithNoMediaType, bidderRequest);
198
+ assert.lengthOf(requests, 0);
199
+ });
200
+
201
+ it('size array empty in bid request for banner', function () {
202
+ bidRequestsWithNoMediaType[0].mediaTypes.banner.sizes = [];
203
+ const requests = spec.buildRequests(bidRequestsWithNoMediaType, bidderRequest);
204
+ assert.lengthOf(requests, 0);
205
+ });
206
+
207
+ it('banner bidRequest with slot size as 2 dimensional array', function () {
208
+ sinon.stub(config, 'getConfig').withArgs('coppa').returns(true);
209
+ const requests = spec.buildRequests(bannerBidRequests, bidderRequest);
210
+ config.getConfig.restore();
211
+ const payload = JSON.parse(requests[0].data);
212
+ expect(requests[0].method).to.equal('POST');
213
+ expect(requests[0].url).to.equal(FINAL_URL);
214
+ expect(payload.imp).to.exist;
215
+ expect(payload).to.nested.include({'imp[0].banner.w': 300});
216
+ expect(payload).to.nested.include({'imp[0].banner.h': 250});
217
+ expect(payload).to.nested.include({'regs.ext.us_privacy': consentString});
218
+ expect(payload).to.nested.include({'regs.ext.gdpr': '1'});
219
+ expect(payload).to.nested.include({'regs.coppa': '1'});
220
+ expect(requests[0].bidRequest).to.exist;
221
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('banner');
222
+ });
223
+
224
+ it('banner bidRequest with deals and slot size as 1 dimensional array', function () {
225
+ const requests = spec.buildRequests(bannerBidRequestsSingleArraySlotAndDeals, bidderRequest);
226
+ const payload = JSON.parse(requests[0].data);
227
+ expect(requests[0].method).to.equal('POST');
228
+ expect(requests[0].url).to.equal(FINAL_URL);
229
+ expect(payload.imp).to.exist;
230
+ expect(payload).to.nested.include({'imp[0].banner.w': 300});
231
+ expect(payload).to.nested.include({'imp[0].banner.h': 250});
232
+ expect(payload).to.nested.include({'imp[0].pmp.deals[0].id': 'deal_1'});
233
+ expect(payload).to.nested.include({'imp[0].pmp.deals[1].id': 'deal_2'});
234
+ expect(requests[0].bidRequest).to.exist;
235
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('banner');
236
+ });
237
+
238
+ it('native bidRequest fields with slot size as 2 dimensional array', function () {
239
+ sinon.stub(config, 'getConfig').withArgs('coppa').returns(true);
240
+ const requests = spec.buildRequests(nativeBidRequests, bidderRequest);
241
+ config.getConfig.restore();
242
+ const payload = JSON.parse(requests[0].data);
243
+ expect(requests[0].method).to.equal('POST');
244
+ expect(requests[0].url).to.equal(FINAL_URL);
245
+ expect(payload.imp[0].native.request).to.exist;
246
+ expect(payload).to.nested.include({'regs.ext.us_privacy': consentString});
247
+ expect(payload).to.nested.include({'regs.ext.gdpr': '1'});
248
+ expect(payload).to.nested.include({'regs.coppa': '1'});
249
+ expect(requests[0].bidRequest).to.exist;
250
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('native');
251
+ });
252
+
253
+ it('native bidRequest fields with deals and slot size as 1 dimensional array', function () {
254
+ const requests = spec.buildRequests(nativeBidRequestsSingleArraySlotAndDeals, bidderRequest);
255
+ const payload = JSON.parse(requests[0].data);
256
+ expect(requests[0].method).to.equal('POST');
257
+ expect(requests[0].url).to.equal(FINAL_URL);
258
+ expect(payload.imp).to.exist;
259
+ expect(payload.imp[0].native.request).to.exist;
260
+ expect(payload).to.nested.include({'imp[0].pmp.deals[0].id': 'deal_1'});
261
+ expect(payload).to.nested.include({'imp[0].pmp.deals[1].id': 'deal_2'});
262
+ expect(requests[0].bidRequest).to.exist;
263
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('native');
264
+ });
265
+
266
+ it('instream video bidRequest fields with slot size as 2 dimensional array', function () {
267
+ sinon.stub(config, 'getConfig').withArgs('coppa').returns(true);
268
+ const requests = spec.buildRequests(instreamVideoBidRequests, bidderRequest);
269
+ config.getConfig.restore();
270
+ const payload = JSON.parse(requests[0].data);
271
+ expect(requests[0].method).to.equal('POST');
272
+ expect(requests[0].url).to.equal(FINAL_URL);
273
+ expect(payload).to.nested.include({'regs.ext.us_privacy': consentString});
274
+ expect(payload).to.nested.include({'regs.ext.gdpr': '1'});
275
+ expect(payload).to.nested.include({'regs.coppa': '1'});
276
+ expect(requests[0].bidRequest).to.exist;
277
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('video');
278
+ });
279
+
280
+ it('instream video bidRequest with deals and slot size as 1 dimensional array', function () {
281
+ const requests = spec.buildRequests(instreamVideoBidRequestsSingleArraySlotAndDeals, bidderRequest);
282
+ const payload = JSON.parse(requests[0].data);
283
+ expect(requests[0].method).to.equal('POST');
284
+ expect(requests[0].url).to.equal(FINAL_URL);
285
+ expect(requests[0].bidRequest).to.exist;
286
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('video');
287
+ });
288
+
289
+ it('outstream video bidRequest fields with slot size as 2 dimensional array', function () {
290
+ sinon.stub(config, 'getConfig').withArgs('coppa').returns(true);
291
+ const requests = spec.buildRequests(outstreamVideoBidRequests, bidderRequest);
292
+ config.getConfig.restore();
293
+ const payload = JSON.parse(requests[0].data);
294
+ expect(requests[0].method).to.equal('POST');
295
+ expect(requests[0].url).to.equal(FINAL_URL);
296
+ expect(payload).to.nested.include({'imp[0].video.w': 640});
297
+ expect(payload).to.nested.include({'imp[0].video.h': 480});
298
+ expect(payload).to.nested.include({'regs.ext.us_privacy': consentString});
299
+ expect(payload).to.nested.include({'regs.ext.gdpr': '1'});
300
+ expect(payload).to.nested.include({'regs.coppa': '1'});
301
+ expect(requests[0].bidRequest).to.exist;
302
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('video');
303
+ });
304
+
305
+ it('outstream video bidRequest fields with deals and slot size as 1 dimensional array', function () {
306
+ const requests = spec.buildRequests(outstreamVideoBidRequestsSingleArraySlotAndDeals, bidderRequest);
307
+ const payload = JSON.parse(requests[0].data);
308
+ expect(requests[0].method).to.equal('POST');
309
+ expect(requests[0].url).to.equal(FINAL_URL);
310
+ expect(payload).to.nested.include({'imp[0].video.w': 640});
311
+ expect(payload).to.nested.include({'imp[0].video.h': 480});
312
+ expect(payload).to.nested.include({'imp[0].pmp.deals[0].id': 'deal_1'});
313
+ expect(payload).to.nested.include({'imp[0].pmp.deals[1].id': 'deal_2'});
314
+ expect(requests[0].bidRequest).to.exist;
315
+ expect(requests[0].bidRequest.requestedMediaType).to.equal('video');
316
+ });
317
+ });
318
+
319
+ describe('interpretResponse', function () {
320
+ const bidRequest = {
321
+ 'bidder': BIDDER_CODE,
322
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
323
+ 'mediaTypes': {'banner': {'sizes': [[300, 250], [300, 600]]}},
324
+ 'adUnitCode': 'adUnitCode',
325
+ 'transactionId': 'transactionId',
326
+ 'sizes': [[300, 250], [300, 600]],
327
+ 'bidId': 'bidId',
328
+ 'bidderRequestId': 'bidderRequestId',
329
+ 'auctionId': 'auctionId',
330
+ 'requestedMediaType': 'banner'
331
+ };
332
+ const nativeBidRequest = {
333
+ 'bidder': BIDDER_CODE,
334
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
335
+ 'mediaTypes': {'native': {
336
+ 'title': {'required': true, 'len': 80},
337
+ 'image': {'required': true, 'sizes': [300, 250]},
338
+ 'icon': {'required': true, 'sizes': [50, 50]},
339
+ 'sponsoredBy': {'required': true},
340
+ 'cta': {'required': true},
341
+ 'body': {'required': true}
342
+ }},
343
+ 'adUnitCode': 'adUnitCode',
344
+ 'transactionId': 'transactionId',
345
+ 'bidId': 'bidId',
346
+ 'bidderRequestId': 'bidderRequestId',
347
+ 'auctionId': 'auctionId',
348
+ 'requestedMediaType': 'native',
349
+ 'assets': [
350
+ {'id': 1, 'required': 1, 'title': {'len': 80}},
351
+ {'id': 2, 'required': 1, 'img': {'type': 3, 'w': 300, 'h': 250}},
352
+ {'id': 3, 'required': 1, 'img': {'type': 1, 'w': 50, 'h': 50}},
353
+ {'id': 4, 'required': 1, 'data': {'type': 1}},
354
+ {'id': 5, 'required': 1, 'data': {'type': 12}},
355
+ {'id': 6, 'required': 1, 'data': {'type': 2, 'len': 100}}
356
+ ]
357
+ };
358
+ const instreamVideoBidRequest = {
359
+ 'bidder': BIDDER_CODE,
360
+ 'params': {'site_id': SITE_ID, 'bidfloor': 1.00},
361
+ 'mediaTypes': {'video': {'context': 'instream', 'playerSize': [640, 480]}},
362
+ 'adUnitCode': 'adUnitCode',
363
+ 'transactionId': 'transactionId',
364
+ 'bidId': 'bidId',
365
+ 'bidderRequestId': 'bidderRequestId',
366
+ 'auctionId': 'auctionId',
367
+ 'requestedMediaType': 'video'
368
+ };
369
+ const outstreamVideoBidRequest = {
370
+ 'bidder': BIDDER_CODE,
371
+ 'params': {'site_id': SITE_ID,
372
+ 'bidfloor': 1.00,
373
+ 'outstreamType': 'slider_top_left',
374
+ 'outstreamConfig':
375
+ {'ad_unit_audio': 1, 'show_player_close_button_after': 5, 'hide_player_control': 0}},
376
+ 'mediaTypes': {'video': {'context': 'outstream', 'playerSize': [640, 480]}},
377
+ 'adUnitCode': 'adUnitCode',
378
+ 'transactionId': 'transactionId',
379
+ 'bidId': 'bidId',
380
+ 'bidderRequestId': 'bidderRequestId',
381
+ 'auctionId': 'auctionId',
382
+ 'requestedMediaType': 'video'
383
+ };
384
+ const request = {
385
+ 'method': 'POST',
386
+ 'url': FINAL_URL,
387
+ 'data': '',
388
+ bidRequest
389
+ };
390
+
391
+ it('check empty response', function () {
392
+ const result = spec.interpretResponse({}, request);
393
+ expect(result).to.deep.equal([]);
394
+ });
395
+
396
+ it('check if id missing in response', function () {
397
+ const serverResponse = {'body': {'seatbid': [{}]}, 'headers': {}};
398
+ const result = spec.interpretResponse(serverResponse, request);
399
+ expect(result).to.deep.equal([]);
400
+ });
401
+
402
+ it('check if seatbid present in response', function () {
403
+ const serverResponse = {'body': {'id': 'id'}, 'headers': {}};
404
+ const result = spec.interpretResponse(serverResponse, request);
405
+ expect(result).to.deep.equal([]);
406
+ });
407
+
408
+ it('check empty array response seatbid', function () {
409
+ const serverResponse = {'body': {'id': 'id', 'seatbid': []}, 'headers': {}};
410
+ const result = spec.interpretResponse(serverResponse, request);
411
+ expect(result).to.deep.equal([]);
412
+ });
413
+
414
+ it('check bid present in seatbid', function () {
415
+ const serverResponse = {'body': {'id': 'id', 'seatbid': [{}]}, 'headers': {}};
416
+ const result = spec.interpretResponse(serverResponse, request);
417
+ expect(result).to.have.lengthOf(0);
418
+ });
419
+
420
+ it('check empty array bid in seatbid', function () {
421
+ const serverResponse = {'body': {'id': 'id', 'seatbid': [{'bid': []}]}, 'headers': {}};
422
+ const result = spec.interpretResponse(serverResponse, request);
423
+ expect(result).to.have.lengthOf(0);
424
+ });
425
+
426
+ it('banner response missing bid price', function () {
427
+ const serverResponse = {'body': {'id': 'id', 'seatbid': [{'bid': [{'id': 1}]}]}, 'headers': {}};
428
+ const result = spec.interpretResponse(serverResponse, request);
429
+ expect(result).to.have.lengthOf(1);
430
+ expect(result[0].requestId).to.equal('bidId');
431
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
432
+ });
433
+
434
+ it('banner response', function () {
435
+ const serverResponse = {
436
+ 'body': {
437
+ 'id': 'id',
438
+ 'seatbid': [
439
+ {
440
+ 'bid': [
441
+ {
442
+ 'id': '1',
443
+ 'price': 1,
444
+ 'w': 300,
445
+ 'h': 250,
446
+ 'adm': 'test adm',
447
+ 'nurl': 'url'
448
+ }
449
+ ]
450
+ }
451
+ ]
452
+ },
453
+ 'headers': {}
454
+ };
455
+ const result = spec.interpretResponse(serverResponse, request);
456
+ expect(result).to.have.lengthOf(1);
457
+ expect(result[0].requestId).to.equal('bidId');
458
+ expect(result[0].cpm).to.equal(1);
459
+ expect(result[0].size).to.equal(bidRequest.mediaTypes.banner.sizes);
460
+ expect(result[0].width).to.equal(300);
461
+ expect(result[0].height).to.equal(250);
462
+ expect(result[0].ad).to.equal(decodeURIComponent(serverResponse.body.seatbid[0].bid[0].adm + '<img src="' + serverResponse.body.seatbid[0].bid[0].nurl + '" height="0px" width="0px">'));
463
+ expect(result[0].creativeId).to.equal('1');
464
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
465
+ expect(result[0].transactionId).to.equal(request.bidRequest.transactionId);
466
+ expect(result[0].mediaType).to.equal('banner');
467
+ });
468
+
469
+ it('native response missing bid price', function () {
470
+ request.bidRequest = nativeBidRequest;
471
+ const serverResponse = {
472
+ 'body': {
473
+ 'id': 'id',
474
+ 'seatbid': [
475
+ {
476
+ 'bid': [
477
+ {
478
+ 'id': '1',
479
+ 'w': 300,
480
+ 'h': 250,
481
+ 'adm': '{"native": {"link": {"url": "test_url"}, "imptrackers": [], "assets": [' +
482
+ '{"id": 1, "title": {"text": "Test title"}},' +
483
+ '{"id": 2, "img": {"type": 3,"url": "https://test/image", "w": 300, "h": 250}},' +
484
+ '{"id": 3, "img": {"type": 1, "url": "https://test/icon", "w": 50, "h": 50}},' +
485
+ '{"id": 4, "data": {"type": 1, "value": "Test sponsored by"}},' +
486
+ '{"id": 5, "data": {"type": 12, "value": "Test CTA"}},' +
487
+ '{"id": 6, "data": {"type": 2, "value": "Test body"}}]}}'
488
+ }
489
+ ]
490
+ }
491
+ ]
492
+ },
493
+ 'headers': {}
494
+ };
495
+ const result = spec.interpretResponse(serverResponse, request);
496
+ expect(result).to.have.lengthOf(1);
497
+ expect(result[0].requestId).to.equal('bidId');
498
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
499
+ });
500
+
501
+ it('native response', function () {
502
+ request.bidRequest = nativeBidRequest;
503
+ const serverResponse = {
504
+ 'body': {
505
+ 'id': 'id',
506
+ 'seatbid': [
507
+ {
508
+ 'bid': [
509
+ {
510
+ 'id': '1',
511
+ 'price': 1,
512
+ 'w': 300,
513
+ 'h': 250,
514
+ 'adm': '{"native": {"link": {"url": "test_url"}, "imptrackers": ["tracker1", "tracker2"], "assets": [' +
515
+ '{"id": 1, "title": {"text": "Test title"}},' +
516
+ '{"id": 2, "img": {"type": 3,"url": "https://test/image", "w": 300, "h": 250}},' +
517
+ '{"id": 3, "img": {"type": 1, "url": "https://test/icon", "w": 50, "h": 50}},' +
518
+ '{"id": 4, "data": {"type": 1, "value": "Test sponsored by"}},' +
519
+ '{"id": 5, "data": {"type": 12, "value": "Test CTA"}},' +
520
+ '{"id": 6, "data": {"type": 2, "value": "Test body"}}]}}'
521
+ }
522
+ ]
523
+ }
524
+ ]
525
+ },
526
+ 'headers': {}
527
+ };
528
+
529
+ const result = spec.interpretResponse(serverResponse, request);
530
+ expect(result).to.have.lengthOf(1);
531
+ expect(result[0].requestId).to.equal('bidId');
532
+ expect(result[0].cpm).to.equal(1);
533
+ expect(result[0].native.clickUrl).to.equal('test_url');
534
+ expect(result[0].native.impressionTrackers).to.have.lengthOf(2);
535
+ expect(result[0].native.title).to.equal('Test title');
536
+ expect(result[0].native.image.url).to.equal('https://test/image');
537
+ expect(result[0].native.icon.url).to.equal('https://test/icon');
538
+ expect(result[0].native.sponsored).to.equal('Test sponsored by');
539
+ expect(result[0].native.cta).to.equal('Test CTA');
540
+ expect(result[0].native.desc).to.equal('Test body');
541
+ expect(result[0].creativeId).to.equal('1');
542
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
543
+ expect(result[0].transactionId).to.equal(request.bidRequest.transactionId);
544
+ expect(result[0].mediaType).to.equal('native');
545
+ });
546
+
547
+ it('video response missing bid price', function () {
548
+ request.bidRequest = instreamVideoBidRequest;
549
+ const serverResponse = {
550
+ 'body': {
551
+ 'id': 'id',
552
+ 'seatbid': [
553
+ {
554
+ 'bid': [
555
+ {
556
+ 'id': '1',
557
+ 'w': 640,
558
+ 'h': 480,
559
+ 'adm': '<VAST></VAST>',
560
+ 'ext': {
561
+ 'vast_url': 'vast_url'
562
+ }
563
+ }
564
+ ]
565
+ }
566
+ ]
567
+ },
568
+ 'headers': {}
569
+ };
570
+ const result = spec.interpretResponse(serverResponse, request);
571
+ expect(result).to.have.lengthOf(1);
572
+ expect(result[0].requestId).to.equal('bidId');
573
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
574
+ });
575
+
576
+ it('instream video response', function () {
577
+ request.bidRequest = instreamVideoBidRequest;
578
+ const serverResponse = {
579
+ 'body': {
580
+ 'id': 'id',
581
+ 'seatbid': [
582
+ {
583
+ 'bid': [
584
+ {
585
+ 'id': '1',
586
+ 'price': 1,
587
+ 'w': 640,
588
+ 'h': 480,
589
+ 'adm': '<VAST></VAST>',
590
+ 'ext': {
591
+ 'vast_url': 'test_vast_url?kcid=123&kaid=12&protocol=3'
592
+ }
593
+ }
594
+ ]
595
+ }
596
+ ]
597
+ },
598
+ 'headers': {}
599
+ };
600
+
601
+ const result = spec.interpretResponse(serverResponse, request);
602
+ expect(result).to.have.lengthOf(1);
603
+ expect(result[0].requestId).to.equal('bidId');
604
+ expect(result[0].cpm).to.equal(1);
605
+ expect(result[0].width).to.equal(640);
606
+ expect(result[0].height).to.equal(480);
607
+ expect(result[0].vastUrl).to.equal('test_vast_url?kcid=123&kaid=12&protocol=3');
608
+ expect(result[0].adserverTargeting.hb_kcid).to.equal('123');
609
+ expect(result[0].adserverTargeting.hb_kaid).to.equal('12');
610
+ expect(result[0].adserverTargeting.hb_protocol).to.equal('3');
611
+ expect(result[0].creativeId).to.equal('1');
612
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
613
+ expect(result[0].transactionId).to.equal(request.bidRequest.transactionId);
614
+ expect(result[0].mediaType).to.equal('video');
615
+ });
616
+
617
+ it('outstream video response', function () {
618
+ request.bidRequest = outstreamVideoBidRequest;
619
+ const serverResponse = {
620
+ 'body': {
621
+ 'id': 'id',
622
+ 'seatbid': [
623
+ {
624
+ 'bid': [
625
+ {
626
+ 'id': '1',
627
+ 'price': 1,
628
+ 'w': 640,
629
+ 'h': 480,
630
+ 'adm': '<VAST></VAST>',
631
+ 'ext': {
632
+ 'vast_url': 'vast_url'
633
+ }
634
+ }
635
+ ]
636
+ }
637
+ ]
638
+ },
639
+ 'headers': {}
640
+ };
641
+ const result = spec.interpretResponse(serverResponse, request);
642
+ expect(result).to.have.lengthOf(1);
643
+ expect(result[0].requestId).to.equal('bidId');
644
+ expect(result[0].cpm).to.equal(1);
645
+ expect(result[0].width).to.equal(640);
646
+ expect(result[0].height).to.equal(480);
647
+ expect(result[0].outstreamType).to.equal('slider_top_left');
648
+ expect(result[0].ad).to.equal('<VAST></VAST>');
649
+ expect(result[0].renderer).to.exist;
650
+ expect(result[0].creativeId).to.equal('1');
651
+ expect(result[0].bidderCode).to.equal(request.bidRequest.bidder);
652
+ expect(result[0].transactionId).to.equal(request.bidRequest.transactionId);
653
+ expect(result[0].mediaType).to.equal('video');
654
+ });
655
+ });
656
+ });
@@ -293,8 +293,8 @@ describe('Digital Garage Keyword Module', function () {
293
293
  moduleConfig,
294
294
  null
295
295
  );
296
+ const request = server.requests[0];
296
297
  setTimeout(() => {
297
- const request = server.requests[0];
298
298
  if (request) {
299
299
  request.respond(
300
300
  200,