prebid.js 7.53.0 → 8.0.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 (706) hide show
  1. package/.github/workflows/codeql-analysis.yml +2 -2
  2. package/dist/1plusXRtdProvider.js +1 -1
  3. package/dist/33acrossBidAdapter.js +1 -1
  4. package/dist/33acrossIdSystem.js +1 -1
  5. package/dist/adWMGAnalyticsAdapter.js +1 -1
  6. package/dist/adWMGBidAdapter.js +1 -1
  7. package/dist/adagioAnalyticsAdapter.js +1 -1
  8. package/dist/adagioBidAdapter.js +1 -1
  9. package/dist/adbookpspBidAdapter.js +1 -1
  10. package/dist/adfBidAdapter.js +1 -1
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/adhashBidAdapter.js +1 -1
  13. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  14. package/dist/adkernelAdnBidAdapter.js +1 -1
  15. package/dist/adkernelBidAdapter.js +1 -1
  16. package/dist/adlooxAdServerVideo.js +1 -1
  17. package/dist/adlooxAnalyticsAdapter.js +1 -1
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/adomikAnalyticsAdapter.js +1 -1
  20. package/dist/adprimeBidAdapter.js +1 -1
  21. package/dist/adqueryBidAdapter.js +1 -1
  22. package/dist/adrelevantisBidAdapter.js +1 -1
  23. package/dist/adtrgtmeBidAdapter.js +1 -1
  24. package/dist/adtrueBidAdapter.js +1 -1
  25. package/dist/aduptechBidAdapter.js +1 -1
  26. package/dist/advangelistsBidAdapter.js +1 -1
  27. package/dist/adxcgAnalyticsAdapter.js +1 -1
  28. package/dist/adxcgBidAdapter.js +1 -1
  29. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  30. package/dist/adyoulikeBidAdapter.js +1 -1
  31. package/dist/afpBidAdapter.js +1 -1
  32. package/dist/aidemBidAdapter.js +1 -1
  33. package/dist/airgridRtdProvider.js +1 -1
  34. package/dist/ajaBidAdapter.js +1 -1
  35. package/dist/amxBidAdapter.js +1 -1
  36. package/dist/amxIdSystem.js +1 -1
  37. package/dist/analyticsAdapter.js +1 -1
  38. package/dist/apacdexBidAdapter.js +1 -1
  39. package/dist/appierAnalyticsAdapter.js +1 -1
  40. package/dist/appnexusBidAdapter.js +1 -1
  41. package/dist/appnexusKeywords.js +1 -0
  42. package/dist/asoBidAdapter.js +1 -1
  43. package/dist/astraoneBidAdapter.js +1 -1
  44. package/dist/atsAnalyticsAdapter.js +1 -1
  45. package/dist/audiencerunBidAdapter.js +1 -1
  46. package/dist/automatadBidAdapter.js +1 -1
  47. package/dist/axonixBidAdapter.js +1 -1
  48. package/dist/beachfrontBidAdapter.js +1 -1
  49. package/dist/beopBidAdapter.js +1 -1
  50. package/dist/betweenBidAdapter.js +1 -1
  51. package/dist/bidViewability.js +1 -1
  52. package/dist/bidglassBidAdapter.js +1 -1
  53. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  54. package/dist/big-richmediaBidAdapter.js +1 -1
  55. package/dist/bizzclickBidAdapter.js +1 -1
  56. package/dist/bluebillywigBidAdapter.js +1 -1
  57. package/dist/braveBidAdapter.js +1 -1
  58. package/dist/bridgewellBidAdapter.js +1 -1
  59. package/dist/brightMountainMediaBidAdapter.js +1 -1
  60. package/dist/browsiBidAdapter.js +1 -1
  61. package/dist/byDataAnalyticsAdapter.js +1 -1
  62. package/dist/cadentApertureMXBidAdapter.js +1 -0
  63. package/dist/carodaBidAdapter.js +1 -1
  64. package/dist/categoryTranslationMapping.js +1 -0
  65. package/dist/ccxBidAdapter.js +1 -1
  66. package/dist/chtnwBidAdapter.js +1 -1
  67. package/dist/cleanmedianetBidAdapter.js +1 -1
  68. package/dist/codefuelBidAdapter.js +1 -1
  69. package/dist/colossussspBidAdapter.js +1 -1
  70. package/dist/concertAnalyticsAdapter.js +1 -1
  71. package/dist/concertBidAdapter.js +1 -1
  72. package/dist/connectIdSystem.js +1 -1
  73. package/dist/connectadBidAdapter.js +1 -1
  74. package/dist/consentManagement.js +1 -1
  75. package/dist/consentManagementGpp.js +1 -1
  76. package/dist/consentManagementUsp.js +1 -1
  77. package/dist/consumableBidAdapter.js +1 -1
  78. package/dist/conversantAnalyticsAdapter.js +1 -1
  79. package/dist/conversantBidAdapter.js +1 -1
  80. package/dist/craftBidAdapter.js +1 -1
  81. package/dist/criteoBidAdapter.js +1 -1
  82. package/dist/criteoIdSystem.js +1 -1
  83. package/dist/currency.js +1 -1
  84. package/dist/cwireBidAdapter.js +1 -1
  85. package/dist/dailyhuntBidAdapter.js +1 -1
  86. package/dist/datablocksAnalyticsAdapter.js +1 -1
  87. package/dist/datablocksBidAdapter.js +1 -1
  88. package/dist/datawrkzBidAdapter.js +1 -1
  89. package/dist/debugging-standalone.js +1 -1
  90. package/dist/debugging.js +1 -1
  91. package/dist/deltaprojectsBidAdapter.js +1 -1
  92. package/dist/dependencies.json +58 -14
  93. package/dist/dfpAdServerVideo.js +1 -1
  94. package/dist/dianomiBidAdapter.js +1 -1
  95. package/dist/displayioBidAdapter.js +1 -1
  96. package/dist/dspxBidAdapter.js +1 -1
  97. package/dist/ebdrBidAdapter.js +1 -1
  98. package/dist/eplanningAnalyticsAdapter.js +1 -1
  99. package/dist/eplanningBidAdapter.js +1 -1
  100. package/dist/etargetBidAdapter.js +1 -1
  101. package/dist/euidIdSystem.js +1 -1
  102. package/dist/feedadBidAdapter.js +1 -1
  103. package/dist/finativeBidAdapter.js +1 -1
  104. package/dist/fintezaAnalyticsAdapter.js +1 -1
  105. package/dist/fluctBidAdapter.js +1 -1
  106. package/dist/freewheel-sspBidAdapter.js +1 -1
  107. package/dist/ftrackIdSystem.js +1 -1
  108. package/dist/gamoshiBidAdapter.js +1 -1
  109. package/dist/gdprEnforcement.js +1 -1
  110. package/dist/genericAnalyticsAdapter.js +1 -1
  111. package/dist/gmosspBidAdapter.js +1 -1
  112. package/dist/gnetBidAdapter.js +1 -1
  113. package/dist/goldbachBidAdapter.js +1 -1
  114. package/dist/gothamadsBidAdapter.js +1 -1
  115. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  116. package/dist/greenbidsRtdProvider.js +1 -1
  117. package/dist/gridBidAdapter.js +1 -1
  118. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  119. package/dist/gumgumBidAdapter.js +1 -1
  120. package/dist/h12mediaBidAdapter.js +1 -1
  121. package/dist/hadronAnalyticsAdapter.js +1 -1
  122. package/dist/holidBidAdapter.js +1 -1
  123. package/dist/hybridBidAdapter.js +1 -1
  124. package/dist/hypelabBidAdapter.js +1 -0
  125. package/dist/id5AnalyticsAdapter.js +1 -1
  126. package/dist/id5IdSystem.js +1 -1
  127. package/dist/imdsBidAdapter.js +1 -0
  128. package/dist/impactifyBidAdapter.js +1 -1
  129. package/dist/improvedigitalBidAdapter.js +1 -1
  130. package/dist/insticatorBidAdapter.js +1 -1
  131. package/dist/interactiveOffersBidAdapter.js +1 -1
  132. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  133. package/dist/ixBidAdapter.js +1 -1
  134. package/dist/justpremiumBidAdapter.js +1 -1
  135. package/dist/kargoAnalyticsAdapter.js +1 -1
  136. package/dist/kargoBidAdapter.js +1 -1
  137. package/dist/keywords.js +1 -0
  138. package/dist/kinessoIdSystem.js +1 -1
  139. package/dist/koblerBidAdapter.js +1 -1
  140. package/dist/konduitAnalyticsAdapter.js +1 -1
  141. package/dist/kueezBidAdapter.js +1 -1
  142. package/dist/kueezRtbBidAdapter.js +1 -1
  143. package/dist/kulturemediaBidAdapter.js +1 -1
  144. package/dist/lassoBidAdapter.js +1 -1
  145. package/dist/lifestreetBidAdapter.js +1 -1
  146. package/dist/limelightDigitalBidAdapter.js +1 -1
  147. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  148. package/dist/liveIntentIdSystem.js +1 -1
  149. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  150. package/dist/livewrappedBidAdapter.js +1 -1
  151. package/dist/logicadBidAdapter.js +1 -1
  152. package/dist/loglyliftBidAdapter.js +1 -1
  153. package/dist/lotamePanoramaIdSystem.js +1 -1
  154. package/dist/luponmediaBidAdapter.js +1 -1
  155. package/dist/magniteAnalyticsAdapter.js +1 -1
  156. package/dist/malltvAnalyticsAdapter.js +1 -1
  157. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  158. package/dist/marsmediaBidAdapter.js +1 -1
  159. package/dist/mediaforceBidAdapter.js +1 -1
  160. package/dist/mediafuseBidAdapter.js +1 -1
  161. package/dist/mediakeysBidAdapter.js +1 -1
  162. package/dist/medianetAnalyticsAdapter.js +1 -1
  163. package/dist/medianetBidAdapter.js +1 -1
  164. package/dist/mediasniperBidAdapter.js +1 -1
  165. package/dist/mediasquareBidAdapter.js +1 -1
  166. package/dist/mgidBidAdapter.js +1 -1
  167. package/dist/microadBidAdapter.js +1 -1
  168. package/dist/minutemediaBidAdapter.js +1 -1
  169. package/dist/minutemediaplusBidAdapter.js +1 -1
  170. package/dist/newspassidBidAdapter.js +1 -1
  171. package/dist/nextMillenniumBidAdapter.js +1 -1
  172. package/dist/nexx360BidAdapter.js +1 -1
  173. package/dist/not-for-prod/prebid.js +293 -323
  174. package/dist/objectGuard.js +1 -1
  175. package/dist/oguryBidAdapter.js +1 -1
  176. package/dist/onetagBidAdapter.js +1 -1
  177. package/dist/ooloAnalyticsAdapter.js +1 -1
  178. package/dist/operaadsBidAdapter.js +1 -1
  179. package/dist/optidigitalBidAdapter.js +1 -1
  180. package/dist/optimonAnalyticsAdapter.js +1 -1
  181. package/dist/orbidderBidAdapter.js +1 -1
  182. package/dist/ortbConverter.js +1 -1
  183. package/dist/otmBidAdapter.js +1 -1
  184. package/dist/outbrainBidAdapter.js +1 -1
  185. package/dist/oxxionAnalyticsAdapter.js +1 -1
  186. package/dist/oxxionRtdProvider.js +1 -1
  187. package/dist/ozoneBidAdapter.js +1 -1
  188. package/dist/padsquadBidAdapter.js +1 -1
  189. package/dist/parrableIdSystem.js +1 -1
  190. package/dist/pbsExtensions.js +1 -1
  191. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  192. package/dist/pixfutureBidAdapter.js +1 -1
  193. package/dist/prebid-core.js +2 -2
  194. package/dist/prebidServerBidAdapter.js +1 -1
  195. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  196. package/dist/priceFloors.js +1 -1
  197. package/dist/prismaBidAdapter.js +1 -1
  198. package/dist/proxistoreBidAdapter.js +1 -1
  199. package/dist/pubgeniusBidAdapter.js +1 -1
  200. package/dist/publinkIdSystem.js +1 -1
  201. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  202. package/dist/pubmaticBidAdapter.js +1 -1
  203. package/dist/pubperfAnalyticsAdapter.js +1 -1
  204. package/dist/pubstackAnalyticsAdapter.js +1 -1
  205. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  206. package/dist/pubwiseBidAdapter.js +1 -1
  207. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  208. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  209. package/dist/pxyzBidAdapter.js +1 -1
  210. package/dist/quantcastBidAdapter.js +1 -1
  211. package/dist/quantcastIdSystem.js +1 -1
  212. package/dist/rasBidAdapter.js +1 -1
  213. package/dist/readpeakBidAdapter.js +1 -1
  214. package/dist/relaidoBidAdapter.js +1 -1
  215. package/dist/relevantAnalyticsAdapter.js +1 -1
  216. package/dist/retailspotBidAdapter.js +1 -1
  217. package/dist/revcontentBidAdapter.js +1 -1
  218. package/dist/rhythmoneBidAdapter.js +1 -1
  219. package/dist/richaudienceBidAdapter.js +1 -1
  220. package/dist/riseBidAdapter.js +1 -1
  221. package/dist/rivrAnalyticsAdapter.js +1 -1
  222. package/dist/roxotAnalyticsAdapter.js +1 -1
  223. package/dist/rtbhouseBidAdapter.js +1 -1
  224. package/dist/rtdModule.js +1 -1
  225. package/dist/rubiconBidAdapter.js +1 -1
  226. package/dist/s2sTesting.js +1 -1
  227. package/dist/saambaaBidAdapter.js +1 -1
  228. package/dist/scaleableAnalyticsAdapter.js +1 -1
  229. package/dist/schain.js +1 -1
  230. package/dist/seedingAllianceBidAdapter.js +1 -1
  231. package/dist/seedtagBidAdapter.js +1 -1
  232. package/dist/sharedIdSystem.js +1 -1
  233. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  234. package/dist/sharethroughBidAdapter.js +1 -1
  235. package/dist/shinezBidAdapter.js +1 -1
  236. package/dist/showheroes-bsBidAdapter.js +1 -1
  237. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  238. package/dist/sizeMapping.js +1 -0
  239. package/dist/slimcutBidAdapter.js +1 -1
  240. package/dist/smaatoBidAdapter.js +1 -1
  241. package/dist/smartadserverBidAdapter.js +1 -1
  242. package/dist/smartxBidAdapter.js +1 -1
  243. package/dist/smartytechBidAdapter.js +1 -1
  244. package/dist/smilewantedBidAdapter.js +1 -1
  245. package/dist/sonobiAnalyticsAdapter.js +1 -1
  246. package/dist/sonobiBidAdapter.js +1 -1
  247. package/dist/sovrnAnalyticsAdapter.js +1 -1
  248. package/dist/sovrnBidAdapter.js +1 -1
  249. package/dist/sspBCBidAdapter.js +1 -1
  250. package/dist/staqAnalyticsAdapter.js +1 -1
  251. package/dist/stvBidAdapter.js +1 -1
  252. package/dist/sublimeBidAdapter.js +1 -1
  253. package/dist/taboolaBidAdapter.js +1 -1
  254. package/dist/tapadIdSystem.js +1 -1
  255. package/dist/tappxBidAdapter.js +1 -1
  256. package/dist/targetVideoBidAdapter.js +1 -1
  257. package/dist/teadsBidAdapter.js +1 -1
  258. package/dist/teadsIdSystem.js +1 -1
  259. package/dist/telariaBidAdapter.js +1 -1
  260. package/dist/terceptAnalyticsAdapter.js +1 -1
  261. package/dist/theAdxBidAdapter.js +1 -1
  262. package/dist/topicsFpdModule.js +1 -1
  263. package/dist/trionBidAdapter.js +1 -1
  264. package/dist/tripleliftBidAdapter.js +1 -1
  265. package/dist/ttdBidAdapter.js +1 -1
  266. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  267. package/dist/uid2IdSystem.js +1 -1
  268. package/dist/underdogmediaBidAdapter.js +1 -1
  269. package/dist/undertoneBidAdapter.js +1 -1
  270. package/dist/unicornBidAdapter.js +1 -1
  271. package/dist/unrulyBidAdapter.js +1 -1
  272. package/dist/userId.js +1 -1
  273. package/dist/utiqSystem.js +1 -0
  274. package/dist/vibrantmediaBidAdapter.js +1 -1
  275. package/dist/vidazooBidAdapter.js +1 -1
  276. package/dist/videobyteBidAdapter.js +1 -1
  277. package/dist/videojsVideoProvider.js +1 -1
  278. package/dist/videoreachBidAdapter.js +1 -1
  279. package/dist/visxBidAdapter.js +1 -1
  280. package/dist/vrtcalBidAdapter.js +1 -1
  281. package/dist/vuukleBidAdapter.js +1 -1
  282. package/dist/weboramaRtdProvider.js +1 -1
  283. package/dist/widespaceBidAdapter.js +1 -1
  284. package/dist/winrBidAdapter.js +1 -1
  285. package/dist/xeBidAdapter.js +1 -1
  286. package/dist/yahoosspBidAdapter.js +1 -1
  287. package/dist/yieldliftBidAdapter.js +1 -1
  288. package/dist/yieldmoBidAdapter.js +1 -1
  289. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  290. package/dist/yieldoneBidAdapter.js +1 -1
  291. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  292. package/dist/zetaBidAdapter.js +1 -1
  293. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  294. package/dist/zeta_global_sspBidAdapter.js +1 -1
  295. package/libraries/analyticsAdapter/AnalyticsAdapter.js +1 -7
  296. package/libraries/appnexusKeywords/anKeywords.js +140 -0
  297. package/libraries/categoryTranslationMapping/index.js +100 -0
  298. package/libraries/keywords/keywords.js +31 -0
  299. package/libraries/objectGuard/objectGuard.js +2 -11
  300. package/libraries/ortbConverter/processors/default.js +3 -4
  301. package/modules/.submodules.json +1 -1
  302. package/modules/1plusXRtdProvider.js +4 -14
  303. package/modules/33acrossBidAdapter.js +11 -11
  304. package/modules/adWMGBidAdapter.js +2 -1
  305. package/modules/adagioBidAdapter.js +18 -30
  306. package/modules/adbookpspBidAdapter.js +1 -1
  307. package/modules/addefendBidAdapter.js +1 -0
  308. package/modules/adfBidAdapter.js +3 -3
  309. package/modules/adgenerationBidAdapter.js +1 -1
  310. package/modules/adhashBidAdapter.js +56 -34
  311. package/modules/adkernelAdnBidAdapter.js +5 -6
  312. package/modules/adkernelBidAdapter.js +5 -5
  313. package/modules/adprimeBidAdapter.js +2 -1
  314. package/modules/adqueryBidAdapter.js +1 -0
  315. package/modules/adrelevantisBidAdapter.js +3 -24
  316. package/modules/adtrueBidAdapter.js +2 -2
  317. package/modules/aduptechBidAdapter.js +2 -1
  318. package/modules/advangelistsBidAdapter.js +0 -1
  319. package/modules/adxcgBidAdapter.js +1 -1
  320. package/modules/adyoulikeBidAdapter.js +1 -1
  321. package/modules/afpBidAdapter.js +2 -2
  322. package/modules/aidemBidAdapter.js +16 -3
  323. package/modules/airgridRtdProvider.js +24 -53
  324. package/modules/ajaBidAdapter.js +1 -1
  325. package/modules/alkimiBidAdapter.js +2 -1
  326. package/modules/amxBidAdapter.js +1 -0
  327. package/modules/apacdexBidAdapter.js +3 -3
  328. package/modules/appnexusBidAdapter.js +16 -114
  329. package/modules/apstreamBidAdapter.js +1 -0
  330. package/modules/asoBidAdapter.js +1 -1
  331. package/modules/astraoneBidAdapter.js +1 -1
  332. package/modules/audiencerunBidAdapter.js +2 -1
  333. package/modules/automatadBidAdapter.js +5 -5
  334. package/modules/beachfrontBidAdapter.js +0 -1
  335. package/modules/beopBidAdapter.js +20 -17
  336. package/modules/betweenBidAdapter.js +2 -1
  337. package/modules/bizzclickBidAdapter.js +9 -6
  338. package/modules/bliinkBidAdapter.js +1 -0
  339. package/modules/bluebillywigBidAdapter.js +2 -2
  340. package/modules/braveBidAdapter.js +9 -7
  341. package/modules/browsiBidAdapter.js +3 -3
  342. package/modules/{emx_digitalBidAdapter.js → cadentApertureMXBidAdapter.js} +61 -56
  343. package/modules/{emx_digitalBidAdapter.md → cadentApertureMXBidAdapter.md} +6 -6
  344. package/modules/carodaBidAdapter.js +1 -0
  345. package/modules/ccxBidAdapter.js +1 -1
  346. package/modules/cleanmedianetBidAdapter.js +3 -3
  347. package/modules/codefuelBidAdapter.js +1 -1
  348. package/modules/colossussspBidAdapter.js +1 -1
  349. package/modules/concertBidAdapter.js +1 -1
  350. package/modules/connectadBidAdapter.js +1 -0
  351. package/modules/conversantAnalyticsAdapter.js +2 -0
  352. package/modules/conversantBidAdapter.js +22 -6
  353. package/modules/craftBidAdapter.js +6 -28
  354. package/modules/criteoBidAdapter.js +12 -9
  355. package/modules/currency.js +3 -3
  356. package/modules/dailyhuntBidAdapter.js +2 -2
  357. package/modules/datablocksBidAdapter.js +10 -8
  358. package/modules/datawrkzBidAdapter.js +0 -6
  359. package/modules/deltaprojectsBidAdapter.js +12 -3
  360. package/modules/dianomiBidAdapter.js +1 -1
  361. package/modules/discoveryBidAdapter.js +1 -0
  362. package/modules/displayioBidAdapter.js +2 -1
  363. package/modules/dspxBidAdapter.js +1 -0
  364. package/modules/ebdrBidAdapter.js +3 -2
  365. package/modules/etargetBidAdapter.js +1 -2
  366. package/modules/feedadBidAdapter.js +1 -1
  367. package/modules/finativeBidAdapter.js +8 -8
  368. package/modules/fluctBidAdapter.js +1 -2
  369. package/modules/gamoshiBidAdapter.js +3 -3
  370. package/modules/gdprEnforcement.js +0 -15
  371. package/modules/genericAnalyticsAdapter.js +0 -5
  372. package/modules/glomexBidAdapter.js +1 -0
  373. package/modules/gmosspBidAdapter.js +1 -1
  374. package/modules/gnetBidAdapter.js +1 -1
  375. package/modules/goldbachBidAdapter.js +7 -45
  376. package/modules/gothamadsBidAdapter.js +4 -3
  377. package/modules/gridBidAdapter.js +20 -421
  378. package/modules/gumgumBidAdapter.js +1 -2
  379. package/modules/h12mediaBidAdapter.js +1 -1
  380. package/modules/holidBidAdapter.js +8 -13
  381. package/modules/hybridBidAdapter.js +2 -2
  382. package/modules/hypelabBidAdapter.js +153 -0
  383. package/modules/hypelabBidAdapter.md +38 -0
  384. package/modules/{synacormediaBidAdapter.js → imdsBidAdapter.js} +11 -8
  385. package/modules/{synacormediaBidAdapter.md → imdsBidAdapter.md} +5 -5
  386. package/modules/impactifyBidAdapter.js +6 -6
  387. package/modules/improvedigitalBidAdapter.js +1 -2
  388. package/modules/innityBidAdapter.js +1 -0
  389. package/modules/insticatorBidAdapter.js +1 -1
  390. package/modules/interactiveOffersBidAdapter.js +5 -4
  391. package/modules/iqmBidAdapter.js +1 -0
  392. package/modules/ixBidAdapter.js +74 -75
  393. package/modules/jixieBidAdapter.js +1 -0
  394. package/modules/kargoBidAdapter.js +1 -1
  395. package/modules/koblerBidAdapter.js +2 -1
  396. package/modules/kueezBidAdapter.js +1 -1
  397. package/modules/kueezRtbBidAdapter.js +1 -0
  398. package/modules/kulturemediaBidAdapter.js +7 -7
  399. package/modules/lassoBidAdapter.js +2 -1
  400. package/modules/limelightDigitalBidAdapter.js +1 -1
  401. package/modules/livewrappedBidAdapter.js +2 -2
  402. package/modules/logicadBidAdapter.js +2 -1
  403. package/modules/loglyliftBidAdapter.js +2 -1
  404. package/modules/luponmediaBidAdapter.js +16 -4
  405. package/modules/magniteAnalyticsAdapter.js +61 -72
  406. package/modules/malltvBidAdapter.js +1 -0
  407. package/modules/mediaforceBidAdapter.js +2 -1
  408. package/modules/mediafuseBidAdapter.js +45 -62
  409. package/modules/mediagoBidAdapter.js +1 -0
  410. package/modules/mediakeysBidAdapter.js +3 -5
  411. package/modules/medianetBidAdapter.js +2 -1
  412. package/modules/mediasniperBidAdapter.js +1 -2
  413. package/modules/mediasquareBidAdapter.js +2 -1
  414. package/modules/microadBidAdapter.js +1 -9
  415. package/modules/minutemediaBidAdapter.js +2 -2
  416. package/modules/minutemediaplusBidAdapter.js +3 -2
  417. package/modules/newspassidBidAdapter.js +6 -4
  418. package/modules/nextMillenniumBidAdapter.js +10 -9
  419. package/modules/oguryBidAdapter.js +5 -5
  420. package/modules/onetagBidAdapter.js +2 -1
  421. package/modules/operaadsBidAdapter.js +2 -2
  422. package/modules/optidigitalBidAdapter.js +2 -2
  423. package/modules/orbidderBidAdapter.js +2 -1
  424. package/modules/otmBidAdapter.js +2 -2
  425. package/modules/outbrainBidAdapter.js +9 -11
  426. package/modules/oxxionRtdProvider.js +7 -29
  427. package/modules/ozoneBidAdapter.js +2 -1
  428. package/modules/padsquadBidAdapter.js +2 -2
  429. package/modules/pixfutureBidAdapter.js +12 -36
  430. package/modules/prebidServerBidAdapter/index.js +1 -3
  431. package/modules/prebidServerBidAdapter/ortbConverter.js +34 -5
  432. package/modules/priceFloors.js +7 -7
  433. package/modules/prismaBidAdapter.js +4 -3
  434. package/modules/proxistoreBidAdapter.js +2 -1
  435. package/modules/pubgeniusBidAdapter.js +5 -5
  436. package/modules/pubmaticAnalyticsAdapter.js +31 -12
  437. package/modules/pubmaticBidAdapter.js +6 -4
  438. package/modules/pubwiseBidAdapter.js +6 -5
  439. package/modules/pxyzBidAdapter.js +4 -4
  440. package/modules/rasBidAdapter.js +4 -2
  441. package/modules/readpeakBidAdapter.js +1 -1
  442. package/modules/relaidoBidAdapter.js +2 -1
  443. package/modules/resetdigitalBidAdapter.js +1 -0
  444. package/modules/revcontentBidAdapter.js +6 -7
  445. package/modules/rhythmoneBidAdapter.js +0 -2
  446. package/modules/richaudienceBidAdapter.js +6 -4
  447. package/modules/riseBidAdapter.js +1 -1
  448. package/modules/rtbhouseBidAdapter.js +5 -5
  449. package/modules/rtbsapeBidAdapter.js +1 -0
  450. package/modules/rubiconBidAdapter.js +8 -11
  451. package/modules/saambaaBidAdapter.js +0 -1
  452. package/modules/seedingAllianceBidAdapter.js +6 -7
  453. package/modules/seedtagBidAdapter.js +1 -1
  454. package/modules/sharethroughBidAdapter.js +1 -1
  455. package/modules/shinezBidAdapter.js +435 -435
  456. package/modules/showheroes-bsBidAdapter.js +1 -1
  457. package/{src → modules}/sizeMapping.js +46 -32
  458. package/modules/slimcutBidAdapter.js +2 -2
  459. package/modules/smaatoBidAdapter.js +16 -3
  460. package/modules/smartadserverBidAdapter.js +1 -1
  461. package/modules/smarticoBidAdapter.js +1 -0
  462. package/modules/smartytechBidAdapter.js +0 -1
  463. package/modules/smilewantedBidAdapter.js +2 -2
  464. package/modules/sonobiBidAdapter.js +2 -1
  465. package/modules/sspBCBidAdapter.js +1 -1
  466. package/modules/stroeerCoreBidAdapter.js +1 -0
  467. package/modules/sublimeBidAdapter.js +1 -0
  468. package/modules/taboolaBidAdapter.js +3 -3
  469. package/modules/talkadsBidAdapter.js +1 -0
  470. package/modules/tappxBidAdapter.js +1 -1
  471. package/modules/teadsBidAdapter.js +1 -2
  472. package/modules/telariaBidAdapter.js +1 -1
  473. package/modules/theAdxBidAdapter.js +1 -1
  474. package/modules/topicsFpdModule.js +4 -1
  475. package/modules/tpmnBidAdapter.js +1 -0
  476. package/modules/truereachBidAdapter.js +1 -0
  477. package/modules/ttdBidAdapter.js +3 -3
  478. package/modules/underdogmediaBidAdapter.js +0 -1
  479. package/modules/unicornBidAdapter.js +1 -1
  480. package/modules/unrulyBidAdapter.js +1 -1
  481. package/modules/userId/eids.js +3 -3
  482. package/modules/userId/eids.md +1 -1
  483. package/modules/userId/index.js +2 -19
  484. package/modules/userId/userId.md +12 -10
  485. package/modules/utiqSystem.js +129 -0
  486. package/modules/{trustpidSystem.md → utiqSystem.md} +7 -7
  487. package/modules/vdoaiBidAdapter.js +1 -0
  488. package/modules/vibrantmediaBidAdapter.js +1 -1
  489. package/modules/vidazooBidAdapter.js +3 -2
  490. package/modules/videobyteBidAdapter.js +0 -1
  491. package/modules/videoheroesBidAdapter.js +2 -0
  492. package/modules/videojsVideoProvider.js +2 -0
  493. package/modules/videoreachBidAdapter.js +2 -1
  494. package/modules/vlybyBidAdapter.js +1 -0
  495. package/modules/voxBidAdapter.js +2 -0
  496. package/modules/vrtcalBidAdapter.js +6 -1
  497. package/modules/winrBidAdapter.js +4 -25
  498. package/modules/xeBidAdapter.js +2 -1
  499. package/modules/yieldliftBidAdapter.js +2 -2
  500. package/modules/yieldmoBidAdapter.js +1 -0
  501. package/modules/yieldoneBidAdapter.js +1 -1
  502. package/modules/zetaBidAdapter.js +4 -9
  503. package/modules/zeta_global_sspBidAdapter.js +1 -1
  504. package/package.json +1 -1
  505. package/src/activities/activities.js +5 -0
  506. package/src/activities/redactor.js +36 -8
  507. package/src/adapterManager.js +31 -20
  508. package/src/adapters/bidderFactory.js +41 -91
  509. package/src/auction.js +5 -21
  510. package/src/constants.json +1 -2
  511. package/src/utils.js +2 -34
  512. package/test/fixtures/fixtures.js +0 -7
  513. package/test/pages/banner.html +1 -0
  514. package/test/pages/bidderSettings.html +1 -0
  515. package/test/pages/consent_mgt_gdpr.html +1 -0
  516. package/test/pages/currency.html +1 -0
  517. package/test/pages/instream.html +1 -0
  518. package/test/pages/multiple_bidders.html +1 -1
  519. package/test/pages/native.html +1 -0
  520. package/test/pages/outstream.html +4 -1
  521. package/test/spec/activities/redactor_spec.js +10 -2
  522. package/test/spec/appnexusKeywords_spec.js +70 -0
  523. package/test/spec/auctionmanager_spec.js +11 -22
  524. package/test/spec/keywords_spec.js +102 -0
  525. package/test/spec/modules/1plusXRtdProvider_spec.js +17 -18
  526. package/test/spec/modules/33acrossBidAdapter_spec.js +49 -73
  527. package/test/spec/modules/adagioBidAdapter_spec.js +15 -24
  528. package/test/spec/modules/adbookpspBidAdapter_spec.js +5 -0
  529. package/test/spec/modules/adfBidAdapter_spec.js +4 -1
  530. package/test/spec/modules/adhashBidAdapter_spec.js +18 -2
  531. package/test/spec/modules/adkernelAdnBidAdapter_spec.js +1 -3
  532. package/test/spec/modules/adrelevantisBidAdapter_spec.js +0 -9
  533. package/test/spec/modules/adriverBidAdapter_spec.js +0 -9
  534. package/test/spec/modules/adtrueBidAdapter_spec.js +11 -7
  535. package/test/spec/modules/aduptechBidAdapter_spec.js +26 -8
  536. package/test/spec/modules/advangelistsBidAdapter_spec.js +0 -1
  537. package/test/spec/modules/adxcgBidAdapter_spec.js +4 -1
  538. package/test/spec/modules/adyoulikeBidAdapter_spec.js +50 -10
  539. package/test/spec/modules/afpBidAdapter_spec.js +5 -1
  540. package/test/spec/modules/aidemBidAdapter_spec.js +10 -2
  541. package/test/spec/modules/airgridRtdProvider_spec.js +9 -59
  542. package/test/spec/modules/apacdexBidAdapter_spec.js +2 -2
  543. package/test/spec/modules/appnexusBidAdapter_spec.js +100 -27
  544. package/test/spec/modules/astraoneBidAdapter_spec.js +5 -1
  545. package/test/spec/modules/beachfrontBidAdapter_spec.js +0 -1
  546. package/test/spec/modules/big-richmediaBidAdapter_spec.js +0 -10
  547. package/test/spec/modules/bluebillywigBidAdapter_spec.js +12 -10
  548. package/test/spec/modules/browsiBidAdapter_spec.js +6 -3
  549. package/test/spec/modules/{emx_digitalBidAdapter_spec.js → cadentApertureMXBidAdapter_spec.js} +16 -16
  550. package/test/spec/modules/ccxBidAdapter_spec.js +1 -1
  551. package/test/spec/modules/cleanmedianetBidAdapter_spec.js +2 -2
  552. package/test/spec/modules/codefuelBidAdapter_spec.js +10 -1
  553. package/test/spec/modules/colossussspBidAdapter_spec.js +1 -1
  554. package/test/spec/modules/concertBidAdapter_spec.js +5 -1
  555. package/test/spec/modules/conversantBidAdapter_spec.js +7 -2
  556. package/test/spec/modules/criteoBidAdapter_spec.js +78 -8
  557. package/test/spec/modules/currency_spec.js +12 -12
  558. package/test/spec/modules/datawrkzBidAdapter_spec.js +0 -4
  559. package/test/spec/modules/dianomiBidAdapter_spec.js +1 -1
  560. package/test/spec/modules/etargetBidAdapter_spec.js +35 -8
  561. package/test/spec/modules/euidIdSystem_spec.js +0 -7
  562. package/test/spec/modules/feedadBidAdapter_spec.js +5 -1
  563. package/test/spec/modules/finativeBidAdapter_spec.js +0 -12
  564. package/test/spec/modules/fluctBidAdapter_spec.js +0 -2
  565. package/test/spec/modules/gamoshiBidAdapter_spec.js +5 -2
  566. package/test/spec/modules/gmosspBidAdapter_spec.js +5 -1
  567. package/test/spec/modules/gnetBidAdapter_spec.js +5 -1
  568. package/test/spec/modules/goldbachBidAdapter_spec.js +0 -10
  569. package/test/spec/modules/gridBidAdapter_spec.js +42 -302
  570. package/test/spec/modules/hybridBidAdapter_spec.js +5 -1
  571. package/test/spec/modules/hypelabBidAdapter_spec.js +281 -0
  572. package/test/spec/modules/{synacormediaBidAdapter_spec.js → imdsBidAdapter_spec.js} +19 -19
  573. package/test/spec/modules/improvedigitalBidAdapter_spec.js +6 -1
  574. package/test/spec/modules/insticatorBidAdapter_spec.js +6 -2
  575. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +1 -1
  576. package/test/spec/modules/ivsBidAdapter_spec.js +0 -2
  577. package/test/spec/modules/ixBidAdapter_spec.js +8 -3
  578. package/test/spec/modules/kargoBidAdapter_spec.js +3 -3
  579. package/test/spec/modules/koblerBidAdapter_spec.js +13 -2
  580. package/test/spec/modules/kulturemediaBidAdapter_spec.js +0 -1
  581. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +21 -5
  582. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +1 -1
  583. package/test/spec/modules/livewrappedBidAdapter_spec.js +5 -6
  584. package/test/spec/modules/loglyliftBidAdapter_spec.js +10 -0
  585. package/test/spec/modules/luponmediaBidAdapter_spec.js +23 -2
  586. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +93 -1
  587. package/test/spec/modules/mediaforceBidAdapter_spec.js +11 -3
  588. package/test/spec/modules/mediafuseBidAdapter_spec.js +2 -6
  589. package/test/spec/modules/mediakeysBidAdapter_spec.js +6 -2
  590. package/test/spec/modules/medianetBidAdapter_spec.js +86 -17
  591. package/test/spec/modules/mediasniperBidAdapter_spec.js +1 -1
  592. package/test/spec/modules/mediasquareBidAdapter_spec.js +5 -5
  593. package/test/spec/modules/microadBidAdapter_spec.js +7 -3
  594. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +7 -3
  595. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -2
  596. package/test/spec/modules/nexx360BidAdapter_spec.js +0 -1
  597. package/test/spec/modules/oguryBidAdapter_spec.js +2 -1
  598. package/test/spec/modules/onetagBidAdapter_spec.js +5 -1
  599. package/test/spec/modules/openxBidAdapter_spec.js +1 -1
  600. package/test/spec/modules/operaadsBidAdapter_spec.js +5 -5
  601. package/test/spec/modules/optidigitalBidAdapter_spec.js +0 -2
  602. package/test/spec/modules/orbidderBidAdapter_spec.js +12 -4
  603. package/test/spec/modules/outbrainBidAdapter_spec.js +5 -0
  604. package/test/spec/modules/oxxionRtdProvider_spec.js +3 -2
  605. package/test/spec/modules/prebidServerBidAdapter_spec.js +114 -32
  606. package/test/spec/modules/priceFloors_spec.js +7 -25
  607. package/test/spec/modules/pubgeniusBidAdapter_spec.js +2 -1
  608. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +7 -0
  609. package/test/spec/modules/pubmaticBidAdapter_spec.js +41 -32
  610. package/test/spec/modules/pubwiseBidAdapter_spec.js +10 -6
  611. package/test/spec/modules/relaidoBidAdapter_spec.js +6 -2
  612. package/test/spec/modules/revcontentBidAdapter_spec.js +0 -10
  613. package/test/spec/modules/richaudienceBidAdapter_spec.js +5 -1
  614. package/test/spec/modules/rubiconBidAdapter_spec.js +26 -7
  615. package/test/spec/modules/scatteredBidAdapter_spec.js +0 -2
  616. package/test/spec/modules/seedingAllianceAdapter_spec.js +0 -13
  617. package/test/spec/modules/seedtagBidAdapter_spec.js +5 -1
  618. package/test/spec/modules/sharethroughBidAdapter_spec.js +6 -2
  619. package/test/spec/modules/sizeMapping_spec.js +342 -0
  620. package/test/spec/modules/slimcutBidAdapter_spec.js +0 -1
  621. package/test/spec/modules/smaatoBidAdapter_spec.js +3 -2
  622. package/test/spec/modules/smartadserverBidAdapter_spec.js +15 -3
  623. package/test/spec/modules/smilewantedBidAdapter_spec.js +25 -6
  624. package/test/spec/modules/sspBCBidAdapter_spec.js +4 -4
  625. package/test/spec/modules/taboolaBidAdapter_spec.js +10 -12
  626. package/test/spec/modules/teadsBidAdapter_spec.js +7 -0
  627. package/test/spec/modules/terceptAnalyticsAdapter_spec.js +0 -1
  628. package/test/spec/modules/ttdBidAdapter_spec.js +13 -5
  629. package/test/spec/modules/uid2IdSystem_spec.js +0 -10
  630. package/test/spec/modules/underdogmediaBidAdapter_spec.js +0 -1
  631. package/test/spec/modules/utiqSystem_spec.js +188 -0
  632. package/test/spec/modules/vidazooBidAdapter_spec.js +6 -2
  633. package/test/spec/modules/videobyteBidAdapter_spec.js +0 -1
  634. package/test/spec/modules/vrtcalBidAdapter_spec.js +9 -2
  635. package/test/spec/modules/winrBidAdapter_spec.js +0 -9
  636. package/test/spec/modules/xeBidAdapter_spec.js +6 -2
  637. package/test/spec/unit/core/adapterManager_spec.js +69 -115
  638. package/test/spec/unit/core/bidderFactory_spec.js +80 -152
  639. package/test/spec/unit/core/targeting_spec.js +0 -6
  640. package/test/spec/utils_spec.js +21 -90
  641. package/dist/aolBidAdapter.js +0 -1
  642. package/dist/captifyRtdProvider.js +0 -1
  643. package/dist/emx_digitalBidAdapter.js +0 -1
  644. package/dist/glimpseBidAdapter.js +0 -1
  645. package/dist/googleAnalyticsAdapter.js +0 -1
  646. package/dist/inmarBidAdapter.js +0 -1
  647. package/dist/inskinBidAdapter.js +0 -1
  648. package/dist/liveyieldAnalyticsAdapter.js +0 -1
  649. package/dist/mass.js +0 -1
  650. package/dist/openxAnalyticsAdapter.js +0 -1
  651. package/dist/openxOrtbBidAdapter.js +0 -1
  652. package/dist/pubCommonId.js +0 -1
  653. package/dist/realvuAnalyticsAdapter.js +0 -1
  654. package/dist/rubiconAnalyticsAdapter.js +0 -1
  655. package/dist/synacormediaBidAdapter.js +0 -1
  656. package/dist/trustpidSystem.js +0 -1
  657. package/dist/viewability.js +0 -1
  658. package/dist/zeusPrimeRtdProvider.js +0 -21
  659. package/integrationExamples/gpt/captifyRtdProvider_example.html +0 -167
  660. package/integrationExamples/mass/index.html +0 -132
  661. package/modules/aolBidAdapter.js +0 -462
  662. package/modules/aolBidAdapter.md +0 -46
  663. package/modules/captifyRtdProvider.js +0 -146
  664. package/modules/captifyRtdProvider.md +0 -68
  665. package/modules/conversantAnalyticsAdapter.md +0 -46
  666. package/modules/conversantBidAdapter.md +0 -46
  667. package/modules/glimpseBidAdapter.js +0 -198
  668. package/modules/glimpseBidAdapter.md +0 -37
  669. package/modules/googleAnalyticsAdapter.js +0 -298
  670. package/modules/googleAnalyticsAdapter.md +0 -38
  671. package/modules/inmarBidAdapter.js +0 -132
  672. package/modules/inmarBidAdapter.md +0 -44
  673. package/modules/inskinBidAdapter.js +0 -391
  674. package/modules/inskinBidAdapter.md +0 -31
  675. package/modules/liveyieldAnalyticsAdapter.js +0 -454
  676. package/modules/liveyieldAnalyticsAdapter.md +0 -45
  677. package/modules/mass.js +0 -184
  678. package/modules/mass.md +0 -137
  679. package/modules/openxAnalyticsAdapter.js +0 -27
  680. package/modules/openxAnalyticsAdapter.md +0 -135
  681. package/modules/openxOrtbBidAdapter.js +0 -238
  682. package/modules/openxOrtbBidAdapter.md +0 -108
  683. package/modules/pubCommonId.js +0 -303
  684. package/modules/pubCommonId.md +0 -37
  685. package/modules/realvuAnalyticsAdapter.js +0 -976
  686. package/modules/realvuAnalyticsAdapter.md +0 -9
  687. package/modules/rubiconAnalyticsAdapter.js +0 -938
  688. package/modules/trustpidSystem.js +0 -143
  689. package/modules/viewability.js +0 -9
  690. package/modules/zeusPrimeRtdProvider.js +0 -37
  691. package/modules/zeusPrimeRtdProvider.md +0 -63
  692. package/test/spec/modules/aolBidAdapter_spec.js +0 -890
  693. package/test/spec/modules/captifyRtdProvider_spec.js +0 -253
  694. package/test/spec/modules/glimpseBidAdapter_spec.js +0 -422
  695. package/test/spec/modules/googleAnalyticsAdapter_spec.js +0 -27
  696. package/test/spec/modules/inmarBidAdapter_spec.js +0 -242
  697. package/test/spec/modules/inskinBidAdapter_spec.js +0 -386
  698. package/test/spec/modules/liveyieldAnalyticsAdapter_spec.js +0 -704
  699. package/test/spec/modules/mass_spec.js +0 -141
  700. package/test/spec/modules/openxAnalyticsAdapter_spec.js +0 -21
  701. package/test/spec/modules/openxOrtbBidAdapter_spec.js +0 -1615
  702. package/test/spec/modules/pubCommonId_spec.js +0 -353
  703. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +0 -2540
  704. package/test/spec/modules/rubiconAnalyticsSchema.json +0 -494
  705. package/test/spec/modules/trustpidSystem_spec.js +0 -237
  706. package/test/spec/sizeMapping_spec.js +0 -341
@@ -1,2540 +0,0 @@
1
- import rubiconAnalyticsAdapter, {
2
- SEND_TIMEOUT,
3
- parseBidResponse,
4
- getHostNameFromReferer,
5
- storage,
6
- rubiConf,
7
- resetRubiConf
8
- } from 'modules/rubiconAnalyticsAdapter.js';
9
- import CONSTANTS from 'src/constants.json';
10
- import { config } from 'src/config.js';
11
- import { server } from 'test/mocks/xhr.js';
12
- import * as mockGpt from '../integration/faker/googletag.js';
13
- import {
14
- setConfig,
15
- addBidResponseHook,
16
- } from 'modules/currency.js';
17
-
18
- let Ajv = require('ajv');
19
- let schema = require('./rubiconAnalyticsSchema.json');
20
- let ajv = new Ajv({
21
- allErrors: true
22
- });
23
-
24
- let validator = ajv.compile(schema);
25
-
26
- function validate(message) {
27
- validator(message);
28
- expect(validator.errors).to.deep.equal(null);
29
- }
30
-
31
- let events = require('src/events.js');
32
- let utils = require('src/utils.js');
33
-
34
- const {
35
- EVENTS: {
36
- AUCTION_INIT,
37
- AUCTION_END,
38
- BID_REQUESTED,
39
- BID_RESPONSE,
40
- BIDDER_DONE,
41
- BID_WON,
42
- BID_TIMEOUT,
43
- SET_TARGETING,
44
- BILLABLE_EVENT
45
- }
46
- } = CONSTANTS;
47
-
48
- const BID = {
49
- 'bidder': 'rubicon',
50
- 'width': 640,
51
- 'height': 480,
52
- 'mediaType': 'video',
53
- 'statusMessage': 'Bid available',
54
- 'bidId': '2ecff0db240757',
55
- 'adId': 'fake_ad_id',
56
- 'source': 'client',
57
- 'requestId': '2ecff0db240757',
58
- 'currency': 'USD',
59
- 'creativeId': '3571560',
60
- 'cpm': 1.22752,
61
- 'ttl': 300,
62
- 'netRevenue': false,
63
- 'ad': '<html></html>',
64
- 'rubiconTargeting': {
65
- 'rpfl_elemid': '/19968336/header-bid-tag-0',
66
- 'rpfl_14062': '2_tier0100'
67
- },
68
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
69
- 'responseTimestamp': 1519149629415,
70
- 'requestTimestamp': 1519149628471,
71
- 'adUnitCode': '/19968336/header-bid-tag-0',
72
- 'timeToRespond': 944,
73
- 'pbLg': '1.00',
74
- 'pbMg': '1.20',
75
- 'pbHg': '1.22',
76
- 'pbAg': '1.20',
77
- 'pbDg': '1.22',
78
- 'pbCg': '',
79
- 'size': '640x480',
80
- 'adserverTargeting': {
81
- 'hb_bidder': 'rubicon',
82
- 'hb_adid': '2ecff0db240757',
83
- 'hb_pb': 1.20,
84
- 'hb_size': '640x480',
85
- 'hb_source': 'client'
86
- },
87
- getStatusCode() {
88
- return 1;
89
- }
90
- };
91
-
92
- const BID2 = Object.assign({}, BID, {
93
- adUnitCode: '/19968336/header-bid-tag1',
94
- bidId: '3bd4ebb1c900e2',
95
- adId: 'fake_ad_id',
96
- requestId: '3bd4ebb1c900e2',
97
- width: 728,
98
- height: 90,
99
- mediaType: 'banner',
100
- cpm: 1.52,
101
- source: 'server',
102
- seatBidId: 'aaaa-bbbb-cccc-dddd',
103
- rubiconTargeting: {
104
- 'rpfl_elemid': '/19968336/header-bid-tag1',
105
- 'rpfl_14062': '2_tier0100'
106
- },
107
- adserverTargeting: {
108
- 'hb_bidder': 'rubicon',
109
- 'hb_adid': '3bd4ebb1c900e2',
110
- 'hb_pb': '1.500',
111
- 'hb_size': '728x90',
112
- 'hb_source': 'server'
113
- }
114
- });
115
-
116
- const BID3 = Object.assign({}, BID, {
117
- adUnitCode: '/19968336/siderail-tag1',
118
- bidId: '5fg6hyy4r879f0',
119
- adId: 'fake_ad_id',
120
- requestId: '5fg6hyy4r879f0',
121
- width: 300,
122
- height: 250,
123
- mediaType: 'banner',
124
- cpm: 2.01,
125
- source: 'server',
126
- seatBidId: 'aaaa-bbbb-cccc-dddd',
127
- rubiconTargeting: {
128
- 'rpfl_elemid': '/19968336/siderail-tag1',
129
- 'rpfl_14062': '15_tier0200'
130
- },
131
- adserverTargeting: {
132
- 'hb_bidder': 'rubicon',
133
- 'hb_adid': '5fg6hyy4r879f0',
134
- 'hb_pb': '2.00',
135
- 'hb_size': '300x250',
136
- 'hb_source': 'server'
137
- }
138
- });
139
-
140
- const BID4 = Object.assign({}, BID, {
141
- adUnitCode: '/19968336/header-bid-tag1',
142
- bidId: '3bd4ebb1c900e2',
143
- adId: 'fake_ad_id',
144
- requestId: '3bd4ebb1c900e2',
145
- width: 728,
146
- height: 90,
147
- mediaType: 'banner',
148
- cpm: 1.52,
149
- source: 'server',
150
- pbsBidId: 'zzzz-yyyy-xxxx-wwww',
151
- seatBidId: 'aaaa-bbbb-cccc-dddd',
152
- rubiconTargeting: {
153
- 'rpfl_elemid': '/19968336/header-bid-tag1',
154
- 'rpfl_14062': '2_tier0100'
155
- },
156
- adserverTargeting: {
157
- 'hb_bidder': 'rubicon',
158
- 'hb_adid': '3bd4ebb1c900e2',
159
- 'hb_pb': '1.500',
160
- 'hb_size': '728x90',
161
- 'hb_source': 'server'
162
- }
163
- });
164
-
165
- const floorMinRequest = {
166
- 'bidder': 'rubicon',
167
- 'params': {
168
- 'accountId': '14062',
169
- 'siteId': '70608',
170
- 'zoneId': '335918',
171
- 'userId': '12346',
172
- 'keywords': ['a', 'b', 'c'],
173
- 'inventory': { 'rating': '4-star', 'prodtype': 'tech' },
174
- 'visitor': { 'ucat': 'new', 'lastsearch': 'iphone' },
175
- 'position': 'atf'
176
- },
177
- 'mediaTypes': {
178
- 'banner': {
179
- 'sizes': [[300, 250]]
180
- }
181
- },
182
- 'adUnitCode': '/19968336/siderail-tag1',
183
- 'transactionId': 'c435626g-9e3f-401a-bee1-d56aec29a1d4',
184
- 'sizes': [[300, 250]],
185
- 'bidId': '5fg6hyy4r879f0',
186
- 'bidderRequestId': '1be65d7958826a',
187
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
188
- };
189
-
190
- const MOCK = {
191
- SET_TARGETING: {
192
- [BID.adUnitCode]: BID.adserverTargeting,
193
- [BID2.adUnitCode]: BID2.adserverTargeting,
194
- [BID3.adUnitCode]: BID3.adserverTargeting
195
- },
196
- AUCTION_INIT: {
197
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
198
- 'timestamp': 1519767010567,
199
- 'auctionStatus': 'inProgress',
200
- 'adUnits': [{
201
- 'code': '/19968336/header-bid-tag1',
202
- 'sizes': [[640, 480]],
203
- 'bids': [{
204
- 'bidder': 'rubicon',
205
- 'params': {
206
- 'accountId': 1001, 'siteId': 113932, 'zoneId': 535512
207
- }
208
- }],
209
- 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014'
210
- }
211
- ],
212
- 'adUnitCodes': ['/19968336/header-bid-tag1'],
213
- 'bidderRequests': [{
214
- 'bidderCode': 'rubicon',
215
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
216
- 'bidderRequestId': '1be65d7958826a',
217
- 'bids': [{
218
- 'bidder': 'rubicon',
219
- 'params': {
220
- 'accountId': 1001, 'siteId': 113932, 'zoneId': 535512
221
- },
222
- 'mediaTypes': {
223
- 'banner': {
224
- 'sizes': [[640, 480]]
225
- }
226
- },
227
- 'adUnitCode': '/19968336/header-bid-tag1',
228
- 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
229
- 'sizes': [[640, 480]],
230
- 'bidId': '2ecff0db240757',
231
- 'bidderRequestId': '1be65d7958826a',
232
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
233
- 'src': 'client',
234
- 'bidRequestsCount': 1
235
- }
236
- ],
237
- 'timeout': 3000,
238
- 'refererInfo': {
239
- 'page': 'http://www.test.com/page.html', 'reachedTop': true, 'numIframes': 0, 'stack': ['http://www.test.com/page.html']
240
- }
241
- }
242
- ],
243
- 'bidsReceived': [],
244
- 'winningBids': [],
245
- 'timeout': 3000,
246
- 'config': {
247
- 'accountId': 1001, 'endpoint': '//localhost:9999/event'
248
- }
249
- },
250
- BID_REQUESTED: {
251
- 'bidderCode': 'rubicon',
252
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
253
- 'bidderRequestId': '1be65d7958826a',
254
- 'bids': [
255
- {
256
- 'bidder': 'rubicon',
257
- 'params': {
258
- 'accountId': '1001',
259
- 'siteId': '70608',
260
- 'zoneId': '335918',
261
- 'userId': '12346',
262
- 'keywords': ['a', 'b', 'c'],
263
- 'inventory': 'test',
264
- 'visitor': { 'ucat': 'new', 'lastsearch': 'iphone' },
265
- 'position': 'btf',
266
- 'video': {
267
- 'language': 'en',
268
- 'playerHeight': 480,
269
- 'playerWidth': 640,
270
- 'size_id': 203,
271
- 'skip': 1,
272
- 'skipdelay': 15,
273
- 'aeParams': {
274
- 'p_aso.video.ext.skip': '1',
275
- 'p_aso.video.ext.skipdelay': '15'
276
- }
277
- }
278
- },
279
- 'mediaTypes': {
280
- 'video': {
281
- 'context': 'instream',
282
- 'playerSize': [640, 480]
283
- }
284
- },
285
- 'adUnitCode': '/19968336/header-bid-tag-0',
286
- 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
287
- 'sizes': [[640, 480]],
288
- 'bidId': '2ecff0db240757',
289
- 'bidderRequestId': '1be65d7958826a',
290
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
291
- 'src': 'client'
292
- },
293
- {
294
- 'bidder': 'rubicon',
295
- 'params': {
296
- 'accountId': '14062',
297
- 'siteId': '70608',
298
- 'zoneId': '335918',
299
- 'userId': '12346',
300
- 'keywords': ['a', 'b', 'c'],
301
- 'inventory': { 'rating': '4-star', 'prodtype': 'tech' },
302
- 'visitor': { 'ucat': 'new', 'lastsearch': 'iphone' },
303
- 'position': 'atf'
304
- },
305
- 'mediaTypes': {
306
- 'banner': {
307
- 'sizes': [[1000, 300], [970, 250], [728, 90]]
308
- }
309
- },
310
- 'adUnitCode': '/19968336/header-bid-tag1',
311
- 'transactionId': 'c116413c-9e3f-401a-bee1-d56aec29a1d4',
312
- 'sizes': [[1000, 300], [970, 250], [728, 90]],
313
- 'bidId': '3bd4ebb1c900e2',
314
- 'bidderRequestId': '1be65d7958826a',
315
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
316
- 'src': 's2s'
317
- }
318
- ],
319
- 'auctionStart': 1519149536560,
320
- 'timeout': 5000,
321
- 'start': 1519149562216,
322
- 'refererInfo': {
323
- 'page': 'http://www.test.com/page.html', 'reachedTop': true, 'numIframes': 0, 'stack': ['http://www.test.com/page.html']
324
- }
325
- },
326
- BID_RESPONSE: [
327
- BID,
328
- BID2,
329
- BID3
330
- ],
331
- AUCTION_END: {
332
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
333
- },
334
- BID_WON: [
335
- Object.assign({}, BID, {
336
- 'status': 'rendered'
337
- }),
338
- Object.assign({}, BID2, {
339
- 'status': 'rendered'
340
- }),
341
- Object.assign({}, BID3, {
342
- 'status': 'rendered'
343
- })
344
- ],
345
- BIDDER_DONE: {
346
- 'bidderCode': 'rubicon',
347
- 'serverResponseTimeMs': 42,
348
- 'bids': [
349
- BID,
350
- Object.assign({}, BID2, {
351
- 'serverResponseTimeMs': 42,
352
- }),
353
- Object.assign({}, BID3, {
354
- 'serverResponseTimeMs': 55,
355
- })
356
- ]
357
- },
358
- BID_TIMEOUT: [
359
- {
360
- 'bidId': '2ecff0db240757',
361
- 'bidder': 'rubicon',
362
- 'adUnitCode': '/19968336/header-bid-tag-0',
363
- 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
364
- }
365
- ]
366
- };
367
-
368
- const STUBBED_UUID = '12345678-1234-1234-1234-123456789abc';
369
-
370
- const ANALYTICS_MESSAGE = {
371
- 'channel': 'web',
372
- 'integration': 'pbjs',
373
- 'version': '$prebid.version$',
374
- 'referrerUri': 'http://www.test.com/page.html',
375
- 'session': {
376
- 'expires': 1519788613781,
377
- 'id': STUBBED_UUID,
378
- 'start': 1519767013781
379
- },
380
- 'timestamps': {
381
- 'auctionEnded': 1519767013781,
382
- 'eventTime': 1519767013781,
383
- 'prebidLoaded': rubiconAnalyticsAdapter.MODULE_INITIALIZED_TIME
384
- },
385
- 'trigger': 'allBidWons',
386
- 'referrerHostname': 'www.test.com',
387
- 'auctions': [
388
- {
389
-
390
- 'auctionEnd': 1519767013781,
391
- 'auctionStart': 1519767010567,
392
- 'bidderOrder': ['rubicon'],
393
- 'requestId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
394
- 'clientTimeoutMillis': 3000,
395
- 'serverTimeoutMillis': 1000,
396
- 'accountId': 1001,
397
- 'samplingFactor': 1,
398
- 'adUnits': [
399
- {
400
- 'adUnitCode': '/19968336/header-bid-tag-0',
401
- 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
402
- 'videoAdFormat': 'outstream',
403
- 'mediaTypes': [
404
- 'video'
405
- ],
406
- 'dimensions': [
407
- {
408
- 'width': 640,
409
- 'height': 480
410
- }
411
- ],
412
- 'status': 'success',
413
- 'accountId': 1001,
414
- 'siteId': 70608,
415
- 'zoneId': 335918,
416
- 'adserverTargeting': {
417
- 'hb_bidder': 'rubicon',
418
- 'hb_adid': '2ecff0db240757',
419
- 'hb_pb': '1.200',
420
- 'hb_size': '640x480',
421
- 'hb_source': 'client'
422
- },
423
- 'bids': [
424
- {
425
- 'bidder': 'rubicon',
426
- 'bidId': '2ecff0db240757',
427
- 'status': 'success',
428
- 'source': 'client',
429
- 'clientLatencyMillis': 3214,
430
- 'params': {
431
- 'accountId': '1001',
432
- 'siteId': '70608',
433
- 'zoneId': '335918'
434
- },
435
- 'bidResponse': {
436
- 'bidPriceUSD': 1.22752,
437
- 'dimensions': {
438
- 'width': 640,
439
- 'height': 480
440
- },
441
- 'mediaType': 'video'
442
- }
443
- }
444
- ]
445
- },
446
- {
447
- 'adUnitCode': '/19968336/header-bid-tag1',
448
- 'transactionId': 'c116413c-9e3f-401a-bee1-d56aec29a1d4',
449
- 'mediaTypes': [
450
- 'banner'
451
- ],
452
- 'dimensions': [
453
- {
454
- 'width': 1000,
455
- 'height': 300
456
- },
457
- {
458
- 'width': 970,
459
- 'height': 250
460
- },
461
- {
462
- 'width': 728,
463
- 'height': 90
464
- }
465
- ],
466
- 'status': 'success',
467
- 'adserverTargeting': {
468
- 'hb_bidder': 'rubicon',
469
- 'hb_adid': '3bd4ebb1c900e2',
470
- 'hb_pb': '1.500',
471
- 'hb_size': '728x90',
472
- 'hb_source': 'server'
473
- },
474
- 'bids': [
475
- {
476
- 'bidder': 'rubicon',
477
- 'bidId': 'aaaa-bbbb-cccc-dddd',
478
- 'status': 'success',
479
- 'source': 'server',
480
- 'clientLatencyMillis': 3214,
481
- 'serverLatencyMillis': 42,
482
- 'params': {
483
- 'accountId': '14062',
484
- 'siteId': '70608',
485
- 'zoneId': '335918'
486
- },
487
- 'bidResponse': {
488
- 'bidPriceUSD': 1.52,
489
- 'dimensions': {
490
- 'width': 728,
491
- 'height': 90
492
- },
493
- 'mediaType': 'banner'
494
- }
495
- }
496
- ]
497
- }
498
- ]
499
- }
500
- ],
501
- 'bidsWon': [
502
- {
503
- 'bidder': 'rubicon',
504
- 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
505
- 'adUnitCode': '/19968336/header-bid-tag-0',
506
- 'bidId': '2ecff0db240757',
507
- 'status': 'success',
508
- 'source': 'client',
509
- 'clientLatencyMillis': 3214,
510
- 'samplingFactor': 1,
511
- 'accountId': 1001,
512
- 'siteId': 70608,
513
- 'zoneId': 335918,
514
- 'params': {
515
- 'accountId': '1001',
516
- 'siteId': '70608',
517
- 'zoneId': '335918'
518
- },
519
- 'videoAdFormat': 'outstream',
520
- 'mediaTypes': [
521
- 'video'
522
- ],
523
- 'adserverTargeting': {
524
- 'hb_bidder': 'rubicon',
525
- 'hb_adid': '2ecff0db240757',
526
- 'hb_pb': '1.200',
527
- 'hb_size': '640x480',
528
- 'hb_source': 'client'
529
- },
530
- 'bidResponse': {
531
- 'bidPriceUSD': 1.22752,
532
- 'dimensions': {
533
- 'width': 640,
534
- 'height': 480
535
- },
536
- 'mediaType': 'video'
537
- },
538
- 'bidwonStatus': 'success'
539
- },
540
- {
541
- 'bidder': 'rubicon',
542
- 'transactionId': 'c116413c-9e3f-401a-bee1-d56aec29a1d4',
543
- 'adUnitCode': '/19968336/header-bid-tag1',
544
- 'bidId': 'aaaa-bbbb-cccc-dddd',
545
- 'status': 'success',
546
- 'source': 'server',
547
- 'clientLatencyMillis': 3214,
548
- 'serverLatencyMillis': 42,
549
- 'samplingFactor': 1,
550
- 'accountId': 1001,
551
- 'params': {
552
- 'accountId': '14062',
553
- 'siteId': '70608',
554
- 'zoneId': '335918'
555
- },
556
- 'mediaTypes': [
557
- 'banner'
558
- ],
559
- 'adserverTargeting': {
560
- 'hb_bidder': 'rubicon',
561
- 'hb_adid': '3bd4ebb1c900e2',
562
- 'hb_pb': '1.500',
563
- 'hb_size': '728x90',
564
- 'hb_source': 'server'
565
- },
566
- 'bidResponse': {
567
- 'bidPriceUSD': 1.52,
568
- 'dimensions': {
569
- 'width': 728,
570
- 'height': 90
571
- },
572
- 'mediaType': 'banner'
573
- },
574
- 'bidwonStatus': 'success'
575
- }
576
- ],
577
- 'wrapper': {
578
- 'name': '10000_fakewrapper_test'
579
- }
580
- };
581
-
582
- function performStandardAuction(gptEvents, auctionId = MOCK.AUCTION_INIT.auctionId) {
583
- events.emit(AUCTION_INIT, { ...MOCK.AUCTION_INIT, auctionId });
584
- events.emit(BID_REQUESTED, { ...MOCK.BID_REQUESTED, auctionId });
585
- events.emit(BID_RESPONSE, { ...MOCK.BID_RESPONSE[0], auctionId });
586
- events.emit(BID_RESPONSE, { ...MOCK.BID_RESPONSE[1], auctionId });
587
- events.emit(BIDDER_DONE, { ...MOCK.BIDDER_DONE, auctionId });
588
- events.emit(AUCTION_END, { ...MOCK.AUCTION_END, auctionId });
589
-
590
- if (gptEvents && gptEvents.length) {
591
- gptEvents.forEach(gptEvent => mockGpt.emitEvent(gptEvent.eventName, gptEvent.params));
592
- }
593
-
594
- events.emit(SET_TARGETING, { ...MOCK.SET_TARGETING, auctionId });
595
- events.emit(BID_WON, { ...MOCK.BID_WON[0], auctionId });
596
- events.emit(BID_WON, { ...MOCK.BID_WON[1], auctionId });
597
- }
598
-
599
- describe('rubicon analytics adapter', function () {
600
- let sandbox;
601
- let clock;
602
- let getDataFromLocalStorageStub, setDataInLocalStorageStub, localStorageIsEnabledStub;
603
- beforeEach(function () {
604
- getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage');
605
- setDataInLocalStorageStub = sinon.stub(storage, 'setDataInLocalStorage');
606
- localStorageIsEnabledStub = sinon.stub(storage, 'localStorageIsEnabled');
607
- mockGpt.disable();
608
- sandbox = sinon.sandbox.create();
609
-
610
- localStorageIsEnabledStub.returns(true);
611
-
612
- sandbox.stub(events, 'getEvents').returns([]);
613
-
614
- sandbox.stub(utils, 'generateUUID').returns(STUBBED_UUID);
615
-
616
- clock = sandbox.useFakeTimers(1519767013781);
617
-
618
- rubiconAnalyticsAdapter.referrerHostname = '';
619
-
620
- config.setConfig({
621
- s2sConfig: {
622
- timeout: 1000,
623
- accountId: 10000,
624
- },
625
- rubicon: {
626
- wrapperName: '10000_fakewrapper_test'
627
- }
628
- })
629
- });
630
-
631
- afterEach(function () {
632
- sandbox.restore();
633
- config.resetConfig();
634
- mockGpt.enable();
635
- getDataFromLocalStorageStub.restore();
636
- setDataInLocalStorageStub.restore();
637
- localStorageIsEnabledStub.restore();
638
- });
639
-
640
- it('should require accountId', function () {
641
- sandbox.stub(utils, 'logError');
642
-
643
- rubiconAnalyticsAdapter.enableAnalytics({
644
- options: {
645
- endpoint: '//localhost:9999/event'
646
- }
647
- });
648
-
649
- expect(utils.logError.called).to.equal(true);
650
- });
651
-
652
- it('should require endpoint', function () {
653
- sandbox.stub(utils, 'logError');
654
-
655
- rubiconAnalyticsAdapter.enableAnalytics({
656
- options: {
657
- accountId: 1001
658
- }
659
- });
660
-
661
- expect(utils.logError.called).to.equal(true);
662
- });
663
-
664
- describe('config subscribe', function () {
665
- it('should update the pvid if user asks', function () {
666
- expect(utils.generateUUID.called).to.equal(false);
667
- config.setConfig({ rubicon: { updatePageView: true } });
668
- expect(utils.generateUUID.called).to.equal(true);
669
- });
670
- it('should merge in and preserve older set configs', function () {
671
- resetRubiConf();
672
- config.setConfig({
673
- rubicon: {
674
- wrapperName: '1001_general',
675
- int_type: 'dmpbjs',
676
- fpkvs: {
677
- source: 'fb'
678
- }
679
- }
680
- });
681
- expect(rubiConf).to.deep.equal({
682
- analyticsEventDelay: 0,
683
- dmBilling: {
684
- enabled: false,
685
- vendors: [],
686
- waitForAuction: true
687
- },
688
- pvid: '12345678',
689
- wrapperName: '1001_general',
690
- int_type: 'dmpbjs',
691
- fpkvs: {
692
- source: 'fb'
693
- },
694
- });
695
-
696
- // update it with stuff
697
- config.setConfig({
698
- rubicon: {
699
- fpkvs: {
700
- link: 'email'
701
- }
702
- }
703
- });
704
- expect(rubiConf).to.deep.equal({
705
- analyticsEventDelay: 0,
706
- dmBilling: {
707
- enabled: false,
708
- vendors: [],
709
- waitForAuction: true
710
- },
711
- pvid: '12345678',
712
- wrapperName: '1001_general',
713
- int_type: 'dmpbjs',
714
- fpkvs: {
715
- source: 'fb',
716
- link: 'email'
717
- },
718
- });
719
-
720
- // overwriting specific edge keys should update them
721
- config.setConfig({
722
- rubicon: {
723
- fpkvs: {
724
- link: 'iMessage',
725
- source: 'twitter'
726
- }
727
- }
728
- });
729
- expect(rubiConf).to.deep.equal({
730
- analyticsEventDelay: 0,
731
- dmBilling: {
732
- enabled: false,
733
- vendors: [],
734
- waitForAuction: true
735
- },
736
- pvid: '12345678',
737
- wrapperName: '1001_general',
738
- int_type: 'dmpbjs',
739
- fpkvs: {
740
- link: 'iMessage',
741
- source: 'twitter'
742
- },
743
- });
744
- });
745
- });
746
-
747
- describe('sampling', function () {
748
- beforeEach(function () {
749
- sandbox.stub(Math, 'random').returns(0.08);
750
- sandbox.stub(utils, 'logError');
751
- });
752
-
753
- afterEach(function () {
754
- rubiconAnalyticsAdapter.disableAnalytics();
755
- });
756
-
757
- describe('with options.samplingFactor', function () {
758
- it('should sample', function () {
759
- rubiconAnalyticsAdapter.enableAnalytics({
760
- options: {
761
- endpoint: '//localhost:9999/event',
762
- accountId: 1001,
763
- samplingFactor: 10
764
- }
765
- });
766
-
767
- performStandardAuction();
768
-
769
- expect(server.requests.length).to.equal(1);
770
- });
771
-
772
- it('should unsample', function () {
773
- rubiconAnalyticsAdapter.enableAnalytics({
774
- options: {
775
- endpoint: '//localhost:9999/event',
776
- accountId: 1001,
777
- samplingFactor: 20
778
- }
779
- });
780
-
781
- performStandardAuction();
782
-
783
- expect(server.requests.length).to.equal(0);
784
- });
785
-
786
- it('should throw errors for invalid samplingFactor', function () {
787
- rubiconAnalyticsAdapter.enableAnalytics({
788
- options: {
789
- endpoint: '//localhost:9999/event',
790
- accountId: 1001,
791
- samplingFactor: 30
792
- }
793
- });
794
-
795
- performStandardAuction();
796
-
797
- expect(server.requests.length).to.equal(0);
798
- expect(utils.logError.called).to.equal(true);
799
- });
800
- });
801
- describe('with options.sampling', function () {
802
- it('should sample', function () {
803
- rubiconAnalyticsAdapter.enableAnalytics({
804
- options: {
805
- endpoint: '//localhost:9999/event',
806
- accountId: 1001,
807
- sampling: 0.1
808
- }
809
- });
810
-
811
- performStandardAuction();
812
-
813
- expect(server.requests.length).to.equal(1);
814
- });
815
-
816
- it('should unsample', function () {
817
- rubiconAnalyticsAdapter.enableAnalytics({
818
- options: {
819
- endpoint: '//localhost:9999/event',
820
- accountId: 1001,
821
- sampling: 0.05
822
- }
823
- });
824
-
825
- performStandardAuction();
826
-
827
- expect(server.requests.length).to.equal(0);
828
- });
829
-
830
- it('should throw errors for invalid samplingFactor', function () {
831
- rubiconAnalyticsAdapter.enableAnalytics({
832
- options: {
833
- endpoint: '//localhost:9999/event',
834
- accountId: 1001,
835
- sampling: 1 / 30
836
- }
837
- });
838
-
839
- performStandardAuction();
840
-
841
- expect(server.requests.length).to.equal(0);
842
- expect(utils.logError.called).to.equal(true);
843
- });
844
- });
845
- });
846
-
847
- describe('when handling events', function () {
848
- beforeEach(function () {
849
- rubiconAnalyticsAdapter.enableAnalytics({
850
- options: {
851
- endpoint: '//localhost:9999/event',
852
- accountId: 1001
853
- }
854
- });
855
- });
856
-
857
- afterEach(function () {
858
- rubiconAnalyticsAdapter.disableAnalytics();
859
- });
860
-
861
- it('should build a batched message from prebid events', function () {
862
- performStandardAuction();
863
-
864
- expect(server.requests.length).to.equal(1);
865
- let request = server.requests[0];
866
-
867
- expect(request.url).to.equal('//localhost:9999/event');
868
-
869
- let message = JSON.parse(request.requestBody);
870
- validate(message);
871
-
872
- expect(message).to.deep.equal(ANALYTICS_MESSAGE);
873
- });
874
-
875
- it('should pass along bidderOrder correctly', function () {
876
- const appnexusBid = utils.deepClone(MOCK.BID_REQUESTED);
877
- appnexusBid.bidderCode = 'appnexus';
878
- const pubmaticBid = utils.deepClone(MOCK.BID_REQUESTED);
879
- pubmaticBid.bidderCode = 'pubmatic';
880
- const indexBid = utils.deepClone(MOCK.BID_REQUESTED);
881
- indexBid.bidderCode = 'ix';
882
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
883
- events.emit(BID_REQUESTED, pubmaticBid);
884
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
885
- events.emit(BID_REQUESTED, indexBid);
886
- events.emit(BID_REQUESTED, appnexusBid);
887
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
888
- events.emit(AUCTION_END, MOCK.AUCTION_END);
889
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
890
- clock.tick(SEND_TIMEOUT + 1000);
891
-
892
- let message = JSON.parse(server.requests[0].requestBody);
893
- expect(message.auctions[0].bidderOrder).to.deep.equal([
894
- 'pubmatic',
895
- 'rubicon',
896
- 'ix',
897
- 'appnexus'
898
- ]);
899
- });
900
-
901
- it('should pass along user ids', function () {
902
- let auctionInit = utils.deepClone(MOCK.AUCTION_INIT);
903
- auctionInit.bidderRequests[0].bids[0].userId = {
904
- criteoId: 'sadfe4334',
905
- lotamePanoramaId: 'asdf3gf4eg',
906
- pubcid: 'dsfa4545-svgdfs5',
907
- sharedId: { id1: 'asdf', id2: 'sadf4344' }
908
- };
909
-
910
- events.emit(AUCTION_INIT, auctionInit);
911
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
912
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
913
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
914
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
915
- events.emit(AUCTION_END, MOCK.AUCTION_END);
916
-
917
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
918
- events.emit(BID_WON, MOCK.BID_WON[0]);
919
- events.emit(BID_WON, MOCK.BID_WON[1]);
920
-
921
- expect(server.requests.length).to.equal(1);
922
- let request = server.requests[0];
923
-
924
- let message = JSON.parse(request.requestBody);
925
- validate(message);
926
-
927
- expect(message.auctions[0].user).to.deep.equal({
928
- ids: [
929
- { provider: 'criteoId', 'hasId': true },
930
- { provider: 'lotamePanoramaId', 'hasId': true },
931
- { provider: 'pubcid', 'hasId': true },
932
- { provider: 'sharedId', 'hasId': true },
933
- ]
934
- });
935
- });
936
-
937
- it('should handle bidResponse dimensions correctly', function () {
938
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
939
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
940
-
941
- // mock bid response with playerWidth and playerHeight (NO width and height)
942
- let bidResponse1 = utils.deepClone(MOCK.BID_RESPONSE[0]);
943
- delete bidResponse1.width;
944
- delete bidResponse1.height;
945
- bidResponse1.playerWidth = 640;
946
- bidResponse1.playerHeight = 480;
947
-
948
- // mock bid response with no width height or playerwidth playerheight
949
- let bidResponse2 = utils.deepClone(MOCK.BID_RESPONSE[1]);
950
- delete bidResponse2.width;
951
- delete bidResponse2.height;
952
- delete bidResponse2.playerWidth;
953
- delete bidResponse2.playerHeight;
954
-
955
- events.emit(BID_RESPONSE, bidResponse1);
956
- events.emit(BID_RESPONSE, bidResponse2);
957
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
958
- events.emit(AUCTION_END, MOCK.AUCTION_END);
959
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
960
- events.emit(BID_WON, MOCK.BID_WON[0]);
961
- events.emit(BID_WON, MOCK.BID_WON[1]);
962
-
963
- let message = JSON.parse(server.requests[0].requestBody);
964
- validate(message);
965
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.dimensions).to.deep.equal({
966
- width: 640,
967
- height: 480
968
- });
969
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.dimensions).to.equal(undefined);
970
- });
971
-
972
- it('should pass along adomians correctly', function () {
973
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
974
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
975
-
976
- // 1 adomains
977
- let bidResponse1 = utils.deepClone(MOCK.BID_RESPONSE[0]);
978
- bidResponse1.meta = {
979
- advertiserDomains: ['magnite.com']
980
- }
981
-
982
- // two adomains
983
- let bidResponse2 = utils.deepClone(MOCK.BID_RESPONSE[1]);
984
- bidResponse2.meta = {
985
- advertiserDomains: ['prebid.org', 'magnite.com']
986
- }
987
-
988
- // make sure we only pass max 10 adomains
989
- bidResponse2.meta.advertiserDomains = [...bidResponse2.meta.advertiserDomains, ...bidResponse2.meta.advertiserDomains, ...bidResponse2.meta.advertiserDomains, ...bidResponse2.meta.advertiserDomains, ...bidResponse2.meta.advertiserDomains, ...bidResponse2.meta.advertiserDomains, ...bidResponse2.meta.advertiserDomains]
990
-
991
- events.emit(BID_RESPONSE, bidResponse1);
992
- events.emit(BID_RESPONSE, bidResponse2);
993
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
994
- events.emit(AUCTION_END, MOCK.AUCTION_END);
995
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
996
- events.emit(BID_WON, MOCK.BID_WON[0]);
997
- events.emit(BID_WON, MOCK.BID_WON[1]);
998
-
999
- let message = JSON.parse(server.requests[0].requestBody);
1000
- validate(message);
1001
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.adomains).to.deep.equal(['magnite.com']);
1002
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.adomains).to.deep.equal(['prebid.org', 'magnite.com', 'prebid.org', 'magnite.com', 'prebid.org', 'magnite.com', 'prebid.org', 'magnite.com', 'prebid.org', 'magnite.com']);
1003
- });
1004
-
1005
- it('should NOT pass along adomians correctly when edge cases', function () {
1006
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1007
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1008
-
1009
- // empty => nothing
1010
- let bidResponse1 = utils.deepClone(MOCK.BID_RESPONSE[0]);
1011
- bidResponse1.meta = {
1012
- advertiserDomains: []
1013
- }
1014
-
1015
- // not array => nothing
1016
- let bidResponse2 = utils.deepClone(MOCK.BID_RESPONSE[1]);
1017
- bidResponse2.meta = {
1018
- advertiserDomains: 'prebid.org'
1019
- }
1020
-
1021
- events.emit(BID_RESPONSE, bidResponse1);
1022
- events.emit(BID_RESPONSE, bidResponse2);
1023
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1024
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1025
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1026
- events.emit(BID_WON, MOCK.BID_WON[0]);
1027
- events.emit(BID_WON, MOCK.BID_WON[1]);
1028
-
1029
- let message = JSON.parse(server.requests[0].requestBody);
1030
- validate(message);
1031
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.adomains).to.be.undefined;
1032
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.adomains).to.be.undefined;
1033
- });
1034
-
1035
- it('should NOT pass along adomians with other edge cases', function () {
1036
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1037
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1038
-
1039
- // should filter out non string values and pass valid ones
1040
- let bidResponse1 = utils.deepClone(MOCK.BID_RESPONSE[0]);
1041
- bidResponse1.meta = {
1042
- advertiserDomains: [123, 'prebid.org', false, true, [], 'magnite.com', {}]
1043
- }
1044
-
1045
- // array of arrays (as seen when passed by kargo bid adapter)
1046
- let bidResponse2 = utils.deepClone(MOCK.BID_RESPONSE[1]);
1047
- bidResponse2.meta = {
1048
- advertiserDomains: [['prebid.org']]
1049
- }
1050
-
1051
- events.emit(BID_RESPONSE, bidResponse1);
1052
- events.emit(BID_RESPONSE, bidResponse2);
1053
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1054
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1055
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1056
- events.emit(BID_WON, MOCK.BID_WON[0]);
1057
- events.emit(BID_WON, MOCK.BID_WON[1]);
1058
-
1059
- let message = JSON.parse(server.requests[0].requestBody);
1060
- validate(message);
1061
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.adomains).to.deep.equal(['prebid.org', 'magnite.com']);
1062
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.adomains).to.be.undefined;
1063
- });
1064
-
1065
- it('should not pass empty adServerTargeting values', function () {
1066
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1067
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1068
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1069
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1070
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1071
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1072
-
1073
- const mockTargeting = utils.deepClone(MOCK.SET_TARGETING);
1074
- mockTargeting['/19968336/header-bid-tag-0'].hb_test = '';
1075
- mockTargeting['/19968336/header-bid-tag1'].hb_test = 'NOT_EMPTY';
1076
- events.emit(SET_TARGETING, mockTargeting);
1077
-
1078
- events.emit(BID_WON, MOCK.BID_WON[0]);
1079
- events.emit(BID_WON, MOCK.BID_WON[1]);
1080
-
1081
- let message = JSON.parse(server.requests[0].requestBody);
1082
- validate(message);
1083
- expect(message.auctions[0].adUnits[0].adserverTargeting.hb_test).to.be.undefined;
1084
- expect(message.auctions[0].adUnits[1].adserverTargeting.hb_test).to.equal('NOT_EMPTY');
1085
- });
1086
-
1087
- function performFloorAuction(provider) {
1088
- let auctionInit = utils.deepClone(MOCK.AUCTION_INIT);
1089
- auctionInit.bidderRequests[0].bids[0].floorData = {
1090
- skipped: false,
1091
- modelVersion: 'someModelName',
1092
- modelWeight: 10,
1093
- modelTimestamp: 1606772895,
1094
- location: 'setConfig',
1095
- skipRate: 15,
1096
- fetchStatus: 'error',
1097
- floorProvider: provider
1098
- };
1099
- let flooredResponse = {
1100
- ...BID,
1101
- floorData: {
1102
- floorValue: 4,
1103
- floorRule: '12345/sports|video',
1104
- floorCurrency: 'USD',
1105
- cpmAfterAdjustments: 2.1,
1106
- enforcements: {
1107
- enforceJS: true,
1108
- enforcePBS: false,
1109
- floorDeals: false,
1110
- bidAdjustment: true
1111
- },
1112
- matchedFields: {
1113
- gptSlot: '12345/sports',
1114
- mediaType: 'video'
1115
- }
1116
- },
1117
- status: 'bidRejected',
1118
- cpm: 0,
1119
- getStatusCode() {
1120
- return 2;
1121
- }
1122
- };
1123
-
1124
- let notFlooredResponse = {
1125
- ...BID2,
1126
- floorData: {
1127
- floorValue: 1,
1128
- floorRule: '12345/news|banner',
1129
- floorCurrency: 'USD',
1130
- cpmAfterAdjustments: 1.55,
1131
- enforcements: {
1132
- enforceJS: true,
1133
- enforcePBS: false,
1134
- floorDeals: false,
1135
- bidAdjustment: true
1136
- },
1137
- matchedFields: {
1138
- gptSlot: '12345/news',
1139
- mediaType: 'banner'
1140
- }
1141
- }
1142
- };
1143
-
1144
- let floorMinResponse = {
1145
- ...BID3,
1146
- floorData: {
1147
- floorValue: 1.5,
1148
- floorRuleValue: 1,
1149
- floorRule: '12345/entertainment|banner',
1150
- floorCurrency: 'USD',
1151
- cpmAfterAdjustments: 2.00,
1152
- enforcements: {
1153
- enforceJS: true,
1154
- enforcePBS: false,
1155
- floorDeals: false,
1156
- bidAdjustment: true
1157
- },
1158
- matchedFields: {
1159
- gptSlot: '12345/entertainment',
1160
- mediaType: 'banner'
1161
- }
1162
- }
1163
- };
1164
-
1165
- let bidRequest = utils.deepClone(MOCK.BID_REQUESTED);
1166
- bidRequest.bids.push(floorMinRequest)
1167
-
1168
- // spoof the auction with just our duplicates
1169
- events.emit(AUCTION_INIT, auctionInit);
1170
- events.emit(BID_REQUESTED, bidRequest);
1171
- events.emit(BID_RESPONSE, flooredResponse);
1172
- events.emit(BID_RESPONSE, notFlooredResponse);
1173
- events.emit(BID_RESPONSE, floorMinResponse);
1174
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1175
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1176
- events.emit(BID_WON, MOCK.BID_WON[1]);
1177
- events.emit(BID_WON, MOCK.BID_WON[2]);
1178
- clock.tick(SEND_TIMEOUT + 1000);
1179
-
1180
- expect(server.requests.length).to.equal(1);
1181
-
1182
- let message = JSON.parse(server.requests[0].requestBody);
1183
- validate(message);
1184
- return message;
1185
- }
1186
-
1187
- it('should capture price floor information correctly', function () {
1188
- let message = performFloorAuction('rubicon');
1189
-
1190
- // verify our floor stuff is passed
1191
- // top level floor info
1192
- expect(message.auctions[0].floors).to.deep.equal({
1193
- location: 'setConfig',
1194
- modelName: 'someModelName',
1195
- modelWeight: 10,
1196
- modelTimestamp: 1606772895,
1197
- skipped: false,
1198
- enforcement: true,
1199
- dealsEnforced: false,
1200
- skipRate: 15,
1201
- fetchStatus: 'error',
1202
- provider: 'rubicon'
1203
- });
1204
- // first adUnit's adSlot
1205
- expect(message.auctions[0].adUnits[0].gam.adSlot).to.equal('12345/sports');
1206
- // since no other bids, we set adUnit status to no-bid
1207
- expect(message.auctions[0].adUnits[0].status).to.equal('no-bid');
1208
- // first adUnits bid is rejected
1209
- expect(message.auctions[0].adUnits[0].bids[0].status).to.equal('rejected-ipf');
1210
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.floorValue).to.equal(4);
1211
- // if bid rejected should take cpmAfterAdjustments val
1212
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.bidPriceUSD).to.equal(2.1);
1213
-
1214
- // second adUnit's adSlot
1215
- expect(message.auctions[0].adUnits[1].gam.adSlot).to.equal('12345/news');
1216
- // top level adUnit status is success
1217
- expect(message.auctions[0].adUnits[1].status).to.equal('success');
1218
- // second adUnits bid is success
1219
- expect(message.auctions[0].adUnits[1].bids[0].status).to.equal('success');
1220
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.floorValue).to.equal(1);
1221
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.bidPriceUSD).to.equal(1.52);
1222
-
1223
- // second adUnit's adSlot
1224
- expect(message.auctions[0].adUnits[2].gam.adSlot).to.equal('12345/entertainment');
1225
- // top level adUnit status is success
1226
- expect(message.auctions[0].adUnits[2].status).to.equal('success');
1227
- // second adUnits bid is success
1228
- expect(message.auctions[0].adUnits[2].bids[0].status).to.equal('success');
1229
- expect(message.auctions[0].adUnits[2].bids[0].bidResponse.floorValue).to.equal(1.5);
1230
- expect(message.auctions[0].adUnits[2].bids[0].bidResponse.floorRuleValue).to.equal(1);
1231
- expect(message.auctions[0].adUnits[2].bids[0].bidResponse.bidPriceUSD).to.equal(2.01);
1232
- });
1233
-
1234
- it('should still send floor info if provider is not rubicon', function () {
1235
- let message = performFloorAuction('randomProvider');
1236
-
1237
- // verify our floor stuff is passed
1238
- // top level floor info
1239
- expect(message.auctions[0].floors).to.deep.equal({
1240
- location: 'setConfig',
1241
- modelName: 'someModelName',
1242
- modelWeight: 10,
1243
- modelTimestamp: 1606772895,
1244
- skipped: false,
1245
- enforcement: true,
1246
- dealsEnforced: false,
1247
- skipRate: 15,
1248
- fetchStatus: 'error',
1249
- provider: 'randomProvider'
1250
- });
1251
- // first adUnit's adSlot
1252
- expect(message.auctions[0].adUnits[0].gam.adSlot).to.equal('12345/sports');
1253
- // since no other bids, we set adUnit status to no-bid
1254
- expect(message.auctions[0].adUnits[0].status).to.equal('no-bid');
1255
- // first adUnits bid is rejected
1256
- expect(message.auctions[0].adUnits[0].bids[0].status).to.equal('rejected-ipf');
1257
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.floorValue).to.equal(4);
1258
- // if bid rejected should take cpmAfterAdjustments val
1259
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.bidPriceUSD).to.equal(2.1);
1260
-
1261
- // second adUnit's adSlot
1262
- expect(message.auctions[0].adUnits[1].gam.adSlot).to.equal('12345/news');
1263
- // top level adUnit status is success
1264
- expect(message.auctions[0].adUnits[1].status).to.equal('success');
1265
- // second adUnits bid is success
1266
- expect(message.auctions[0].adUnits[1].bids[0].status).to.equal('success');
1267
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.floorValue).to.equal(1);
1268
- expect(message.auctions[0].adUnits[1].bids[0].bidResponse.bidPriceUSD).to.equal(1.52);
1269
-
1270
- // second adUnit's adSlot
1271
- expect(message.auctions[0].adUnits[2].gam.adSlot).to.equal('12345/entertainment');
1272
- // top level adUnit status is success
1273
- expect(message.auctions[0].adUnits[2].status).to.equal('success');
1274
- // second adUnits bid is success
1275
- expect(message.auctions[0].adUnits[2].bids[0].status).to.equal('success');
1276
- expect(message.auctions[0].adUnits[2].bids[0].bidResponse.floorValue).to.equal(1.5);
1277
- expect(message.auctions[0].adUnits[2].bids[0].bidResponse.floorRuleValue).to.equal(1);
1278
- expect(message.auctions[0].adUnits[2].bids[0].bidResponse.bidPriceUSD).to.equal(2.01);
1279
- });
1280
-
1281
- describe('with session handling', function () {
1282
- const expectedPvid = STUBBED_UUID.slice(0, 8);
1283
- beforeEach(function () {
1284
- config.setConfig({ rubicon: { updatePageView: true } });
1285
- });
1286
-
1287
- it('should not log any session data if local storage is not enabled', function () {
1288
- localStorageIsEnabledStub.returns(false);
1289
-
1290
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1291
- delete expectedMessage.session;
1292
- delete expectedMessage.fpkvs;
1293
-
1294
- performStandardAuction();
1295
-
1296
- expect(server.requests.length).to.equal(1);
1297
- let request = server.requests[0];
1298
-
1299
- expect(request.url).to.equal('//localhost:9999/event');
1300
-
1301
- let message = JSON.parse(request.requestBody);
1302
- validate(message);
1303
-
1304
- expect(message).to.deep.equal(expectedMessage);
1305
- });
1306
-
1307
- it('should should pass along custom rubicon kv and pvid when defined', function () {
1308
- config.setConfig({
1309
- rubicon: {
1310
- fpkvs: {
1311
- source: 'fb',
1312
- link: 'email'
1313
- }
1314
- }
1315
- });
1316
- performStandardAuction();
1317
- expect(server.requests.length).to.equal(1);
1318
- let request = server.requests[0];
1319
- let message = JSON.parse(request.requestBody);
1320
- validate(message);
1321
-
1322
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1323
- expectedMessage.session.pvid = STUBBED_UUID.slice(0, 8);
1324
- expectedMessage.fpkvs = [
1325
- { key: 'source', value: 'fb' },
1326
- { key: 'link', value: 'email' }
1327
- ]
1328
- expect(message).to.deep.equal(expectedMessage);
1329
- });
1330
-
1331
- it('should convert kvs to strings before sending', function () {
1332
- config.setConfig({
1333
- rubicon: {
1334
- fpkvs: {
1335
- number: 24,
1336
- boolean: false,
1337
- string: 'hello',
1338
- array: ['one', 2, 'three'],
1339
- object: { one: 'two' }
1340
- }
1341
- }
1342
- });
1343
- performStandardAuction();
1344
- expect(server.requests.length).to.equal(1);
1345
- let request = server.requests[0];
1346
- let message = JSON.parse(request.requestBody);
1347
- validate(message);
1348
-
1349
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1350
- expectedMessage.session.pvid = STUBBED_UUID.slice(0, 8);
1351
- expectedMessage.fpkvs = [
1352
- { key: 'number', value: '24' },
1353
- { key: 'boolean', value: 'false' },
1354
- { key: 'string', value: 'hello' },
1355
- { key: 'array', value: 'one,2,three' },
1356
- { key: 'object', value: '[object Object]' }
1357
- ]
1358
- expect(message).to.deep.equal(expectedMessage);
1359
- });
1360
-
1361
- it('should use the query utm param rubicon kv value and pass updated kv and pvid when defined', function () {
1362
- sandbox.stub(utils, 'getWindowLocation').returns({ 'search': '?utm_source=other', 'pbjs_debug': 'true' });
1363
-
1364
- config.setConfig({
1365
- rubicon: {
1366
- fpkvs: {
1367
- source: 'fb',
1368
- link: 'email'
1369
- }
1370
- }
1371
- });
1372
- performStandardAuction();
1373
- expect(server.requests.length).to.equal(1);
1374
- let request = server.requests[0];
1375
- let message = JSON.parse(request.requestBody);
1376
- validate(message);
1377
-
1378
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1379
- expectedMessage.session.pvid = STUBBED_UUID.slice(0, 8);
1380
- expectedMessage.fpkvs = [
1381
- { key: 'source', value: 'other' },
1382
- { key: 'link', value: 'email' }
1383
- ]
1384
-
1385
- message.fpkvs.sort((left, right) => left.key < right.key);
1386
- expectedMessage.fpkvs.sort((left, right) => left.key < right.key);
1387
-
1388
- expect(message).to.deep.equal(expectedMessage);
1389
- });
1390
-
1391
- it('should pick up existing localStorage and use its values', function () {
1392
- // set some localStorage
1393
- let inputlocalStorage = {
1394
- id: '987654',
1395
- start: 1519766113781, // 15 mins before "now"
1396
- expires: 1519787713781, // six hours later
1397
- lastSeen: 1519766113781,
1398
- fpkvs: { source: 'tw' }
1399
- };
1400
- getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage)));
1401
-
1402
- config.setConfig({
1403
- rubicon: {
1404
- fpkvs: {
1405
- link: 'email' // should merge this with what is in the localStorage!
1406
- }
1407
- }
1408
- });
1409
- performStandardAuction();
1410
- expect(server.requests.length).to.equal(1);
1411
- let request = server.requests[0];
1412
- let message = JSON.parse(request.requestBody);
1413
- validate(message);
1414
-
1415
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1416
- expectedMessage.session = {
1417
- id: '987654',
1418
- start: 1519766113781,
1419
- expires: 1519787713781,
1420
- pvid: expectedPvid
1421
- }
1422
- expectedMessage.fpkvs = [
1423
- { key: 'source', value: 'tw' },
1424
- { key: 'link', value: 'email' }
1425
- ]
1426
- expect(message).to.deep.equal(expectedMessage);
1427
-
1428
- let calledWith;
1429
- try {
1430
- calledWith = JSON.parse(atob(setDataInLocalStorageStub.getCall(0).args[1]));
1431
- } catch (e) {
1432
- calledWith = {};
1433
- }
1434
-
1435
- expect(calledWith).to.deep.equal({
1436
- id: '987654', // should have stayed same
1437
- start: 1519766113781, // should have stayed same
1438
- expires: 1519787713781, // should have stayed same
1439
- lastSeen: 1519767013781, // lastSeen updated to our "now"
1440
- fpkvs: { source: 'tw', link: 'email' }, // link merged in
1441
- pvid: expectedPvid // new pvid stored
1442
- });
1443
- });
1444
-
1445
- it('should overwrite matching localstorge value and use its remaining values', function () {
1446
- sandbox.stub(utils, 'getWindowLocation').returns({ 'search': '?utm_source=fb&utm_click=dog' });
1447
-
1448
- // set some localStorage
1449
- let inputlocalStorage = {
1450
- id: '987654',
1451
- start: 1519766113781, // 15 mins before "now"
1452
- expires: 1519787713781, // six hours later
1453
- lastSeen: 1519766113781,
1454
- fpkvs: { source: 'tw', link: 'email' }
1455
- };
1456
- getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage)));
1457
-
1458
- config.setConfig({
1459
- rubicon: {
1460
- fpkvs: {
1461
- link: 'email' // should merge this with what is in the localStorage!
1462
- }
1463
- }
1464
- });
1465
- performStandardAuction();
1466
- expect(server.requests.length).to.equal(1);
1467
- let request = server.requests[0];
1468
- let message = JSON.parse(request.requestBody);
1469
- validate(message);
1470
-
1471
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1472
- expectedMessage.session = {
1473
- id: '987654',
1474
- start: 1519766113781,
1475
- expires: 1519787713781,
1476
- pvid: expectedPvid
1477
- }
1478
- expectedMessage.fpkvs = [
1479
- { key: 'source', value: 'fb' },
1480
- { key: 'link', value: 'email' },
1481
- { key: 'click', value: 'dog' }
1482
- ]
1483
-
1484
- message.fpkvs.sort((left, right) => left.key < right.key);
1485
- expectedMessage.fpkvs.sort((left, right) => left.key < right.key);
1486
-
1487
- expect(message).to.deep.equal(expectedMessage);
1488
-
1489
- let calledWith;
1490
- try {
1491
- calledWith = JSON.parse(atob(setDataInLocalStorageStub.getCall(0).args[1]));
1492
- } catch (e) {
1493
- calledWith = {};
1494
- }
1495
-
1496
- expect(calledWith).to.deep.equal({
1497
- id: '987654', // should have stayed same
1498
- start: 1519766113781, // should have stayed same
1499
- expires: 1519787713781, // should have stayed same
1500
- lastSeen: 1519767013781, // lastSeen updated to our "now"
1501
- fpkvs: { source: 'fb', link: 'email', click: 'dog' }, // link merged in
1502
- pvid: expectedPvid // new pvid stored
1503
- });
1504
- });
1505
-
1506
- it('should throw out session if lastSeen > 30 mins ago and create new one', function () {
1507
- // set some localStorage
1508
- let inputlocalStorage = {
1509
- id: '987654',
1510
- start: 1519764313781, // 45 mins before "now"
1511
- expires: 1519785913781, // six hours later
1512
- lastSeen: 1519764313781, // 45 mins before "now"
1513
- fpkvs: { source: 'tw' }
1514
- };
1515
- getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage)));
1516
-
1517
- config.setConfig({
1518
- rubicon: {
1519
- fpkvs: {
1520
- link: 'email' // should merge this with what is in the localStorage!
1521
- }
1522
- }
1523
- });
1524
-
1525
- performStandardAuction();
1526
- expect(server.requests.length).to.equal(1);
1527
- let request = server.requests[0];
1528
- let message = JSON.parse(request.requestBody);
1529
- validate(message);
1530
-
1531
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1532
- // session should match what is already in ANALYTICS_MESSAGE, just need to add pvid
1533
- expectedMessage.session.pvid = expectedPvid;
1534
-
1535
- // the saved fpkvs should have been thrown out since session expired
1536
- expectedMessage.fpkvs = [
1537
- { key: 'link', value: 'email' }
1538
- ]
1539
- expect(message).to.deep.equal(expectedMessage);
1540
-
1541
- let calledWith;
1542
- try {
1543
- calledWith = JSON.parse(atob(setDataInLocalStorageStub.getCall(0).args[1]));
1544
- } catch (e) {
1545
- calledWith = {};
1546
- }
1547
-
1548
- expect(calledWith).to.deep.equal({
1549
- id: STUBBED_UUID, // should have stayed same
1550
- start: 1519767013781, // should have stayed same
1551
- expires: 1519788613781, // should have stayed same
1552
- lastSeen: 1519767013781, // lastSeen updated to our "now"
1553
- fpkvs: { link: 'email' }, // link merged in
1554
- pvid: expectedPvid // new pvid stored
1555
- });
1556
- });
1557
-
1558
- it('should throw out session if past expires time and create new one', function () {
1559
- // set some localStorage
1560
- let inputlocalStorage = {
1561
- id: '987654',
1562
- start: 1519745353781, // 6 hours before "expires"
1563
- expires: 1519766953781, // little more than six hours ago
1564
- lastSeen: 1519767008781, // 5 seconds ago
1565
- fpkvs: { source: 'tw' }
1566
- };
1567
- getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage)));
1568
-
1569
- config.setConfig({
1570
- rubicon: {
1571
- fpkvs: {
1572
- link: 'email' // should merge this with what is in the localStorage!
1573
- }
1574
- }
1575
- });
1576
-
1577
- performStandardAuction();
1578
- expect(server.requests.length).to.equal(1);
1579
- let request = server.requests[0];
1580
- let message = JSON.parse(request.requestBody);
1581
- validate(message);
1582
-
1583
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1584
- // session should match what is already in ANALYTICS_MESSAGE, just need to add pvid
1585
- expectedMessage.session.pvid = expectedPvid;
1586
-
1587
- // the saved fpkvs should have been thrown out since session expired
1588
- expectedMessage.fpkvs = [
1589
- { key: 'link', value: 'email' }
1590
- ]
1591
- expect(message).to.deep.equal(expectedMessage);
1592
-
1593
- let calledWith;
1594
- try {
1595
- calledWith = JSON.parse(atob(setDataInLocalStorageStub.getCall(0).args[1]));
1596
- } catch (e) {
1597
- calledWith = {};
1598
- }
1599
-
1600
- expect(calledWith).to.deep.equal({
1601
- id: STUBBED_UUID, // should have stayed same
1602
- start: 1519767013781, // should have stayed same
1603
- expires: 1519788613781, // should have stayed same
1604
- lastSeen: 1519767013781, // lastSeen updated to our "now"
1605
- fpkvs: { link: 'email' }, // link merged in
1606
- pvid: expectedPvid // new pvid stored
1607
- });
1608
- });
1609
- });
1610
- describe('with googletag enabled', function () {
1611
- let gptSlot0, gptSlot1;
1612
- let gptSlotRenderEnded0, gptSlotRenderEnded1;
1613
- beforeEach(function () {
1614
- mockGpt.enable();
1615
- gptSlot0 = mockGpt.makeSlot({ code: '/19968336/header-bid-tag-0' });
1616
- gptSlotRenderEnded0 = {
1617
- eventName: 'slotRenderEnded',
1618
- params: {
1619
- slot: gptSlot0,
1620
- isEmpty: false,
1621
- advertiserId: 1111,
1622
- sourceAgnosticCreativeId: 2222,
1623
- sourceAgnosticLineItemId: 3333
1624
- }
1625
- };
1626
-
1627
- gptSlot1 = mockGpt.makeSlot({ code: '/19968336/header-bid-tag1' });
1628
- gptSlotRenderEnded1 = {
1629
- eventName: 'slotRenderEnded',
1630
- params: {
1631
- slot: gptSlot1,
1632
- isEmpty: false,
1633
- advertiserId: 4444,
1634
- sourceAgnosticCreativeId: 5555,
1635
- sourceAgnosticLineItemId: 6666
1636
- }
1637
- };
1638
- });
1639
-
1640
- afterEach(function () {
1641
- mockGpt.disable();
1642
- });
1643
-
1644
- it('should add necessary gam information if gpt is enabled and slotRender event emmited', function () {
1645
- performStandardAuction([gptSlotRenderEnded0, gptSlotRenderEnded1]);
1646
- expect(server.requests.length).to.equal(1);
1647
- let request = server.requests[0];
1648
- let message = JSON.parse(request.requestBody);
1649
- validate(message);
1650
-
1651
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1652
- expectedMessage.auctions[0].adUnits[0].gam = {
1653
- advertiserId: 1111,
1654
- creativeId: 2222,
1655
- lineItemId: 3333,
1656
- adSlot: '/19968336/header-bid-tag-0'
1657
- };
1658
- expectedMessage.auctions[0].adUnits[1].gam = {
1659
- advertiserId: 4444,
1660
- creativeId: 5555,
1661
- lineItemId: 6666,
1662
- adSlot: '/19968336/header-bid-tag1'
1663
- };
1664
- expect(message).to.deep.equal(expectedMessage);
1665
- });
1666
-
1667
- it('should handle empty gam renders', function () {
1668
- performStandardAuction([gptSlotRenderEnded0, {
1669
- eventName: 'slotRenderEnded',
1670
- params: {
1671
- slot: gptSlot1,
1672
- isEmpty: true
1673
- }
1674
- }]);
1675
- expect(server.requests.length).to.equal(1);
1676
- let request = server.requests[0];
1677
- let message = JSON.parse(request.requestBody);
1678
- validate(message);
1679
-
1680
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1681
- expectedMessage.auctions[0].adUnits[0].gam = {
1682
- advertiserId: 1111,
1683
- creativeId: 2222,
1684
- lineItemId: 3333,
1685
- adSlot: '/19968336/header-bid-tag-0'
1686
- };
1687
- expectedMessage.auctions[0].adUnits[1].gam = {
1688
- isSlotEmpty: true,
1689
- adSlot: '/19968336/header-bid-tag1'
1690
- };
1691
- expect(message).to.deep.equal(expectedMessage);
1692
- });
1693
-
1694
- it('should still add gam ids if falsy', function () {
1695
- performStandardAuction([gptSlotRenderEnded0, {
1696
- eventName: 'slotRenderEnded',
1697
- params: {
1698
- slot: gptSlot1,
1699
- isEmpty: false,
1700
- advertiserId: 0,
1701
- sourceAgnosticCreativeId: 0,
1702
- sourceAgnosticLineItemId: 0
1703
- }
1704
- }]);
1705
- expect(server.requests.length).to.equal(1);
1706
- let request = server.requests[0];
1707
- let message = JSON.parse(request.requestBody);
1708
- validate(message);
1709
-
1710
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1711
- expectedMessage.auctions[0].adUnits[0].gam = {
1712
- advertiserId: 1111,
1713
- creativeId: 2222,
1714
- lineItemId: 3333,
1715
- adSlot: '/19968336/header-bid-tag-0'
1716
- };
1717
- expectedMessage.auctions[0].adUnits[1].gam = {
1718
- advertiserId: 0,
1719
- creativeId: 0,
1720
- lineItemId: 0,
1721
- adSlot: '/19968336/header-bid-tag1'
1722
- };
1723
- expect(message).to.deep.equal(expectedMessage);
1724
- });
1725
-
1726
- it('should pick backup Ids if no sourceAgnostic available first', function () {
1727
- performStandardAuction([gptSlotRenderEnded0, {
1728
- eventName: 'slotRenderEnded',
1729
- params: {
1730
- slot: gptSlot1,
1731
- isEmpty: false,
1732
- advertiserId: 0,
1733
- lineItemId: 1234,
1734
- creativeId: 5678
1735
- }
1736
- }]);
1737
- expect(server.requests.length).to.equal(1);
1738
- let request = server.requests[0];
1739
- let message = JSON.parse(request.requestBody);
1740
- validate(message);
1741
-
1742
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1743
- expectedMessage.auctions[0].adUnits[0].gam = {
1744
- advertiserId: 1111,
1745
- creativeId: 2222,
1746
- lineItemId: 3333,
1747
- adSlot: '/19968336/header-bid-tag-0'
1748
- };
1749
- expectedMessage.auctions[0].adUnits[1].gam = {
1750
- advertiserId: 0,
1751
- creativeId: 5678,
1752
- lineItemId: 1234,
1753
- adSlot: '/19968336/header-bid-tag1'
1754
- };
1755
- expect(message).to.deep.equal(expectedMessage);
1756
- });
1757
-
1758
- it('should correctly set adUnit for associated slots', function () {
1759
- performStandardAuction([gptSlotRenderEnded0, gptSlotRenderEnded1]);
1760
- expect(server.requests.length).to.equal(1);
1761
- let request = server.requests[0];
1762
- let message = JSON.parse(request.requestBody);
1763
- validate(message);
1764
-
1765
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1766
- expectedMessage.auctions[0].adUnits[0].gam = {
1767
- advertiserId: 1111,
1768
- creativeId: 2222,
1769
- lineItemId: 3333,
1770
- adSlot: '/19968336/header-bid-tag-0'
1771
- };
1772
- expectedMessage.auctions[0].adUnits[1].gam = {
1773
- advertiserId: 4444,
1774
- creativeId: 5555,
1775
- lineItemId: 6666,
1776
- adSlot: '/19968336/header-bid-tag1'
1777
- };
1778
- expect(message).to.deep.equal(expectedMessage);
1779
- });
1780
-
1781
- it('should only mark the first gam data not all matches', function () {
1782
- config.setConfig({
1783
- rubicon: {
1784
- waitForGamSlots: true
1785
- }
1786
- });
1787
- performStandardAuction();
1788
- performStandardAuction([gptSlotRenderEnded0, gptSlotRenderEnded1], '32d332de-123a-32dg-2345-cefef3423324');
1789
-
1790
- // tick the clock and both should fire
1791
- clock.tick(3000);
1792
-
1793
- expect(server.requests.length).to.equal(2);
1794
-
1795
- // first one should have GAM data
1796
- let request = server.requests[0];
1797
- let message = JSON.parse(request.requestBody);
1798
-
1799
- // trigger should be gam since all adunits had associated gam render
1800
- expect(message.trigger).to.be.equal('gam');
1801
- expect(message.auctions[0].adUnits[0].gam).to.deep.equal({
1802
- advertiserId: 1111,
1803
- creativeId: 2222,
1804
- lineItemId: 3333,
1805
- adSlot: '/19968336/header-bid-tag-0'
1806
- });
1807
- expect(message.auctions[0].adUnits[1].gam).to.deep.equal({
1808
- advertiserId: 4444,
1809
- creativeId: 5555,
1810
- lineItemId: 6666,
1811
- adSlot: '/19968336/header-bid-tag1'
1812
- });
1813
-
1814
- // second one should NOT have gam data
1815
- request = server.requests[1];
1816
- message = JSON.parse(request.requestBody);
1817
- validate(message);
1818
-
1819
- // trigger should be auctionEnd
1820
- expect(message.trigger).to.be.equal('auctionEnd');
1821
- expect(message.auctions[0].adUnits[0].gam).to.be.undefined;
1822
- expect(message.auctions[0].adUnits[1].gam).to.be.undefined;
1823
- });
1824
-
1825
- it('should send request when waitForGamSlots is present but no bidWons are sent', function () {
1826
- config.setConfig({
1827
- rubicon: {
1828
- waitForGamSlots: true,
1829
- }
1830
- });
1831
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1832
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1833
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1834
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1835
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1836
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1837
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1838
-
1839
- // should send if just slotRenderEnded is emmitted for both
1840
- mockGpt.emitEvent(gptSlotRenderEnded0.eventName, gptSlotRenderEnded0.params);
1841
- mockGpt.emitEvent(gptSlotRenderEnded1.eventName, gptSlotRenderEnded1.params);
1842
-
1843
- expect(server.requests.length).to.equal(1);
1844
- let request = server.requests[0];
1845
- let message = JSON.parse(request.requestBody);
1846
- validate(message);
1847
-
1848
- let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE);
1849
- delete expectedMessage.bidsWon; // should not be any of these
1850
- expectedMessage.auctions[0].adUnits[0].gam = {
1851
- advertiserId: 1111,
1852
- creativeId: 2222,
1853
- lineItemId: 3333,
1854
- adSlot: '/19968336/header-bid-tag-0'
1855
- };
1856
- expectedMessage.auctions[0].adUnits[1].gam = {
1857
- advertiserId: 4444,
1858
- creativeId: 5555,
1859
- lineItemId: 6666,
1860
- adSlot: '/19968336/header-bid-tag1'
1861
- };
1862
- expectedMessage.trigger = 'gam';
1863
- expect(message).to.deep.equal(expectedMessage);
1864
- });
1865
-
1866
- it('should delay the event call depending on analyticsEventDelay config', function () {
1867
- config.setConfig({
1868
- rubicon: {
1869
- waitForGamSlots: true,
1870
- analyticsEventDelay: 2000
1871
- }
1872
- });
1873
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1874
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1875
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1876
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1877
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1878
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1879
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1880
-
1881
- // should send if just slotRenderEnded is emmitted for both
1882
- mockGpt.emitEvent(gptSlotRenderEnded0.eventName, gptSlotRenderEnded0.params);
1883
- mockGpt.emitEvent(gptSlotRenderEnded1.eventName, gptSlotRenderEnded1.params);
1884
-
1885
- // Should not be sent until delay
1886
- expect(server.requests.length).to.equal(0);
1887
-
1888
- // tick the clock and it should fire
1889
- clock.tick(2000);
1890
-
1891
- expect(server.requests.length).to.equal(1);
1892
- let request = server.requests[0];
1893
- let message = JSON.parse(request.requestBody);
1894
- validate(message);
1895
- let expectedGam0 = {
1896
- advertiserId: 1111,
1897
- creativeId: 2222,
1898
- lineItemId: 3333,
1899
- adSlot: '/19968336/header-bid-tag-0'
1900
- };
1901
- let expectedGam1 = {
1902
- advertiserId: 4444,
1903
- creativeId: 5555,
1904
- lineItemId: 6666,
1905
- adSlot: '/19968336/header-bid-tag1'
1906
- };
1907
- expect(expectedGam0).to.deep.equal(message.auctions[0].adUnits[0].gam);
1908
- expect(expectedGam1).to.deep.equal(message.auctions[0].adUnits[1].gam);
1909
- });
1910
- });
1911
-
1912
- it('should correctly overwrite bidId if seatBidId is on the bidResponse', function () {
1913
- // Only want one bid request in our mock auction
1914
- let bidRequested = utils.deepClone(MOCK.BID_REQUESTED);
1915
- bidRequested.bids.shift();
1916
- let auctionInit = utils.deepClone(MOCK.AUCTION_INIT);
1917
- auctionInit.adUnits.shift();
1918
-
1919
- // clone the mock bidResponse and duplicate
1920
- let seatBidResponse = utils.deepClone(BID2);
1921
- seatBidResponse.seatBidId = 'abc-123-do-re-me';
1922
-
1923
- const setTargeting = {
1924
- [seatBidResponse.adUnitCode]: seatBidResponse.adserverTargeting
1925
- };
1926
-
1927
- const bidWon = Object.assign({}, seatBidResponse, {
1928
- 'status': 'rendered'
1929
- });
1930
-
1931
- // spoof the auction with just our duplicates
1932
- events.emit(AUCTION_INIT, auctionInit);
1933
- events.emit(BID_REQUESTED, bidRequested);
1934
- events.emit(BID_RESPONSE, seatBidResponse);
1935
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1936
- events.emit(SET_TARGETING, setTargeting);
1937
- events.emit(BID_WON, bidWon);
1938
-
1939
- let message = JSON.parse(server.requests[0].requestBody);
1940
-
1941
- validate(message);
1942
- expect(message.auctions[0].adUnits[0].bids[0].bidId).to.equal('abc-123-do-re-me');
1943
- expect(message.bidsWon[0].bidId).to.equal('abc-123-do-re-me');
1944
- });
1945
-
1946
- it('should correctly overwrite bidId if pbsBidId is on the bidResponse', function () {
1947
- // Only want one bid request in our mock auction
1948
- let bidRequested = utils.deepClone(MOCK.BID_REQUESTED);
1949
- bidRequested.bids.shift();
1950
- let auctionInit = utils.deepClone(MOCK.AUCTION_INIT);
1951
- auctionInit.adUnits.shift();
1952
-
1953
- // clone the mock bidResponse and duplicate
1954
- let seatBidResponse = utils.deepClone(BID4);
1955
-
1956
- const setTargeting = {
1957
- [seatBidResponse.adUnitCode]: seatBidResponse.adserverTargeting
1958
- };
1959
-
1960
- const bidWon = Object.assign({}, seatBidResponse, {
1961
- 'status': 'rendered'
1962
- });
1963
-
1964
- // spoof the auction with just our duplicates
1965
- events.emit(AUCTION_INIT, auctionInit);
1966
- events.emit(BID_REQUESTED, bidRequested);
1967
- events.emit(BID_RESPONSE, seatBidResponse);
1968
- events.emit(AUCTION_END, MOCK.AUCTION_END);
1969
- events.emit(SET_TARGETING, setTargeting);
1970
- events.emit(BID_WON, bidWon);
1971
-
1972
- let message = JSON.parse(server.requests[0].requestBody);
1973
-
1974
- validate(message);
1975
- expect(message.auctions[0].adUnits[0].bids[0].bidId).to.equal('zzzz-yyyy-xxxx-wwww');
1976
- expect(message.bidsWon[0].bidId).to.equal('zzzz-yyyy-xxxx-wwww');
1977
- });
1978
-
1979
- it('should correctly generate new bidId if it is 0', function () {
1980
- // Only want one bid request in our mock auction
1981
- let bidRequested = utils.deepClone(MOCK.BID_REQUESTED);
1982
- bidRequested.bids.shift();
1983
- let auctionInit = utils.deepClone(MOCK.AUCTION_INIT);
1984
- auctionInit.adUnits.shift();
1985
-
1986
- // clone the mock bidResponse and duplicate
1987
- let seatBidResponse = utils.deepClone(BID4);
1988
- seatBidResponse.pbsBidId = '0';
1989
-
1990
- const setTargeting = {
1991
- [seatBidResponse.adUnitCode]: seatBidResponse.adserverTargeting
1992
- };
1993
-
1994
- const bidWon = Object.assign({}, seatBidResponse, {
1995
- 'status': 'rendered'
1996
- });
1997
-
1998
- // spoof the auction with just our duplicates
1999
- events.emit(AUCTION_INIT, auctionInit);
2000
- events.emit(BID_REQUESTED, bidRequested);
2001
- events.emit(BID_RESPONSE, seatBidResponse);
2002
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2003
- events.emit(SET_TARGETING, setTargeting);
2004
- events.emit(BID_WON, bidWon);
2005
-
2006
- let message = JSON.parse(server.requests[0].requestBody);
2007
-
2008
- validate(message);
2009
- expect(message.auctions[0].adUnits[0].bids[0].bidId).to.equal(STUBBED_UUID);
2010
- expect(message.bidsWon[0].bidId).to.equal(STUBBED_UUID);
2011
- });
2012
-
2013
- it('should pick the highest cpm bid if more than one bid per bidRequestId', function () {
2014
- // Only want one bid request in our mock auction
2015
- let bidRequested = utils.deepClone(MOCK.BID_REQUESTED);
2016
- bidRequested.bids.shift();
2017
- let auctionInit = utils.deepClone(MOCK.AUCTION_INIT);
2018
- auctionInit.adUnits.shift();
2019
-
2020
- // clone the mock bidResponse and duplicate
2021
- let duplicateResponse1 = utils.deepClone(BID2);
2022
- duplicateResponse1.cpm = 1.0;
2023
- duplicateResponse1.adserverTargeting.hb_pb = '1.0';
2024
- duplicateResponse1.adserverTargeting.hb_adid = '1111';
2025
- let duplicateResponse2 = utils.deepClone(BID2);
2026
- duplicateResponse2.cpm = 5.5;
2027
- duplicateResponse2.adserverTargeting.hb_pb = '5.5';
2028
- duplicateResponse2.adserverTargeting.hb_adid = '5555';
2029
- let duplicateResponse3 = utils.deepClone(BID2);
2030
- duplicateResponse3.cpm = 0.1;
2031
- duplicateResponse3.adserverTargeting.hb_pb = '0.1';
2032
- duplicateResponse3.adserverTargeting.hb_adid = '3333';
2033
-
2034
- const setTargeting = {
2035
- [duplicateResponse2.adUnitCode]: duplicateResponse2.adserverTargeting
2036
- };
2037
-
2038
- const bidWon = Object.assign({}, duplicateResponse2, {
2039
- 'status': 'rendered'
2040
- });
2041
-
2042
- // spoof the auction with just our duplicates
2043
- events.emit(AUCTION_INIT, auctionInit);
2044
- events.emit(BID_REQUESTED, bidRequested);
2045
- events.emit(BID_RESPONSE, duplicateResponse1);
2046
- events.emit(BID_RESPONSE, duplicateResponse2);
2047
- events.emit(BID_RESPONSE, duplicateResponse3);
2048
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2049
- events.emit(SET_TARGETING, setTargeting);
2050
- events.emit(BID_WON, bidWon);
2051
-
2052
- let message = JSON.parse(server.requests[0].requestBody);
2053
- validate(message);
2054
- expect(message.auctions[0].adUnits[0].bids[0].bidResponse.bidPriceUSD).to.equal(5.5);
2055
- expect(message.auctions[0].adUnits[0].adserverTargeting.hb_pb).to.equal('5.5');
2056
- expect(message.auctions[0].adUnits[0].adserverTargeting.hb_adid).to.equal('5555');
2057
- expect(message.bidsWon.length).to.equal(1);
2058
- expect(message.bidsWon[0].bidResponse.bidPriceUSD).to.equal(5.5);
2059
- expect(message.bidsWon[0].adserverTargeting.hb_pb).to.equal('5.5');
2060
- expect(message.bidsWon[0].adserverTargeting.hb_adid).to.equal('5555');
2061
- });
2062
-
2063
- it('should send batched message without BID_WON if necessary and further BID_WON events individually', function () {
2064
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
2065
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
2066
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
2067
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
2068
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
2069
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2070
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
2071
- events.emit(BID_WON, MOCK.BID_WON[0]);
2072
-
2073
- clock.tick(SEND_TIMEOUT + 1000);
2074
-
2075
- events.emit(BID_WON, MOCK.BID_WON[1]);
2076
-
2077
- expect(server.requests.length).to.equal(2);
2078
-
2079
- let message = JSON.parse(server.requests[0].requestBody);
2080
- validate(message);
2081
- expect(message.bidsWon.length).to.equal(1);
2082
- expect(message.auctions).to.deep.equal(ANALYTICS_MESSAGE.auctions);
2083
- expect(message.bidsWon[0]).to.deep.equal(ANALYTICS_MESSAGE.bidsWon[0]);
2084
-
2085
- message = JSON.parse(server.requests[1].requestBody);
2086
- validate(message);
2087
- expect(message.bidsWon.length).to.equal(1);
2088
- expect(message).to.not.have.property('auctions');
2089
- expect(message.bidsWon[0]).to.deep.equal(ANALYTICS_MESSAGE.bidsWon[1]);
2090
- });
2091
-
2092
- it('should properly mark bids as timed out', function () {
2093
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
2094
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
2095
- events.emit(BID_TIMEOUT, MOCK.BID_TIMEOUT);
2096
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2097
-
2098
- clock.tick(SEND_TIMEOUT + 1000);
2099
-
2100
- expect(server.requests.length).to.equal(1);
2101
-
2102
- let message = JSON.parse(server.requests[0].requestBody);
2103
- validate(message);
2104
- let timedOutBid = message.auctions[0].adUnits[0].bids[0];
2105
- expect(timedOutBid.status).to.equal('error');
2106
- expect(timedOutBid.error.code).to.equal('timeout-error');
2107
- expect(timedOutBid.error.description).to.equal('prebid.js timeout');
2108
- expect(timedOutBid).to.not.have.property('bidResponse');
2109
- });
2110
-
2111
- it('should pass aupName as pattern', function () {
2112
- let bidRequest = utils.deepClone(MOCK.BID_REQUESTED);
2113
- bidRequest.bids[0].ortb2Imp = {
2114
- ext: {
2115
- data: {
2116
- aupname: '1234/mycoolsite/*&gpt_leaderboard&deviceType=mobile'
2117
- }
2118
- }
2119
- };
2120
- bidRequest.bids[1].ortb2Imp = {
2121
- ext: {
2122
- data: {
2123
- aupname: '1234/mycoolsite/*&gpt_skyscraper&deviceType=mobile'
2124
- }
2125
- }
2126
- };
2127
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
2128
- events.emit(BID_REQUESTED, bidRequest);
2129
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
2130
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
2131
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2132
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
2133
-
2134
- clock.tick(SEND_TIMEOUT + 1000);
2135
-
2136
- expect(server.requests.length).to.equal(1);
2137
-
2138
- let message = JSON.parse(server.requests[0].requestBody);
2139
- validate(message);
2140
- expect(message.auctions[0].adUnits[0].pattern).to.equal('1234/mycoolsite/*&gpt_leaderboard&deviceType=mobile');
2141
- expect(message.auctions[0].adUnits[1].pattern).to.equal('1234/mycoolsite/*&gpt_skyscraper&deviceType=mobile');
2142
- });
2143
-
2144
- it('should pass gpid if defined', function () {
2145
- let bidRequest = utils.deepClone(MOCK.BID_REQUESTED);
2146
- bidRequest.bids[0].ortb2Imp = {
2147
- ext: {
2148
- gpid: '1234/mycoolsite/lowerbox'
2149
- }
2150
- };
2151
- bidRequest.bids[1].ortb2Imp = {
2152
- ext: {
2153
- gpid: '1234/mycoolsite/leaderboard'
2154
- }
2155
- };
2156
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
2157
- events.emit(BID_REQUESTED, bidRequest);
2158
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
2159
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
2160
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2161
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
2162
-
2163
- clock.tick(SEND_TIMEOUT + 1000);
2164
-
2165
- expect(server.requests.length).to.equal(1);
2166
-
2167
- let message = JSON.parse(server.requests[0].requestBody);
2168
- validate(message);
2169
- expect(message.auctions[0].adUnits[0].gpid).to.equal('1234/mycoolsite/lowerbox');
2170
- expect(message.auctions[0].adUnits[1].gpid).to.equal('1234/mycoolsite/leaderboard');
2171
- });
2172
-
2173
- it('should pass bidderDetail for multibid auctions', function () {
2174
- let bidResponse = utils.deepClone(MOCK.BID_RESPONSE[1]);
2175
- bidResponse.targetingBidder = 'rubi2';
2176
- bidResponse.originalRequestId = bidResponse.requestId;
2177
- bidResponse.requestId = '1a2b3c4d5e6f7g8h9';
2178
-
2179
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
2180
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
2181
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
2182
- events.emit(BID_RESPONSE, bidResponse);
2183
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
2184
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2185
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
2186
- events.emit(BID_WON, MOCK.BID_WON[0]);
2187
-
2188
- clock.tick(SEND_TIMEOUT + 1000);
2189
-
2190
- expect(server.requests.length).to.equal(1);
2191
-
2192
- let message = JSON.parse(server.requests[0].requestBody);
2193
- validate(message);
2194
-
2195
- expect(message.auctions[0].adUnits[1].bids[1].bidder).to.equal('rubicon');
2196
- expect(message.auctions[0].adUnits[1].bids[1].bidderDetail).to.equal('rubi2');
2197
- });
2198
-
2199
- it('should successfully convert bid price to USD in parseBidResponse', function () {
2200
- // Set the rates
2201
- setConfig({
2202
- adServerCurrency: 'JPY',
2203
- rates: {
2204
- USD: {
2205
- JPY: 100
2206
- }
2207
- }
2208
- });
2209
-
2210
- // set our bid response to JPY
2211
- const bidCopy = utils.deepClone(BID2);
2212
- bidCopy.currency = 'JPY';
2213
- bidCopy.cpm = 100;
2214
-
2215
- // Now add the bidResponse hook which hooks on the currenct conversion function onto the bid response
2216
- let innerBid;
2217
- addBidResponseHook(function (adCodeId, bid) {
2218
- innerBid = bid;
2219
- }, 'elementId', bidCopy);
2220
-
2221
- // Use the rubi analytics parseBidResponse Function to get the resulting cpm from the bid response!
2222
- const bidResponseObj = parseBidResponse(innerBid);
2223
- expect(bidResponseObj).to.have.property('bidPriceUSD');
2224
- expect(bidResponseObj.bidPriceUSD).to.equal(1.0);
2225
- });
2226
- });
2227
-
2228
- describe('config with integration type', () => {
2229
- it('should use the integration type provided in the config instead of the default', () => {
2230
- config.setConfig({
2231
- rubicon: {
2232
- int_type: 'testType'
2233
- }
2234
- })
2235
-
2236
- rubiconAnalyticsAdapter.enableAnalytics({
2237
- options: {
2238
- endpoint: '//localhost:9999/event',
2239
- accountId: 1001
2240
- }
2241
- });
2242
-
2243
- performStandardAuction();
2244
-
2245
- expect(server.requests.length).to.equal(1);
2246
- const request = server.requests[0];
2247
- const message = JSON.parse(request.requestBody);
2248
- expect(message.integration).to.equal('testType');
2249
-
2250
- rubiconAnalyticsAdapter.disableAnalytics();
2251
- });
2252
- });
2253
-
2254
- describe('billing events integration', () => {
2255
- beforeEach(function () {
2256
- rubiconAnalyticsAdapter.enableAnalytics({
2257
- options: {
2258
- endpoint: '//localhost:9999/event',
2259
- accountId: 1001
2260
- }
2261
- });
2262
- // default dmBilling
2263
- config.setConfig({
2264
- rubicon: {
2265
- dmBilling: {
2266
- enabled: false,
2267
- vendors: [],
2268
- waitForAuction: true
2269
- }
2270
- }
2271
- })
2272
- });
2273
- afterEach(function () {
2274
- rubiconAnalyticsAdapter.disableAnalytics();
2275
- });
2276
- const basicBillingAuction = (billingEvents = []) => {
2277
- events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
2278
- events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
2279
-
2280
- // emit billing events
2281
- billingEvents.forEach(ev => events.emit(BILLABLE_EVENT, ev));
2282
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
2283
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
2284
- events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
2285
- events.emit(AUCTION_END, MOCK.AUCTION_END);
2286
- events.emit(SET_TARGETING, MOCK.SET_TARGETING);
2287
- events.emit(BID_WON, MOCK.BID_WON[0]);
2288
- events.emit(BID_WON, MOCK.BID_WON[1]);
2289
- }
2290
- it('should ignore billing events when not enabled', () => {
2291
- basicBillingAuction([{
2292
- vendor: 'vendorName',
2293
- type: 'auction',
2294
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2295
- }]);
2296
- expect(server.requests.length).to.equal(1);
2297
- const request = server.requests[0];
2298
- const message = JSON.parse(request.requestBody);
2299
- expect(message.billableEvents).to.be.undefined;
2300
- });
2301
- it('should ignore billing events when enabled but vendor is not whitelisted', () => {
2302
- // off by default
2303
- config.setConfig({
2304
- rubicon: {
2305
- dmBilling: {
2306
- enabled: true
2307
- }
2308
- }
2309
- });
2310
- basicBillingAuction([{
2311
- vendor: 'vendorName',
2312
- type: 'auction',
2313
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2314
- }]);
2315
- expect(server.requests.length).to.equal(1);
2316
- const request = server.requests[0];
2317
- const message = JSON.parse(request.requestBody);
2318
- expect(message.billableEvents).to.be.undefined;
2319
- });
2320
- it('should ignore billing events if billingId is not defined or billingId is not a string', () => {
2321
- // off by default
2322
- config.setConfig({
2323
- rubicon: {
2324
- dmBilling: {
2325
- enabled: true,
2326
- vendors: ['vendorName']
2327
- }
2328
- }
2329
- });
2330
- basicBillingAuction([
2331
- {
2332
- vendor: 'vendorName',
2333
- type: 'auction',
2334
- },
2335
- {
2336
- vendor: 'vendorName',
2337
- type: 'auction',
2338
- billingId: true
2339
- },
2340
- {
2341
- vendor: 'vendorName',
2342
- type: 'auction',
2343
- billingId: 1233434
2344
- },
2345
- {
2346
- vendor: 'vendorName',
2347
- type: 'auction',
2348
- billingId: null
2349
- }
2350
- ]);
2351
- expect(server.requests.length).to.equal(1);
2352
- const request = server.requests[0];
2353
- const message = JSON.parse(request.requestBody);
2354
- expect(message.billableEvents).to.be.undefined;
2355
- });
2356
- it('should pass along billing event in same payload', () => {
2357
- // off by default
2358
- config.setConfig({
2359
- rubicon: {
2360
- dmBilling: {
2361
- enabled: true,
2362
- vendors: ['vendorName']
2363
- }
2364
- }
2365
- });
2366
- basicBillingAuction([{
2367
- vendor: 'vendorName',
2368
- type: 'pageView',
2369
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2370
- }]);
2371
- expect(server.requests.length).to.equal(1);
2372
- const request = server.requests[0];
2373
- const message = JSON.parse(request.requestBody);
2374
- expect(message).to.haveOwnProperty('auctions');
2375
- expect(message.billableEvents).to.deep.equal([{
2376
- accountId: 1001,
2377
- vendor: 'vendorName',
2378
- type: 'pageView',
2379
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2380
- }]);
2381
- });
2382
- it('should pass along multiple billing events but filter out duplicates', () => {
2383
- // off by default
2384
- config.setConfig({
2385
- rubicon: {
2386
- dmBilling: {
2387
- enabled: true,
2388
- vendors: ['vendorName']
2389
- }
2390
- }
2391
- });
2392
- basicBillingAuction([
2393
- {
2394
- vendor: 'vendorName',
2395
- type: 'auction',
2396
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2397
- },
2398
- {
2399
- vendor: 'vendorName',
2400
- type: 'impression',
2401
- billingId: '743db6e3-21f2-44d4-917f-cb3488c6076f'
2402
- },
2403
- {
2404
- vendor: 'vendorName',
2405
- type: 'auction',
2406
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2407
- }
2408
- ]);
2409
- expect(server.requests.length).to.equal(1);
2410
- const request = server.requests[0];
2411
- const message = JSON.parse(request.requestBody);
2412
- expect(message).to.haveOwnProperty('auctions');
2413
- expect(message.billableEvents).to.deep.equal([
2414
- {
2415
- accountId: 1001,
2416
- vendor: 'vendorName',
2417
- type: 'auction',
2418
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2419
- },
2420
- {
2421
- accountId: 1001,
2422
- vendor: 'vendorName',
2423
- type: 'impression',
2424
- billingId: '743db6e3-21f2-44d4-917f-cb3488c6076f'
2425
- }
2426
- ]);
2427
- });
2428
- it('should pass along event right away if no pending auction', () => {
2429
- // off by default
2430
- config.setConfig({
2431
- rubicon: {
2432
- dmBilling: {
2433
- enabled: true,
2434
- vendors: ['vendorName']
2435
- }
2436
- }
2437
- });
2438
-
2439
- events.emit(BILLABLE_EVENT, {
2440
- vendor: 'vendorName',
2441
- type: 'auction',
2442
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2443
- });
2444
- expect(server.requests.length).to.equal(1);
2445
- const request = server.requests[0];
2446
- const message = JSON.parse(request.requestBody);
2447
- expect(message).to.not.haveOwnProperty('auctions');
2448
- expect(message.billableEvents).to.deep.equal([
2449
- {
2450
- accountId: 1001,
2451
- vendor: 'vendorName',
2452
- type: 'auction',
2453
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2454
- }
2455
- ]);
2456
- });
2457
- it('should pass along event right away if pending auction but not waiting', () => {
2458
- // off by default
2459
- config.setConfig({
2460
- rubicon: {
2461
- dmBilling: {
2462
- enabled: true,
2463
- vendors: ['vendorName'],
2464
- waitForAuction: false
2465
- }
2466
- }
2467
- });
2468
- // should fire right away, and then auction later
2469
- basicBillingAuction([{
2470
- vendor: 'vendorName',
2471
- type: 'auction',
2472
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2473
- }]);
2474
- expect(server.requests.length).to.equal(2);
2475
- const billingRequest = server.requests[0];
2476
- const billingMessage = JSON.parse(billingRequest.requestBody);
2477
- expect(billingMessage).to.not.haveOwnProperty('auctions');
2478
- expect(billingMessage.billableEvents).to.deep.equal([
2479
- {
2480
- accountId: 1001,
2481
- vendor: 'vendorName',
2482
- type: 'auction',
2483
- billingId: 'f8558d41-62de-4349-bc7b-2dbee1e69965'
2484
- }
2485
- ]);
2486
- // auction event after
2487
- const auctionRequest = server.requests[1];
2488
- const auctionMessage = JSON.parse(auctionRequest.requestBody);
2489
- // should not double pass events!
2490
- expect(auctionMessage).to.not.haveOwnProperty('billableEvents');
2491
- });
2492
- });
2493
-
2494
- describe('wrapper details passed in', () => {
2495
- it('should correctly pass in the wrapper details if provided', () => {
2496
- config.setConfig({
2497
- rubicon: {
2498
- wrapperName: '1001_wrapperName_exp.4',
2499
- wrapperFamily: '1001_wrapperName',
2500
- rule_name: 'na-mobile'
2501
- }
2502
- });
2503
-
2504
- rubiconAnalyticsAdapter.enableAnalytics({
2505
- options: {
2506
- endpoint: '//localhost:9999/event',
2507
- accountId: 1001
2508
- }
2509
- });
2510
-
2511
- performStandardAuction();
2512
-
2513
- expect(server.requests.length).to.equal(1);
2514
- const request = server.requests[0];
2515
- const message = JSON.parse(request.requestBody);
2516
- expect(message.wrapper).to.deep.equal({
2517
- name: '1001_wrapperName_exp.4',
2518
- family: '1001_wrapperName',
2519
- rule: 'na-mobile'
2520
- });
2521
-
2522
- rubiconAnalyticsAdapter.disableAnalytics();
2523
- });
2524
- });
2525
-
2526
- it('getHostNameFromReferer correctly grabs hostname from an input URL', function () {
2527
- let inputUrl = 'https://www.prebid.org/some/path?pbjs_debug=true';
2528
- expect(getHostNameFromReferer(inputUrl)).to.equal('www.prebid.org');
2529
- inputUrl = 'https://www.prebid.com/some/path?pbjs_debug=true';
2530
- expect(getHostNameFromReferer(inputUrl)).to.equal('www.prebid.com');
2531
- inputUrl = 'https://prebid.org/some/path?pbjs_debug=true';
2532
- expect(getHostNameFromReferer(inputUrl)).to.equal('prebid.org');
2533
- inputUrl = 'http://xn--p8j9a0d9c9a.xn--q9jyb4c/';
2534
- expect(typeof getHostNameFromReferer(inputUrl)).to.equal('string');
2535
-
2536
- // not non-UTF char's in query / path which break if noDecodeWholeURL not set
2537
- inputUrl = 'https://prebid.org/search_results/%95x%8Em%92%CA/?category=000';
2538
- expect(getHostNameFromReferer(inputUrl)).to.equal('prebid.org');
2539
- });
2540
- });