prebid.js 9.4.0 → 9.5.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 (363) hide show
  1. package/.eslintrc.js +31 -5
  2. package/.github/workflows/jscpd.yml +2 -2
  3. package/.github/workflows/linter.yml +107 -0
  4. package/creative/crossDomain.js +6 -3
  5. package/dist/33acrossAnalyticsAdapter.js +1 -1
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/33acrossIdSystem.js +1 -1
  8. package/dist/BTBidAdapter.js +1 -1
  9. package/dist/adagioAnalyticsAdapter.js +1 -1
  10. package/dist/adagioBidAdapter.js +1 -1
  11. package/dist/adagioRtdProvider.js +1 -1
  12. package/dist/adagioUtils.js +1 -1
  13. package/dist/addefendBidAdapter.js +1 -1
  14. package/dist/adgenerationBidAdapter.js +1 -1
  15. package/dist/adkernelAdnBidAdapter.js +1 -1
  16. package/dist/adkernelBidAdapter.js +1 -1
  17. package/dist/adkernelUtils.js +1 -0
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/admixerBidAdapter.js +1 -1
  20. package/dist/adqueryBidAdapter.js +1 -1
  21. package/dist/adrelevantisBidAdapter.js +1 -1
  22. package/dist/adstirBidAdapter.js +1 -1
  23. package/dist/adtrgtmeBidAdapter.js +1 -1
  24. package/dist/advRedAnalyticsAdapter.js +1 -0
  25. package/dist/adxcgAnalyticsAdapter.js +1 -1
  26. package/dist/adxcgBidAdapter.js +1 -1
  27. package/dist/adyoulikeBidAdapter.js +1 -1
  28. package/dist/agmaAnalyticsAdapter.js +1 -1
  29. package/dist/ajaBidAdapter.js +1 -1
  30. package/dist/akamaiDapRtdProvider.js +1 -1
  31. package/dist/amxBidAdapter.js +1 -1
  32. package/dist/amxIdSystem.js +1 -1
  33. package/dist/anonymisedRtdProvider.js +1 -1
  34. package/dist/apacdexBidAdapter.js +1 -1
  35. package/dist/appierAnalyticsAdapter.js +1 -1
  36. package/dist/appnexusBidAdapter.js +1 -1
  37. package/dist/asoBidAdapter.js +1 -1
  38. package/dist/axonixBidAdapter.js +1 -1
  39. package/dist/azerionedgeRtdProvider.js +1 -1
  40. package/dist/bidglassBidAdapter.js +1 -1
  41. package/dist/big-richmediaBidAdapter.js +1 -1
  42. package/dist/bridBidAdapter.js +1 -1
  43. package/dist/bridgewellBidAdapter.js +1 -1
  44. package/dist/brightMountainMediaBidAdapter.js +1 -1
  45. package/dist/carodaBidAdapter.js +1 -1
  46. package/dist/chtnwBidAdapter.js +1 -1
  47. package/dist/chunk-core.js +1 -1
  48. package/dist/concertBidAdapter.js +1 -1
  49. package/dist/connatixBidAdapter.js +1 -1
  50. package/dist/connectadBidAdapter.js +1 -1
  51. package/dist/consumableBidAdapter.js +1 -1
  52. package/dist/contxtfulRtdProvider.js +1 -1
  53. package/dist/conversantAnalyticsAdapter.js +1 -1
  54. package/dist/conversantBidAdapter.js +1 -1
  55. package/dist/craftBidAdapter.js +1 -1
  56. package/dist/criteoBidAdapter.js +1 -1
  57. package/dist/currencyUtils.js +1 -1
  58. package/dist/cwireBidAdapter.js +1 -1
  59. package/dist/dailymotionBidAdapter.js +1 -1
  60. package/dist/debugging-standalone.js +1 -1
  61. package/dist/dependencies.json +43 -7
  62. package/dist/dfpAdServerVideo.js +1 -1
  63. package/dist/dfpAdpod.js +1 -1
  64. package/dist/dfpUtils.js +1 -1
  65. package/dist/discoveryBidAdapter.js +1 -1
  66. package/dist/dspxBidAdapter.js +1 -1
  67. package/dist/dxkultureBidAdapter.js +1 -1
  68. package/dist/eightPodAnalyticsAdapter.js +1 -1
  69. package/dist/eightPodBidAdapter.js +1 -1
  70. package/dist/eplanningBidAdapter.js +1 -1
  71. package/dist/euidIdSystem.js +1 -1
  72. package/dist/exadsBidAdapter.js +1 -1
  73. package/dist/feedadBidAdapter.js +1 -1
  74. package/dist/finativeBidAdapter.js +1 -1
  75. package/dist/fintezaAnalyticsAdapter.js +1 -1
  76. package/dist/fpdUtils.js +1 -0
  77. package/dist/freewheel-sspBidAdapter.js +1 -1
  78. package/dist/gmosspBidAdapter.js +1 -1
  79. package/dist/goldbachBidAdapter.js +1 -1
  80. package/dist/gptPreAuction.js +1 -1
  81. package/dist/gptUtils.js +1 -1
  82. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  83. package/dist/greenbidsRtdProvider.js +1 -1
  84. package/dist/gridBidAdapter.js +1 -1
  85. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  86. package/dist/growthCodeRtdProvider.js +1 -1
  87. package/dist/gumgumBidAdapter.js +1 -1
  88. package/dist/h12mediaBidAdapter.js +1 -1
  89. package/dist/hypelabBidAdapter.js +1 -1
  90. package/dist/id5AnalyticsAdapter.js +1 -1
  91. package/dist/id5IdSystem.js +1 -1
  92. package/dist/imdsBidAdapter.js +1 -1
  93. package/dist/improvedigitalBidAdapter.js +1 -1
  94. package/dist/insticatorBidAdapter.js +1 -1
  95. package/dist/intentIqAnalyticsAdapter.js +1 -0
  96. package/dist/ixBidAdapter.js +1 -1
  97. package/dist/jixieBidAdapter.js +1 -1
  98. package/dist/justpremiumBidAdapter.js +1 -1
  99. package/dist/jwplayerBidAdapter.js +1 -1
  100. package/dist/jwplayerRtdProvider.js +1 -1
  101. package/dist/kargoBidAdapter.js +1 -1
  102. package/dist/kimberliteBidAdapter.js +1 -1
  103. package/dist/konduitAnalyticsAdapter.js +1 -1
  104. package/dist/kueezBidAdapter.js +1 -1
  105. package/dist/lassoBidAdapter.js +1 -1
  106. package/dist/lifestreetBidAdapter.js +1 -1
  107. package/dist/liveIntentIdSystem.js +1 -1
  108. package/dist/logicadBidAdapter.js +1 -1
  109. package/dist/loglyliftBidAdapter.js +1 -1
  110. package/dist/luceadBidAdapter.js +1 -1
  111. package/dist/mabidderBidAdapter.js +1 -1
  112. package/dist/magniteAnalyticsAdapter.js +1 -1
  113. package/dist/malltvAnalyticsAdapter.js +1 -1
  114. package/dist/marsmediaBidAdapter.js +1 -1
  115. package/dist/mediafuseBidAdapter.js +1 -1
  116. package/dist/mediagoBidAdapter.js +1 -1
  117. package/dist/medianetAnalyticsAdapter.js +1 -1
  118. package/dist/medianetBidAdapter.js +1 -1
  119. package/dist/mediasquareBidAdapter.js +1 -1
  120. package/dist/mgidBidAdapter.js +1 -1
  121. package/dist/minutemediaBidAdapter.js +1 -1
  122. package/dist/missenaBidAdapter.js +1 -1
  123. package/dist/mobianRtdProvider.js +1 -1
  124. package/dist/nextMillenniumBidAdapter.js +1 -1
  125. package/dist/nexx360BidAdapter.js +1 -1
  126. package/dist/nobidAnalyticsAdapter.js +1 -1
  127. package/dist/nobidBidAdapter.js +1 -1
  128. package/dist/not-for-prod/prebid.js +201 -193
  129. package/dist/oguryBidAdapter.js +1 -1
  130. package/dist/onetagBidAdapter.js +1 -1
  131. package/dist/ooloAnalyticsAdapter.js +1 -1
  132. package/dist/openwebBidAdapter.js +1 -1
  133. package/dist/openxBidAdapter.js +1 -1
  134. package/dist/optidigitalBidAdapter.js +1 -1
  135. package/dist/optoutBidAdapter.js +1 -1
  136. package/dist/orbidderBidAdapter.js +1 -1
  137. package/dist/outbrainBidAdapter.js +1 -1
  138. package/dist/paapi.js +1 -1
  139. package/dist/permutiveRtdProvider.js +1 -1
  140. package/dist/pixfutureBidAdapter.js +1 -1
  141. package/dist/playdigoBidAdapter.js +1 -1
  142. package/dist/prebidServerBidAdapter.js +1 -1
  143. package/dist/programmaticaBidAdapter.js +1 -1
  144. package/dist/publinkIdSystem.js +1 -1
  145. package/dist/publirBidAdapter.js +1 -1
  146. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  147. package/dist/pubmaticBidAdapter.js +1 -1
  148. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  149. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  150. package/dist/pxyzBidAdapter.js +1 -1
  151. package/dist/quantcastBidAdapter.js +1 -1
  152. package/dist/readpeakBidAdapter.js +1 -1
  153. package/dist/relaidoBidAdapter.js +1 -1
  154. package/dist/relevatehealthBidAdapter.js +1 -1
  155. package/dist/retailspotBidAdapter.js +1 -1
  156. package/dist/rhythmoneBidAdapter.js +1 -1
  157. package/dist/ringieraxelspringerBidAdapter.js +1 -1
  158. package/dist/riseBidAdapter.js +1 -1
  159. package/dist/rubiconBidAdapter.js +1 -1
  160. package/dist/schainSerializer.js +1 -0
  161. package/dist/seedingAllianceBidAdapter.js +1 -1
  162. package/dist/seedtagBidAdapter.js +1 -1
  163. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  164. package/dist/sharethroughBidAdapter.js +1 -1
  165. package/dist/shinezBidAdapter.js +1 -1
  166. package/dist/sizeMapping.js +1 -1
  167. package/dist/sizeUtils.js +1 -1
  168. package/dist/smaatoBidAdapter.js +1 -1
  169. package/dist/smartadserverBidAdapter.js +1 -1
  170. package/dist/smartxBidAdapter.js +1 -1
  171. package/dist/smilewantedBidAdapter.js +1 -1
  172. package/dist/snigelBidAdapter.js +1 -1
  173. package/dist/sonobiBidAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/stnBidAdapter.js +1 -1
  177. package/dist/stvBidAdapter.js +1 -1
  178. package/dist/sublimeBidAdapter.js +1 -1
  179. package/dist/symitriDapRtdProvider.js +1 -0
  180. package/dist/taboolaBidAdapter.js +1 -1
  181. package/dist/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/targetVideoUtils.js +1 -0
  184. package/dist/teadsBidAdapter.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/themoneytizerBidAdapter.js +1 -1
  187. package/dist/trionBidAdapter.js +1 -1
  188. package/dist/tripleliftBidAdapter.js +1 -1
  189. package/dist/ttdBidAdapter.js +1 -1
  190. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  191. package/dist/uid2IdSystem.js +1 -1
  192. package/dist/underdogmediaBidAdapter.js +1 -1
  193. package/dist/undertoneBidAdapter.js +1 -1
  194. package/dist/unrulyBidAdapter.js +1 -1
  195. package/dist/userAgentUtils.js +1 -0
  196. package/dist/utiqIdSystem.js +1 -1
  197. package/dist/vidazooUtils.js +1 -1
  198. package/dist/videobyteBidAdapter.js +1 -1
  199. package/dist/visxBidAdapter.js +1 -1
  200. package/dist/vuukleBidAdapter.js +1 -1
  201. package/dist/widespaceBidAdapter.js +1 -1
  202. package/dist/winrBidAdapter.js +1 -1
  203. package/dist/yahooAdsBidAdapter.js +1 -1
  204. package/dist/yandexIdSystem.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  208. package/libraries/adkernelUtils/adkernelUtils.js +11 -0
  209. package/libraries/currencyUtils/floor.js +23 -0
  210. package/libraries/dfpUtils/dfpUtils.js +7 -0
  211. package/libraries/fpdUtils/deviceInfo.js +58 -0
  212. package/libraries/fpdUtils/pageInfo.js +73 -0
  213. package/libraries/gptUtils/gptUtils.js +23 -1
  214. package/libraries/schainSerializer/schainSerializer.js +24 -0
  215. package/libraries/sizeUtils/tranformSize.js +43 -0
  216. package/libraries/targetVideoUtils/bidderUtils.js +178 -0
  217. package/libraries/targetVideoUtils/constants.js +23 -0
  218. package/libraries/userAgentUtils/index.js +58 -0
  219. package/libraries/userAgentUtils/userAgentTypes.enums.js +22 -0
  220. package/modules/.submodules.json +1 -0
  221. package/modules/33acrossAnalyticsAdapter.js +2 -0
  222. package/modules/adagioBidAdapter.js +1 -1
  223. package/modules/adagioRtdProvider.js +18 -4
  224. package/modules/adkernelAdnBidAdapter.js +1 -12
  225. package/modules/adkernelBidAdapter.js +4 -13
  226. package/modules/adlooxAnalyticsAdapter.js +1 -0
  227. package/modules/admixerBidAdapter.js +10 -6
  228. package/modules/admixerBidAdapter.md +7 -10
  229. package/modules/adtrgtmeBidAdapter.js +1 -1
  230. package/modules/advRedAnalyticsAdapter.js +198 -0
  231. package/modules/advRedAnalyticsAdapter.md +30 -0
  232. package/modules/akamaiDapRtdProvider.js +19 -798
  233. package/modules/anonymisedRtdProvider.js +5 -1
  234. package/modules/anonymisedRtdProvider.md +1 -1
  235. package/modules/apacdexBidAdapter.js +1 -1
  236. package/modules/appnexusBidAdapter.js +56 -2
  237. package/modules/automatadAnalyticsAdapter.js +2 -0
  238. package/modules/azerionedgeRtdProvider.js +13 -3
  239. package/modules/azerionedgeRtdProvider.md +0 -17
  240. package/modules/bridBidAdapter.js +47 -47
  241. package/modules/cleanioRtdProvider.js +1 -0
  242. package/modules/concertBidAdapter.js +1 -1
  243. package/modules/connatixBidAdapter.js +36 -8
  244. package/modules/connectIdSystem.js +3 -1
  245. package/modules/contxtfulRtdProvider.js +20 -2
  246. package/modules/contxtfulRtdProvider.md +1 -0
  247. package/modules/craftBidAdapter.js +1 -1
  248. package/modules/criteoBidAdapter.js +1 -1
  249. package/modules/cwireBidAdapter.js +5 -1
  250. package/modules/dailymotionBidAdapter.js +85 -65
  251. package/modules/debugging/debugging.js +3 -0
  252. package/modules/dfpAdServerVideo.js +15 -33
  253. package/modules/dfpAdpod.js +2 -6
  254. package/modules/dgkeywordRtdProvider.js +2 -0
  255. package/modules/discoveryBidAdapter.js +26 -210
  256. package/modules/dspxBidAdapter.js +176 -54
  257. package/modules/eightPodAnalyticsAdapter.js +28 -34
  258. package/modules/eightPodBidAdapter.js +113 -57
  259. package/modules/fintezaAnalyticsAdapter.js +9 -4
  260. package/modules/goldbachBidAdapter.js +1 -1
  261. package/modules/gptPreAuction.js +63 -4
  262. package/modules/growthCodeAnalyticsAdapter.js +1 -1
  263. package/modules/growthCodeRtdProvider.js +1 -1
  264. package/modules/gumgumBidAdapter.js +14 -10
  265. package/modules/improvedigitalBidAdapter.js +1 -1
  266. package/modules/intentIqAnalyticsAdapter.js +234 -0
  267. package/modules/intentIqAnalyticsAdapter.md +27 -0
  268. package/modules/intentIqIdSystem.md +0 -0
  269. package/modules/jwplayerBidAdapter.js +1 -1
  270. package/modules/jwplayerRtdProvider.js +26 -6
  271. package/modules/jwplayerVideoProvider.js +6 -0
  272. package/modules/mediafuseBidAdapter.js +1 -1
  273. package/modules/mediagoBidAdapter.js +7 -176
  274. package/modules/medianetBidAdapter.js +101 -40
  275. package/modules/mgidBidAdapter.js +3 -1
  276. package/modules/mobianRtdProvider.js +16 -2
  277. package/modules/nextMillenniumBidAdapter.js +1 -27
  278. package/modules/nobidBidAdapter.js +1 -1
  279. package/modules/optoutBidAdapter.js +1 -1
  280. package/modules/paapi.js +48 -35
  281. package/modules/permutiveRtdProvider.js +72 -22
  282. package/modules/playdigoBidAdapter.js +4 -2
  283. package/modules/prebidServerBidAdapter/index.js +4 -2
  284. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
  285. package/modules/programmaticaBidAdapter.js +1 -1
  286. package/modules/pubmaticBidAdapter.js +12 -0
  287. package/modules/pubxaiAnalyticsAdapter.js +306 -164
  288. package/modules/relevatehealthBidAdapter.js +2 -1
  289. package/modules/richaudienceBidAdapter.js +1 -1
  290. package/modules/rtdModule/index.js +5 -3
  291. package/modules/sirdataRtdProvider.js +2 -0
  292. package/modules/sizeMapping.js +2 -5
  293. package/modules/smaatoBidAdapter.js +18 -1
  294. package/modules/smilewantedBidAdapter.js +26 -22
  295. package/modules/snigelBidAdapter.js +1 -1
  296. package/modules/sonobiBidAdapter.js +5 -10
  297. package/modules/symitriDapRtdProvider.js +812 -0
  298. package/modules/symitriDapRtdProvider.md +49 -0
  299. package/modules/targetVideoBidAdapter.js +120 -152
  300. package/modules/targetVideoBidAdapter.md +20 -3
  301. package/modules/userId/eids.js +3 -0
  302. package/modules/utiqIdSystem.js +12 -10
  303. package/modules/validationFpdModule/index.js +22 -17
  304. package/modules/videojsVideoProvider.js +3 -0
  305. package/modules/visxBidAdapter.js +1 -1
  306. package/modules/winrBidAdapter.js +2 -27
  307. package/modules/yahooAdsBidAdapter.js +1 -1
  308. package/modules/yandexIdSystem.js +1 -1
  309. package/package.json +4 -4
  310. package/plugins/eslint/index.js +73 -45
  311. package/src/adRendering.js +7 -3
  312. package/src/adloader.js +1 -0
  313. package/src/ajax.js +15 -0
  314. package/src/config.js +0 -4
  315. package/src/debugging.js +1 -0
  316. package/src/secureCreatives.js +1 -1
  317. package/src/storageManager.js +62 -73
  318. package/src/targeting.js +26 -20
  319. package/src/utils.js +9 -0
  320. package/test/pages/banner_sync.html +97 -0
  321. package/test/pages/consent_mgt_gdpr.html +1 -1
  322. package/test/spec/ajax_spec.js +11 -0
  323. package/test/spec/creative/crossDomainCreative_spec.js +26 -9
  324. package/test/spec/e2e/banner/basic_banner_ad.spec.js +20 -14
  325. package/test/spec/fpd/gdpr_spec.js +1 -1
  326. package/test/spec/libraries/userAgentUtils_spec.js +109 -0
  327. package/test/spec/modules/adagioRtdProvider_spec.js +72 -0
  328. package/test/spec/modules/admixerBidAdapter_spec.js +21 -17
  329. package/test/spec/modules/advRedAnalyticsAdapter_spec.js +114 -0
  330. package/test/spec/modules/adxcgBidAdapter_spec.js +1 -1
  331. package/test/spec/modules/appnexusBidAdapter_spec.js +36 -0
  332. package/test/spec/modules/azerionedgeRtdProvider_spec.js +36 -21
  333. package/test/spec/modules/connatixBidAdapter_spec.js +55 -2
  334. package/test/spec/modules/consentManagement_spec.js +1 -1
  335. package/test/spec/modules/contxtfulRtdProvider_spec.js +6 -0
  336. package/test/spec/modules/dailymotionBidAdapter_spec.js +497 -4
  337. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -6
  338. package/test/spec/modules/dspxBidAdapter_spec.js +188 -7
  339. package/test/spec/modules/eightPodAnalyticsAdapter_spec.js +22 -13
  340. package/test/spec/modules/gptPreAuction_spec.js +143 -1
  341. package/test/spec/modules/gumgumBidAdapter_spec.js +17 -0
  342. package/test/spec/modules/intentIqAnalyticsAdapter_spec.js +172 -0
  343. package/test/spec/modules/jwplayerRtdProvider_spec.js +61 -0
  344. package/test/spec/modules/mediagoBidAdapter_spec.js +34 -37
  345. package/test/spec/modules/medianetBidAdapter_spec.js +297 -16
  346. package/test/spec/modules/mgidBidAdapter_spec.js +15 -5
  347. package/test/spec/modules/mobianRtdProvider_spec.js +1 -3
  348. package/test/spec/modules/paapi_spec.js +177 -111
  349. package/test/spec/modules/permutiveRtdProvider_spec.js +42 -8
  350. package/test/spec/modules/prebidServerBidAdapter_spec.js +17 -3
  351. package/test/spec/modules/proxistoreBidAdapter_spec.js +1 -1
  352. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  353. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +970 -603
  354. package/test/spec/modules/pulsepointBidAdapter_spec.js +4 -4
  355. package/test/spec/modules/smaatoBidAdapter_spec.js +36 -1
  356. package/test/spec/modules/smilewantedBidAdapter_spec.js +57 -1
  357. package/test/spec/modules/symitriDapRtdProvider_spec.js +600 -0
  358. package/test/spec/modules/targetVideoBidAdapter_spec.js +112 -11
  359. package/test/spec/modules/yandexIdSystem_spec.js +6 -1
  360. package/test/spec/schainSerializer/schainSerializer_spec.js +138 -0
  361. package/test/spec/unit/core/storageManager_spec.js +68 -51
  362. package/test/spec/utils_spec.js +19 -0
  363. /package/src/utils/{gpdr.js → gdpr.js} +0 -0
@@ -2,6 +2,7 @@ const expect = require('chai').expect;
2
2
  const {setupTest, testPageURL} = require('../../../helpers/testing-utils');
3
3
 
4
4
  const TEST_PAGE_URL = testPageURL('banner.html?pbjs_debug=true');
5
+ const SYNC_PAGE_URL = testPageURL('banner_sync.html?pbjs_debug=true');
5
6
  const CREATIVE_IFRAME_ID = 'google_ads_iframe_/19968336/header-bid-tag-0_0';
6
7
  const CREATIVE_IFRAME_CSS_SELECTOR = 'iframe[id="' + CREATIVE_IFRAME_ID + '"]';
7
8
 
@@ -14,20 +15,25 @@ const EXPECTED_TARGETING_KEYS = {
14
15
  'hb_bidder_appnexus': 'appnexus'
15
16
  };
16
17
 
17
- setupTest({
18
- url: TEST_PAGE_URL,
19
- waitFor: CREATIVE_IFRAME_CSS_SELECTOR,
20
- expectGAMCreative: true
21
- }, 'Prebid.js Banner Ad Unit Test', function () {
22
- it('should load the targeting keys with correct values', async function () {
23
- const result = await browser.execute(function () {
24
- return window.pbjs.getAdserverTargeting('div-gpt-ad-1460505748561-1');
25
- });
26
- const targetingKeys = result['div-gpt-ad-1460505748561-1'];
18
+ Object.entries({
19
+ 'synchronously': SYNC_PAGE_URL,
20
+ 'asynchronously': TEST_PAGE_URL,
21
+ }).forEach(([t, testPage]) => {
22
+ setupTest({
23
+ url: testPage,
24
+ waitFor: CREATIVE_IFRAME_CSS_SELECTOR,
25
+ expectGAMCreative: true
26
+ }, `Prebid.js Banner Ad Unit Test (loading ${t})`, function () {
27
+ it('should load the targeting keys with correct values', async function () {
28
+ const result = await browser.execute(function () {
29
+ return window.pbjs.getAdserverTargeting('div-gpt-ad-1460505748561-1');
30
+ });
31
+ const targetingKeys = result['div-gpt-ad-1460505748561-1'];
27
32
 
28
- expect(targetingKeys).to.include(EXPECTED_TARGETING_KEYS);
29
- expect(targetingKeys.hb_adid).to.be.a('string');
30
- expect(targetingKeys.hb_adid_appnexus).to.be.a('string');
31
- expect(targetingKeys.hb_size).to.satisfy((size) => size === '300x250' || '300x600');
33
+ expect(targetingKeys).to.include(EXPECTED_TARGETING_KEYS);
34
+ expect(targetingKeys.hb_adid).to.be.a('string');
35
+ expect(targetingKeys.hb_adid_appnexus).to.be.a('string');
36
+ expect(targetingKeys.hb_size).to.satisfy((size) => size === '300x250' || '300x600');
37
+ });
32
38
  });
33
39
  });
@@ -34,7 +34,7 @@ describe('GDPR FPD enrichment', () => {
34
34
  })
35
35
  });
36
36
 
37
- it('sets user.ext.consent, but not regs.ext.gdpr, if gpdrApplies is not a boolean', () => {
37
+ it('sets user.ext.consent, but not regs.ext.gdpr, if gdprApplies is not a boolean', () => {
38
38
  consent = {consentString: 'mock-consent'};
39
39
  return callHook().then(ortb2 => {
40
40
  expect(ortb2).to.eql({
@@ -0,0 +1,109 @@
1
+ /* globals describe, beforeEach, afterEach, sinon */
2
+ import { expect } from 'chai';
3
+ import { getDeviceType, getBrowser, getOS } from 'libraries/userAgentUtils';
4
+ import { deviceTypes, browserTypes, osTypes } from 'libraries/userAgentUtils/userAgentTypes.enums';
5
+
6
+ const ORIGINAL_USER_AGENT = window.navigator.userAgent;
7
+ const ORIGINAL_VENDOR = window.navigator.vendor;
8
+ const ORIGINAL_APP_VERSION = window.navigator.appVersion;
9
+
10
+ describe('Test user agent categorization', () => {
11
+ afterEach(() => {
12
+ window.navigator.__defineGetter__('userAgent', () => ORIGINAL_USER_AGENT);
13
+ window.navigator.__defineGetter__('vendor', () => ORIGINAL_VENDOR);
14
+ window.navigator.__defineGetter__('appVersion', () => ORIGINAL_APP_VERSION);
15
+ })
16
+
17
+ describe('test getDeviceType', () => {
18
+ it('user agent device type is tablet', () => {
19
+ const tabletUserAgent = 'Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4.17.9 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3'
20
+ window.navigator.__defineGetter__('userAgent', () => tabletUserAgent);
21
+ expect(getDeviceType()).to.equal(deviceTypes.TABLET);
22
+ })
23
+ it('user agent device type is mobile', () => {
24
+ const mobileUserAgent = 'Mozilla/5.0 (Linux; Android 12; M2102J20SG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36'
25
+ window.navigator.__defineGetter__('userAgent', () => mobileUserAgent);
26
+ expect(getDeviceType()).to.equal(deviceTypes.MOBILE);
27
+ })
28
+ it('user agent device type is desktop', () => {
29
+ const desktopUserAgent = 'Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36'
30
+ window.navigator.__defineGetter__('userAgent', () => desktopUserAgent);
31
+ expect(getDeviceType()).to.equal(deviceTypes.DESKTOP);
32
+ })
33
+ })
34
+
35
+ describe('test getBrowser', () => {
36
+ it('user agent browser is edge', () => {
37
+ const edgeUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10532'
38
+ window.navigator.__defineGetter__('userAgent', () => edgeUserAgent);
39
+ expect(getBrowser()).to.equal(browserTypes.EDGE);
40
+ })
41
+ it('user agent browser is chrome', () => {
42
+ const chromeUserAgent = 'Mozilla/5.0 (iPad; CPU OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/44.0.2403.67 Mobile/12H143 Safari/600.1.4'
43
+ window.navigator.__defineGetter__('userAgent', () => chromeUserAgent);
44
+ expect(getBrowser()).to.equal(browserTypes.CHROME);
45
+ })
46
+ it('user agent browser is firefox', () => {
47
+ const firefoxUserAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:40.0) Gecko/20100101 Firefox/40.0.2 Waterfox/40.0.2'
48
+ window.navigator.__defineGetter__('userAgent', () => firefoxUserAgent);
49
+ expect(getBrowser()).to.equal(browserTypes.FIREFOX);
50
+ })
51
+ it('user agent browser is safari', () => {
52
+ const safariUserAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36'
53
+ window.navigator.__defineGetter__('userAgent', () => safariUserAgent);
54
+ window.navigator.__defineGetter__('vendor', () => 'Apple Computer, Inc.');
55
+ expect(getBrowser()).to.equal(browserTypes.SAFARI);
56
+ })
57
+ it('user agent browser is internet explorer', () => {
58
+ const internetexplorerUserAgent = 'Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
59
+ window.navigator.__defineGetter__('userAgent', () => internetexplorerUserAgent);
60
+ expect(getBrowser()).to.equal(browserTypes.INTERNET_EXPLORER);
61
+ })
62
+ it('user agent is other', () => {
63
+ const otherUserAgent = 'Dalvik/2.1.0 (Linux; U; Android 9; ADT-2 Build/PTT5.181126.002)'
64
+ window.navigator.__defineGetter__('userAgent', () => otherUserAgent);
65
+ expect(getBrowser()).to.equal(browserTypes.OTHER);
66
+ })
67
+ })
68
+
69
+ describe('test getOS', () => {
70
+ it('user agent is android', () => {
71
+ const androidUserAgent = 'Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0'
72
+ window.navigator.__defineGetter__('userAgent', () => androidUserAgent);
73
+ expect(getOS()).to.equal(osTypes.ANDROID);
74
+ })
75
+ it('user agent is ios', () => {
76
+ const iosUserAgent = 'Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4'
77
+ window.navigator.__defineGetter__('userAgent', () => iosUserAgent);
78
+ expect(getOS()).to.equal(osTypes.IOS);
79
+ })
80
+ it('user agent is windows', () => {
81
+ const windowsUserAgent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36'
82
+ window.navigator.__defineGetter__('userAgent', () => windowsUserAgent);
83
+ expect(getOS()).to.equal(osTypes.WINDOWS);
84
+ })
85
+ it('user agent is mac', () => {
86
+ const macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0'
87
+ window.navigator.__defineGetter__('userAgent', () => macUserAgent);
88
+ expect(getOS()).to.equal(osTypes.MAC);
89
+ })
90
+ it('user agent is linux', () => {
91
+ const linuxUserAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0'
92
+ window.navigator.__defineGetter__('userAgent', () => linuxUserAgent);
93
+ expect(getOS()).to.equal(osTypes.LINUX);
94
+ })
95
+ it('user agent is unix', () => {
96
+ const unixUserAgent = 'Mozilla/5.0 (X11; CrOS armv7l 7077.134.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.156 Safari/537.36'
97
+ const unixappVersion = '5.0 (X11; CrOS armv7l 7077.134.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.156 Safari/537.36'
98
+ window.navigator.__defineGetter__('userAgent', () => unixUserAgent);
99
+ window.navigator.__defineGetter__('appVersion', () => unixappVersion);
100
+ expect(getOS()).to.equal(osTypes.UNIX);
101
+ })
102
+ it('user agent is other', () => {
103
+ const otherUserAgent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
104
+ window.navigator.__defineGetter__('userAgent', () => otherUserAgent);
105
+ window.navigator.__defineGetter__('appVersion', () => '');
106
+ expect(getOS()).to.equal(osTypes.OTHER);
107
+ })
108
+ })
109
+ })
@@ -118,6 +118,7 @@ describe('Adagio Rtd Provider', function () {
118
118
  describe('store session data in localStorage', function () {
119
119
  const session = {
120
120
  lastActivityTime: 1714116520700,
121
+ id: 'uid-1234',
121
122
  rnd: 0.5697,
122
123
  vwSmplg: 0.1,
123
124
  vwSmplgNxt: 0.1
@@ -128,6 +129,7 @@ describe('Adagio Rtd Provider', function () {
128
129
  sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
129
130
  sandbox.stub(Date, 'now').returns(1714116520710);
130
131
  sandbox.stub(Math, 'random').returns(0.8);
132
+ sandbox.stub(utils, 'generateUUID').returns('uid-1234');
131
133
 
132
134
  const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
133
135
 
@@ -136,6 +138,7 @@ describe('Adagio Rtd Provider', function () {
136
138
  const expected = {
137
139
  session: {
138
140
  new: true,
141
+ id: utils.generateUUID(),
139
142
  rnd: Math.random()
140
143
  }
141
144
  }
@@ -176,6 +179,7 @@ describe('Adagio Rtd Provider', function () {
176
179
  sandbox.stub(Date, 'now').returns(1715679344351);
177
180
  sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
178
181
  sandbox.stub(Math, 'random').returns(0.8);
182
+ sandbox.stub(utils, 'generateUUID').returns('uid-5678');
179
183
 
180
184
  const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
181
185
 
@@ -185,6 +189,7 @@ describe('Adagio Rtd Provider', function () {
185
189
  session: {
186
190
  ...session,
187
191
  new: true,
192
+ id: utils.generateUUID(),
188
193
  rnd: Math.random(),
189
194
  }
190
195
  }
@@ -196,6 +201,73 @@ describe('Adagio Rtd Provider', function () {
196
201
  }).calledOnce).to.be.true;
197
202
  });
198
203
  });
204
+
205
+ describe('store session data in localStorage when used with external AB Test snippet', function () {
206
+ const sessionWithABTest = {
207
+ lastActivityTime: 1714116520700,
208
+ id: 'uid-1234',
209
+ rnd: 0.5697,
210
+ vwSmplg: 0.1,
211
+ vwSmplgNxt: 0.1,
212
+ testName: 'adg-test',
213
+ testVersion: 'srv',
214
+ initiator: 'snippet'
215
+ };
216
+
217
+ it('store new session data instancied by the AB Test snippet for further usage', function () {
218
+ const sessionWithNewFlag = { ...sessionWithABTest, new: true };
219
+ const storageValue = JSON.stringify({session: sessionWithNewFlag});
220
+ sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
221
+ sandbox.stub(Date, 'now').returns(1714116520710);
222
+ sandbox.stub(Math, 'random').returns(0.8);
223
+
224
+ const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
225
+
226
+ adagioRtdSubmodule.init(config);
227
+
228
+ const expected = {
229
+ session: {
230
+ ...sessionWithNewFlag
231
+ }
232
+ }
233
+
234
+ expect(spy.withArgs({
235
+ action: 'session',
236
+ ts: Date.now(),
237
+ data: expected,
238
+ }).calledOnce).to.be.true;
239
+ });
240
+
241
+ it('store new session data after removing AB Test props when initiator is not the snippet', function () {
242
+ const sessionWithNewFlag = { ...sessionWithABTest, new: false, initiator: 'adgjs' };
243
+ const storageValue = JSON.stringify({session: sessionWithNewFlag});
244
+ sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
245
+ sandbox.stub(Date, 'now').returns(1714116520710);
246
+ sandbox.stub(Math, 'random').returns(0.8);
247
+ sandbox.stub(utils, 'generateUUID').returns('uid-5678');
248
+
249
+ const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
250
+
251
+ adagioRtdSubmodule.init(config);
252
+
253
+ const expected = {
254
+ session: {
255
+ ...sessionWithNewFlag,
256
+ new: true,
257
+ id: utils.generateUUID(),
258
+ rnd: Math.random(),
259
+ }
260
+ }
261
+ delete expected.session.testName;
262
+ delete expected.session.testVersion;
263
+
264
+ expect(spy.withArgs({
265
+ action: 'session',
266
+ ts: Date.now(),
267
+ data: expected,
268
+ }).calledOnce).to.be.true;
269
+ });
270
+ });
199
271
  });
200
272
 
201
273
  describe('submodule `getBidRequestData`', function () {
@@ -4,7 +4,7 @@ import {newBidder} from 'src/adapters/bidderFactory.js';
4
4
  import {config} from '../../../src/config.js';
5
5
 
6
6
  const BIDDER_CODE = 'admixer';
7
- const WL_BIDDER_CODE = 'admixerwl'
7
+ const RTB_BIDDER_CODE = 'rtbstack'
8
8
  const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
9
9
  const ENDPOINT_URL_CUSTOM = 'https://custom.admixer.net/prebid.aspx';
10
10
  const ZONE_ID = '2eb6bd58-865c-47ce-af7f-a918108c3fd2';
@@ -37,11 +37,10 @@ describe('AdmixerAdapter', function () {
37
37
  auctionId: '1d1a030790a475',
38
38
  };
39
39
 
40
- let wlBid = {
41
- bidder: WL_BIDDER_CODE,
40
+ let rtbBid = {
41
+ bidder: RTB_BIDDER_CODE,
42
42
  params: {
43
- clientId: CLIENT_ID,
44
- endpointId: ENDPOINT_ID,
43
+ tagId: ENDPOINT_ID,
45
44
  },
46
45
  adUnitCode: 'adunit-code',
47
46
  sizes: [
@@ -56,8 +55,8 @@ describe('AdmixerAdapter', function () {
56
55
  it('should return true when required params found', function () {
57
56
  expect(spec.isBidRequestValid(bid)).to.equal(true);
58
57
  });
59
- it('should return true when params required by WL found', function () {
60
- expect(spec.isBidRequestValid(wlBid)).to.equal(true);
58
+ it('should return true when params required by RTB found', function () {
59
+ expect(spec.isBidRequestValid(rtbBid)).to.equal(true);
61
60
  });
62
61
 
63
62
  it('should return false when required params are not passed', function () {
@@ -68,8 +67,8 @@ describe('AdmixerAdapter', function () {
68
67
  };
69
68
  expect(spec.isBidRequestValid(invalidBid)).to.equal(false);
70
69
  });
71
- it('should return false when params required by WL are not passed', function () {
72
- let invalidBid = Object.assign({}, wlBid);
70
+ it('should return false when params required by RTB are not passed', function () {
71
+ let invalidBid = Object.assign({}, rtbBid);
73
72
  delete invalidBid.params;
74
73
  invalidBid.params = {
75
74
  clientId: 0,
@@ -118,7 +117,7 @@ describe('AdmixerAdapter', function () {
118
117
  it('sends bid request to CUSTOM_ENDPOINT via GET', function () {
119
118
  config.setBidderConfig({
120
119
  bidders: [BIDDER_CODE], // one or more bidders
121
- config: { [BIDDER_CODE]: { endpoint_url: ENDPOINT_URL_CUSTOM } },
120
+ config: { bidderURL: ENDPOINT_URL_CUSTOM },
122
121
  });
123
122
  const request = config.runWithBidder(BIDDER_CODE, () =>
124
123
  spec.buildRequests(validRequest, bidderRequest)
@@ -133,9 +132,8 @@ describe('AdmixerAdapter', function () {
133
132
  validRequest: [
134
133
  {
135
134
  bidder: bidder,
136
- params: bidder === 'admixerwl' ? {
137
- clientId: CLIENT_ID,
138
- endpointId: ENDPOINT_ID
135
+ params: bidder === 'rtbstack' ? {
136
+ tagId: ENDPOINT_ID
139
137
  } : {
140
138
  zone: ZONE_ID,
141
139
  },
@@ -193,10 +191,16 @@ describe('AdmixerAdapter', function () {
193
191
  expect(request.url).to.equal('https://inv-nets.admixer.net/adxprebid.1.2.aspx');
194
192
  expect(request.method).to.equal('POST');
195
193
  });
196
- it('build request for admixerwl', function () {
197
- const requestParams = requestParamsFor('admixerwl');
198
- const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
199
- expect(request.url).to.equal(`https://inv-nets-adxwl.admixer.com/adxwlprebid.aspx?client=${CLIENT_ID}`);
194
+ it('build request for rtbstack', function () {
195
+ const requestParams = requestParamsFor('rtbstack');
196
+ config.setBidderConfig({
197
+ bidders: ['rtbstack'],
198
+ config: { bidderURL: ENDPOINT_URL_CUSTOM },
199
+ });
200
+ const request = config.runWithBidder(BIDDER_CODE, () =>
201
+ spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest)
202
+ );
203
+ expect(request.url).to.equal(ENDPOINT_URL_CUSTOM);
200
204
  expect(request.method).to.equal('POST');
201
205
  });
202
206
  });
@@ -0,0 +1,114 @@
1
+ import advRedAnalytics from 'modules/advRedAnalyticsAdapter.js';
2
+ import {expect} from 'chai';
3
+ import {server} from 'test/mocks/xhr.js';
4
+ import {expectEvents} from '../../helpers/analytics.js';
5
+ import { EVENTS } from 'src/constants.js';
6
+ import sinon from 'sinon';
7
+
8
+ let events = require('src/events');
9
+
10
+ describe('AdvRed Analytics Adapter', function () {
11
+ let bidWonEvent = {
12
+ 'bidderCode': 'appnexus',
13
+ 'width': 300,
14
+ 'height': 250,
15
+ 'adId': '1ebb82ec35375e',
16
+ 'mediaType': 'banner',
17
+ 'cpm': 0.5,
18
+ 'requestId': '1582271863760569973',
19
+ 'creative_id': '96846035',
20
+ 'creativeId': '96846035',
21
+ 'ttl': 60,
22
+ 'currency': 'USD',
23
+ 'netRevenue': true,
24
+ 'auctionId': '9c7b70b9-b6ab-4439-9e71-b7b382797c18',
25
+ 'responseTimestamp': 1537521629657,
26
+ 'requestTimestamp': 1537521629331,
27
+ 'bidder': 'appnexus',
28
+ 'adUnitCode': 'div-gpt-ad-1460505748561-0',
29
+ 'timeToRespond': 326,
30
+ 'size': '300x250',
31
+ 'status': 'rendered',
32
+ 'eventType': 'bidWon',
33
+ 'ad': 'some ad',
34
+ 'adUrl': 'ad url'
35
+ };
36
+
37
+ describe('AdvRed Analytic tests', function () {
38
+ beforeEach(function () {
39
+ sinon.stub(events, 'getEvents').returns([]);
40
+ });
41
+
42
+ afterEach(function () {
43
+ advRedAnalytics.disableAnalytics();
44
+ events.getEvents.restore();
45
+ });
46
+
47
+ it('support custom endpoint', function () {
48
+ let custom_endpoint = 'custom url';
49
+ advRedAnalytics.enableAnalytics({
50
+ provider: 'advRed',
51
+ options: {
52
+ url: custom_endpoint,
53
+ publisherId: '1234567890'
54
+ }
55
+ });
56
+
57
+ expect(advRedAnalytics.getOptions().url).to.equal(custom_endpoint);
58
+ });
59
+
60
+ it('bid won event', function() {
61
+ let publisherId = '1234567890';
62
+ advRedAnalytics.enableAnalytics({
63
+ provider: 'advRed',
64
+ options: {
65
+ publisherId: publisherId
66
+ }
67
+ });
68
+
69
+ events.emit(EVENTS.BID_WON, bidWonEvent);
70
+ advRedAnalytics.sendEvents();
71
+
72
+ expect(server.requests.length).to.equal(1);
73
+ expect(server.requests[0].url).to.equal('https://api.adv.red/api/event');
74
+
75
+ const message = JSON.parse(server.requests[0].requestBody);
76
+ expect(message.pwId).to.exist;
77
+ expect(message.publisherId).to.equal(publisherId);
78
+ expect(message.events.length).to.equal(1);
79
+ expect(message.events[0].eventType).to.equal('bidWon');
80
+ expect(message.events[0].ad).to.be.undefined;
81
+ expect(message.events[0].adUrl).to.be.undefined;
82
+ });
83
+
84
+ it('track event', function () {
85
+ sinon.spy(advRedAnalytics, 'track');
86
+
87
+ advRedAnalytics.enableAnalytics({
88
+ provider: 'advRed',
89
+ options: {
90
+ publisherId: '1234567890'
91
+ }
92
+ });
93
+
94
+ expectEvents().to.beTrackedBy(advRedAnalytics.track);
95
+ });
96
+ });
97
+
98
+ describe('pageUrl detection', function () {
99
+ afterEach(function () {
100
+ advRedAnalytics.disableAnalytics()
101
+ });
102
+ it('check pageUrl property', function () {
103
+ advRedAnalytics.enableAnalytics({
104
+ provider: 'advRed',
105
+ options: {
106
+ publisherId: '1234567890'
107
+ }
108
+ });
109
+
110
+ const message = JSON.parse(server.requests[0].requestBody);
111
+ expect(message.pageUrl).to.equal(window.top.location.href);
112
+ });
113
+ });
114
+ });
@@ -459,7 +459,7 @@ describe('adxcg v8 oRtbConverter Adapter Tests', function () {
459
459
  },
460
460
  gdprConsent: {
461
461
  gdprApplies: true,
462
- consentString: 'serialized_gpdr_data'
462
+ consentString: 'serialized_gdpr_data'
463
463
  },
464
464
  ortb2: {
465
465
  user: {
@@ -431,6 +431,42 @@ describe('AppNexusAdapter', function () {
431
431
  expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
432
432
  });
433
433
 
434
+ it('should convert and include ORTB2 device data when available', function () {
435
+ const bidRequest = deepClone(bidRequests[0]);
436
+ const bidderRequest = {
437
+ ortb2: {
438
+ device: {
439
+ w: 980,
440
+ h: 1720,
441
+ dnt: 0,
442
+ ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1',
443
+ language: 'en',
444
+ devicetype: 1,
445
+ make: 'Apple',
446
+ model: 'iPhone 12 Pro Max',
447
+ os: 'iOS',
448
+ osv: '17.4',
449
+ },
450
+ },
451
+ };
452
+
453
+ const expectedDeviceResult = {
454
+ useragent: bidderRequest.ortb2.device.ua,
455
+ devicetype: 'Mobile/Tablet - General',
456
+ make: bidderRequest.ortb2.device.make,
457
+ model: bidderRequest.ortb2.device.model,
458
+ os: bidderRequest.ortb2.device.os,
459
+ os_version: bidderRequest.ortb2.device.osv,
460
+ w: bidderRequest.ortb2.device.w,
461
+ h: bidderRequest.ortb2.device.h,
462
+ };
463
+
464
+ const request = spec.buildRequests([bidRequest], bidderRequest);
465
+ const payload = JSON.parse(request.data);
466
+
467
+ expect(payload.device).to.deep.equal(expectedDeviceResult);
468
+ });
469
+
434
470
  it('should add video property when adUnit includes a renderer', function () {
435
471
  const videoData = {
436
472
  mediaTypes: {
@@ -8,11 +8,17 @@ describe('Azerion Edge RTD submodule', function () {
8
8
  { id: '1', visits: 123 },
9
9
  { id: '2', visits: 456 },
10
10
  ];
11
-
11
+ const IMPROVEDIGITAL_GVLID = '253';
12
12
  const key = 'publisher123';
13
13
  const bidders = ['appnexus', 'improvedigital'];
14
14
  const process = { key: 'value' };
15
15
  const dataProvider = { name: 'azerionedge', waitForIt: true };
16
+ const userConsent = {gdpr: {gdprApplies: 'gdpr-applies', consentString: 'consent-string'}, usp: 'usp'};
17
+
18
+ const resetAll = () => {
19
+ window.azerionPublisherAudiences.resetHistory();
20
+ loadExternalScript.resetHistory();
21
+ }
16
22
 
17
23
  let reqBidsConfigObj;
18
24
  let storageStub;
@@ -33,7 +39,11 @@ describe('Azerion Edge RTD submodule', function () {
33
39
  let returned;
34
40
 
35
41
  beforeEach(function () {
36
- returned = azerionedgeRTD.azerionedgeSubmodule.init(dataProvider);
42
+ returned = azerionedgeRTD.azerionedgeSubmodule.init(dataProvider, userConsent);
43
+ });
44
+
45
+ it('should have the correct gvlid', () => {
46
+ expect(azerionedgeRTD.azerionedgeSubmodule.gvlid).to.equal(IMPROVEDIGITAL_GVLID);
37
47
  });
38
48
 
39
49
  it('should return true', function () {
@@ -49,18 +59,21 @@ describe('Azerion Edge RTD submodule', function () {
49
59
  expect(loadExternalScript.args[0][0]).to.deep.equal(expected);
50
60
  });
51
61
 
52
- it('should call azerionPublisherAudiencesStub with empty configuration', function () {
53
- expect(window.azerionPublisherAudiences.args[0][0]).to.deep.equal({});
62
+ [
63
+ ['gdprApplies', userConsent.gdpr.gdprApplies],
64
+ ['gdprConsent', userConsent.gdpr.consentString],
65
+ ['uspConsent', userConsent.usp],
66
+ ].forEach(([key, value]) => {
67
+ it(`should call azerionPublisherAudiencesStub with ${key}:${value}`, function () {
68
+ expect(window.azerionPublisherAudiences.args[0][0]).to.include({[key]: value});
69
+ });
54
70
  });
55
71
 
56
72
  describe('with key', function () {
57
73
  beforeEach(function () {
58
- window.azerionPublisherAudiences.resetHistory();
59
- loadExternalScript.resetHistory();
60
- returned = azerionedgeRTD.azerionedgeSubmodule.init({
61
- ...dataProvider,
62
- params: { key },
63
- });
74
+ resetAll();
75
+ const config = { ...dataProvider, params: { key } };
76
+ returned = azerionedgeRTD.azerionedgeSubmodule.init(config, userConsent);
64
77
  });
65
78
 
66
79
  it('should return true', function () {
@@ -75,22 +88,24 @@ describe('Azerion Edge RTD submodule', function () {
75
88
 
76
89
  describe('with process configuration', function () {
77
90
  beforeEach(function () {
78
- window.azerionPublisherAudiences.resetHistory();
79
- loadExternalScript.resetHistory();
80
- returned = azerionedgeRTD.azerionedgeSubmodule.init({
81
- ...dataProvider,
82
- params: { process },
83
- });
91
+ resetAll();
92
+ const config = { ...dataProvider, params: { process } };
93
+ returned = azerionedgeRTD.azerionedgeSubmodule.init(config, userConsent);
84
94
  });
85
95
 
86
96
  it('should return true', function () {
87
97
  expect(returned).to.equal(true);
88
98
  });
89
99
 
90
- it('should call azerionPublisherAudiencesStub with process configuration', function () {
91
- expect(window.azerionPublisherAudiences.args[0][0]).to.deep.equal(
92
- process
93
- );
100
+ [
101
+ ['gdprApplies', userConsent.gdpr.gdprApplies],
102
+ ['gdprConsent', userConsent.gdpr.consentString],
103
+ ['uspConsent', userConsent.usp],
104
+ ...Object.entries(process),
105
+ ].forEach(([key, value]) => {
106
+ it(`should call azerionPublisherAudiencesStub with ${key}:${value}`, function () {
107
+ expect(window.azerionPublisherAudiences.args[0][0]).to.include({[key]: value});
108
+ });
94
109
  });
95
110
  });
96
111
  });
@@ -111,7 +126,7 @@ describe('Azerion Edge RTD submodule', function () {
111
126
  );
112
127
  });
113
128
 
114
- it('does not run apply audiences to bidders', function () {
129
+ it('does not apply audiences to bidders', function () {
115
130
  expect(reqBidsConfigObj.ortb2Fragments.bidder).to.deep.equal({});
116
131
  });
117
132