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
@@ -1,675 +1,731 @@
1
- import pubxaiAnalyticsAdapter, {getBrowser, getDeviceType, getOS} from 'modules/pubxaiAnalyticsAdapter.js';
2
- import {expect} from 'chai';
3
- import adapterManager from 'src/adapterManager.js';
4
- import * as utils from 'src/utils.js';
5
- import {server} from 'test/mocks/xhr.js';
6
- import {getGptSlotInfoForAdUnitCode} from '../../../libraries/gptUtils/gptUtils.js';
1
+ /* globals describe, beforeEach, afterEach, sinon */
2
+ import { expect } from 'chai';
3
+ import { getGptSlotInfoForAdUnitCode } from 'libraries/gptUtils/gptUtils.js';
4
+ import { getDeviceType, getBrowser, getOS } from 'libraries/userAgentUtils';
5
+ import pubxaiAnalyticsAdapter, {
6
+ auctionCache,
7
+ } from 'modules/pubxaiAnalyticsAdapter.js';
7
8
  import { EVENTS } from 'src/constants.js';
9
+ import adapterManager from 'src/adapterManager.js';
10
+ import { getWindowLocation } from 'src/utils.js';
11
+ import { getGlobal } from 'src/prebidGlobal.js';
12
+ import * as events from 'src/events.js'
8
13
 
9
- let events = require('src/events');
14
+ const readBlobSafariCompat = (blob) => {
15
+ return new Promise((resolve, reject) => {
16
+ const reader = new FileReader();
17
+ reader.onload = () => resolve(reader.result)
18
+ reader.onerror = reject
19
+ reader.readAsText(blob)
20
+ })
21
+ }
10
22
 
11
- describe('pubxai analytics adapter', function() {
12
- beforeEach(function() {
23
+ describe('pubxai analytics adapter', () => {
24
+ beforeEach(() => {
25
+ getGlobal().refreshUserIds()
13
26
  sinon.stub(events, 'getEvents').returns([]);
14
27
  });
15
28
 
16
- afterEach(function() {
29
+ afterEach(() => {
17
30
  events.getEvents.restore();
18
31
  });
19
32
 
20
- describe('track', function() {
33
+ describe('track', () => {
21
34
  let initOptions = {
22
35
  samplingRate: '1',
23
- pubxId: '6c415fc0-8b0e-4cf5-be73-01526a4db625'
36
+ pubxId: '6c415fc0-8b0e-4cf5-be73-01526a4db625',
24
37
  };
25
38
 
26
- let location = utils.getWindowLocation();
27
- let storage = window.top['sessionStorage'];
39
+ let originalVS;
40
+
41
+ let location = getWindowLocation();
42
+
43
+ const replaceProperty = (obj, params) => {
44
+ let strObj = JSON.stringify(obj);
45
+ params.forEach(({ field, updated, replaced }) => {
46
+ strObj = strObj.replace(
47
+ new RegExp('"' + field + '":' + replaced, 'g'),
48
+ '"' + field + '":' + updated
49
+ );
50
+ });
51
+ return JSON.parse(strObj);
52
+ };
28
53
 
29
54
  let prebidEvent = {
30
- 'auctionInit': {
31
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
32
- 'timestamp': 1603865707180,
33
- 'auctionStatus': 'inProgress',
34
- 'adUnits': [{
35
- 'code': '/19968336/header-bid-tag-1',
36
- 'mediaTypes': {
37
- 'banner': {
38
- 'sizes': [
39
- [
40
- 300,
41
- 250
42
- ]
43
- ]
44
- }
45
- },
46
- 'bids': [{
47
- 'bidder': 'appnexus',
48
- 'params': {
49
- 'placementId': 13144370
55
+ auctionInit: {
56
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
57
+ timestamp: 1603865707180,
58
+ auctionStatus: 'inProgress',
59
+ adUnits: [
60
+ {
61
+ code: '/19968336/header-bid-tag-1',
62
+ mediaTypes: {
63
+ banner: {
64
+ sizes: [[300, 250]],
65
+ },
50
66
  },
51
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
52
- 'floorData': {
53
- 'skipped': false,
54
- 'skipRate': 0,
55
- 'modelVersion': 'test model 1.0',
56
- 'location': 'fetch',
57
- 'floorProvider': 'PubXFloorProvider',
58
- 'fetchStatus': 'success'
59
- }
60
- }],
61
- 'sizes': [
62
- [
63
- 300,
64
- 250
65
- ]
66
- ],
67
- 'transactionId': '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294'
68
- }],
69
- 'adUnitCodes': [
70
- '/19968336/header-bid-tag-1'
67
+ bids: [
68
+ {
69
+ bidder: 'appnexus',
70
+ params: {
71
+ placementId: 13144370,
72
+ },
73
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
74
+ floorData: {
75
+ skipped: false,
76
+ skipRate: 0,
77
+ modelVersion: 'test model 1.0',
78
+ location: 'fetch',
79
+ floorProvider: 'PubXFloorProvider',
80
+ fetchStatus: 'success',
81
+ },
82
+ },
83
+ ],
84
+ sizes: [[300, 250]],
85
+ transactionId: '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
86
+ },
71
87
  ],
72
- 'bidderRequests': [{
73
- 'bidderCode': 'appnexus',
74
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
75
- 'bidderRequestId': '184cbc05bb90ba',
76
- 'bids': [{
77
- 'bidder': 'appnexus',
78
- 'params': {
79
- 'placementId': 13144370
80
- },
81
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
82
- 'floorData': {
83
- 'skipped': false,
84
- 'skipRate': 0,
85
- 'modelVersion': 'test model 1.0',
86
- 'location': 'fetch',
87
- 'floorProvider': 'PubXFloorProvider',
88
- 'fetchStatus': 'success'
88
+ adUnitCodes: ['/19968336/header-bid-tag-1'],
89
+ bidderRequests: [
90
+ {
91
+ bidderCode: 'appnexus',
92
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
93
+ bidderRequestId: '184cbc05bb90ba',
94
+ bids: [
95
+ {
96
+ bidder: 'appnexus',
97
+ params: {
98
+ placementId: 13144370,
99
+ },
100
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
101
+ floorData: {
102
+ skipped: false,
103
+ skipRate: 0,
104
+ modelVersion: 'test model 1.0',
105
+ location: 'fetch',
106
+ floorProvider: 'PubXFloorProvider',
107
+ fetchStatus: 'success',
108
+ },
109
+ mediaTypes: {
110
+ banner: {
111
+ sizes: [[300, 250]],
112
+ },
113
+ },
114
+ adUnitCode: '/19968336/header-bid-tag-1',
115
+ transactionId: '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
116
+ sizes: [[300, 250]],
117
+ bidId: '248f9a4489835e',
118
+ bidderRequestId: '184cbc05bb90ba',
119
+ src: 'client',
120
+ bidRequestsCount: 1,
121
+ bidderRequestsCount: 1,
122
+ bidderWinsCount: 0,
123
+ },
124
+ ],
125
+ ortb2: {
126
+ device: {
127
+ ext: {
128
+ cdep: true,
129
+ },
130
+ },
89
131
  },
90
- 'mediaTypes': {
91
- 'banner': {
92
- 'sizes': [
93
- [
94
- 300,
95
- 250
96
- ]
97
- ]
98
- }
132
+ auctionStart: 1603865707180,
133
+ timeout: 1000,
134
+ refererInfo: {
135
+ referer: 'http://local-pnh.net:8080/stream/',
136
+ reachedTop: true,
137
+ isAmp: false,
138
+ numIframes: 0,
139
+ stack: ['http://local-pnh.net:8080/stream/'],
140
+ canonicalUrl: null,
99
141
  },
100
- 'adUnitCode': '/19968336/header-bid-tag-1',
101
- 'transactionId': '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
102
- 'sizes': [
103
- [
104
- 300,
105
- 250
106
- ]
107
- ],
108
- 'bidId': '248f9a4489835e',
109
- 'bidderRequestId': '184cbc05bb90ba',
110
- 'src': 'client',
111
- 'bidRequestsCount': 1,
112
- 'bidderRequestsCount': 1,
113
- 'bidderWinsCount': 0
114
- }],
115
- 'auctionStart': 1603865707180,
116
- 'timeout': 1000,
117
- 'refererInfo': {
118
- 'referer': 'http://local-pnh.net:8080/stream/',
119
- 'reachedTop': true,
120
- 'isAmp': false,
121
- 'numIframes': 0,
122
- 'stack': [
123
- 'http://local-pnh.net:8080/stream/'
124
- ],
125
- 'canonicalUrl': null
142
+ start: 1603865707182,
126
143
  },
127
- 'start': 1603865707182
128
- }],
129
- 'noBids': [],
130
- 'bidsReceived': [],
131
- 'winningBids': [],
132
- 'timeout': 1000,
133
- 'config': {
134
- 'samplingRate': '1',
135
- 'pubxId': '6c415fc0-8b0e-4cf5-be73-01526a4db625'
136
- }
144
+ ],
145
+ noBids: [],
146
+ bidsReceived: [],
147
+ winningBids: [],
148
+ timeout: 1000,
149
+ config: {
150
+ samplingRate: '1',
151
+ pubxId: '6c415fc0-8b0e-4cf5-be73-01526a4db625',
152
+ },
137
153
  },
138
- 'bidRequested': {
139
- 'bidderCode': 'appnexus',
140
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
141
- 'bidderRequestId': '184cbc05bb90ba',
142
- 'bids': [{
143
- 'bidder': 'appnexus',
144
- 'params': {
145
- 'placementId': 13144370
146
- },
147
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
148
- 'floorData': {
149
- 'skipped': false,
150
- 'skipRate': 0,
151
- 'modelVersion': 'test model 1.0',
152
- 'location': 'fetch',
153
- 'floorProvider': 'PubXFloorProvider',
154
- 'fetchStatus': 'success'
154
+ bidRequested: {
155
+ bidderCode: 'appnexus',
156
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
157
+ bidderRequestId: '184cbc05bb90ba',
158
+ bids: [
159
+ {
160
+ bidder: 'appnexus',
161
+ params: {
162
+ placementId: 13144370,
163
+ },
164
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
165
+ floorData: {
166
+ skipped: false,
167
+ skipRate: 0,
168
+ modelVersion: 'test model 1.0',
169
+ location: 'fetch',
170
+ floorProvider: 'PubXFloorProvider',
171
+ fetchStatus: 'success',
172
+ },
173
+ mediaTypes: {
174
+ banner: {
175
+ sizes: [[300, 250]],
176
+ },
177
+ },
178
+ adUnitCode: '/19968336/header-bid-tag-1',
179
+ transactionId: '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
180
+ sizes: [[300, 250]],
181
+ bidId: '248f9a4489835e',
182
+ bidderRequestId: '184cbc05bb90ba',
183
+ src: 'client',
184
+ bidRequestsCount: 1,
185
+ bidderRequestsCount: 1,
186
+ bidderWinsCount: 0,
155
187
  },
156
- 'mediaTypes': {
157
- 'banner': {
158
- 'sizes': [
159
- [
160
- 300,
161
- 250
162
- ]
163
- ]
164
- }
188
+ ],
189
+ ortb2: {
190
+ device: {
191
+ ext: {
192
+ cdep: true,
193
+ },
165
194
  },
166
- 'adUnitCode': '/19968336/header-bid-tag-1',
167
- 'transactionId': '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
168
- 'sizes': [
169
- [
170
- 300,
171
- 250
172
- ]
173
- ],
174
- 'bidId': '248f9a4489835e',
175
- 'bidderRequestId': '184cbc05bb90ba',
176
- 'src': 'client',
177
- 'bidRequestsCount': 1,
178
- 'bidderRequestsCount': 1,
179
- 'bidderWinsCount': 0
180
- }],
181
- 'auctionStart': 1603865707180,
182
- 'timeout': 1000,
183
- 'refererInfo': {
184
- 'referer': 'http://local-pnh.net:8080/stream/',
185
- 'reachedTop': true,
186
- 'isAmp': false,
187
- 'numIframes': 0,
188
- 'stack': [
189
- 'http://local-pnh.net:8080/stream/'
190
- ],
191
- 'canonicalUrl': null
192
195
  },
193
- 'start': 1603865707182
196
+ auctionStart: 1603865707180,
197
+ timeout: 1000,
198
+ refererInfo: {
199
+ referer: 'http://local-pnh.net:8080/stream/',
200
+ reachedTop: true,
201
+ isAmp: false,
202
+ numIframes: 0,
203
+ stack: ['http://local-pnh.net:8080/stream/'],
204
+ canonicalUrl: null,
205
+ },
206
+ start: 1603865707182,
194
207
  },
195
- 'bidTimeout': [],
196
- 'bidResponse': {
197
- 'bidderCode': 'appnexus',
198
- 'width': 300,
199
- 'height': 250,
200
- 'statusMessage': 'Bid available',
201
- 'adId': '32780c4bc382cb',
202
- 'requestId': '248f9a4489835e',
203
- 'mediaType': 'banner',
204
- 'source': 'client',
205
- 'cpm': 0.5,
206
- 'creativeId': 96846035,
207
- 'currency': 'USD',
208
- 'netRevenue': true,
209
- 'ttl': 300,
210
- 'adUnitCode': '/19968336/header-bid-tag-1',
211
- 'appnexus': {
212
- 'buyerMemberId': 9325
208
+ bidTimeout: [],
209
+ bidResponse: {
210
+ bidderCode: 'appnexus',
211
+ width: 300,
212
+ height: 250,
213
+ statusMessage: 'Bid available',
214
+ adId: '32780c4bc382cb',
215
+ requestId: '248f9a4489835e',
216
+ mediaType: 'banner',
217
+ source: 'client',
218
+ cpm: 0.5,
219
+ creativeId: 96846035,
220
+ currency: 'USD',
221
+ netRevenue: true,
222
+ ttl: 300,
223
+ adUnitCode: '/19968336/header-bid-tag-1',
224
+ appnexus: {
225
+ buyerMemberId: 9325,
213
226
  },
214
- 'meta': {
215
- 'advertiserId': 2529885
227
+ meta: {
228
+ advertiserId: 2529885,
216
229
  },
217
- 'ad': '<!-- Creative 96846035 served by Member 9325 via AppNexus -->',
218
- 'originalCpm': 0.5,
219
- 'originalCurrency': 'USD',
220
- 'floorData': {
221
- 'fetchStatus': 'success',
222
- 'floorProvider': 'PubXFloorProvider',
223
- 'location': 'fetch',
224
- 'modelVersion': 'test model 1.0',
225
- 'skipRate': 0,
226
- 'skipped': false,
227
- 'floorValue': 0.4,
228
- 'floorRule': '/19968336/header-bid-tag-1|banner',
229
- 'floorCurrency': 'USD',
230
- 'cpmAfterAdjustments': 0.5,
231
- 'enforcements': {
232
- 'enforceJS': true,
233
- 'enforcePBS': false,
234
- 'floorDeals': true,
235
- 'bidAdjustment': true
230
+ ad: '<!-- Creative 96846035 served by Member 9325 via AppNexus -->',
231
+ originalCpm: 0.5,
232
+ originalCurrency: 'USD',
233
+ floorData: {
234
+ fetchStatus: 'success',
235
+ floorProvider: 'PubXFloorProvider',
236
+ location: 'fetch',
237
+ modelVersion: 'test model 1.0',
238
+ skipRate: 0,
239
+ skipped: false,
240
+ floorValue: 0.4,
241
+ floorRule: '/19968336/header-bid-tag-1|banner',
242
+ floorCurrency: 'USD',
243
+ cpmAfterAdjustments: 0.5,
244
+ enforcements: {
245
+ enforceJS: true,
246
+ enforcePBS: false,
247
+ floorDeals: true,
248
+ bidAdjustment: true,
249
+ },
250
+ matchedFields: {
251
+ gptSlot: '/19968336/header-bid-tag-1',
252
+ mediaType: 'banner',
236
253
  },
237
- 'matchedFields': {
238
- 'gptSlot': '/19968336/header-bid-tag-1',
239
- 'mediaType': 'banner'
240
- }
241
254
  },
242
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
243
- 'responseTimestamp': 1616654313071,
244
- 'requestTimestamp': 1616654312804,
245
- 'bidder': 'appnexus',
246
- 'timeToRespond': 267,
247
- 'pbLg': '0.50',
248
- 'pbMg': '0.50',
249
- 'pbHg': '0.50',
250
- 'pbAg': '0.50',
251
- 'pbDg': '0.50',
252
- 'pbCg': '0.50',
253
- 'size': '300x250',
254
- 'adserverTargeting': {
255
- 'hb_bidder': 'appnexus',
256
- 'hb_adid': '32780c4bc382cb',
257
- 'hb_pb': '0.50',
258
- 'hb_size': '300x250',
259
- 'hb_source': 'client',
260
- 'hb_format': 'banner'
255
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
256
+ responseTimestamp: 1616654313071,
257
+ requestTimestamp: 1616654312804,
258
+ bidder: 'appnexus',
259
+ timeToRespond: 267,
260
+ pbLg: '0.50',
261
+ pbMg: '0.50',
262
+ pbHg: '0.50',
263
+ pbAg: '0.50',
264
+ pbDg: '0.50',
265
+ pbCg: '0.50',
266
+ size: '300x250',
267
+ adserverTargeting: {
268
+ hb_bidder: 'appnexus',
269
+ hb_adid: '32780c4bc382cb',
270
+ hb_pb: '0.50',
271
+ hb_size: '300x250',
272
+ hb_source: 'client',
273
+ hb_format: 'banner',
261
274
  },
262
275
  },
263
- 'auctionEnd': {
264
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
265
- 'timestamp': 1616654312804,
266
- 'auctionEnd': 1616654313090,
267
- 'auctionStatus': 'completed',
268
- 'adUnits': [{
269
- 'code': '/19968336/header-bid-tag-1',
270
- 'mediaTypes': {
271
- 'banner': {
272
- 'sizes': [
273
- [
274
- 300,
275
- 250
276
- ]
277
- ]
278
- }
276
+ auctionEnd: {
277
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
278
+ timestamp: 1616654312804,
279
+ auctionEnd: 1616654313090,
280
+ auctionStatus: 'completed',
281
+ adUnits: [
282
+ {
283
+ code: '/19968336/header-bid-tag-1',
284
+ mediaTypes: {
285
+ banner: {
286
+ sizes: [[300, 250]],
287
+ },
288
+ },
289
+ bids: [
290
+ {
291
+ bidder: 'appnexus',
292
+ params: {
293
+ placementId: 13144370,
294
+ },
295
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
296
+ floorData: {
297
+ skipped: false,
298
+ skipRate: 0,
299
+ modelVersion: 'test model 1.0',
300
+ location: 'fetch',
301
+ floorProvider: 'PubXFloorProvider',
302
+ fetchStatus: 'success',
303
+ },
304
+ },
305
+ ],
306
+ sizes: [[300, 250]],
307
+ transactionId: '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
279
308
  },
280
- 'bids': [{
281
- 'bidder': 'appnexus',
282
- 'params': {
283
- 'placementId': 13144370
309
+ ],
310
+ adUnitCodes: ['/19968336/header-bid-tag-1'],
311
+ bidderRequests: [
312
+ {
313
+ bidderCode: 'appnexus',
314
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
315
+ bidderRequestId: '184cbc05bb90ba',
316
+ bids: [
317
+ {
318
+ bidder: 'appnexus',
319
+ params: {
320
+ placementId: 13144370,
321
+ },
322
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
323
+ floorData: {
324
+ skipped: false,
325
+ skipRate: 0,
326
+ modelVersion: 'test model 1.0',
327
+ location: 'fetch',
328
+ floorProvider: 'PubXFloorProvider',
329
+ fetchStatus: 'success',
330
+ },
331
+ mediaTypes: {
332
+ banner: {
333
+ sizes: [[300, 250]],
334
+ },
335
+ },
336
+ adUnitCode: '/19968336/header-bid-tag-1',
337
+ transactionId: '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
338
+ sizes: [[300, 250]],
339
+ bidId: '248f9a4489835e',
340
+ bidderRequestId: '184cbc05bb90ba',
341
+ src: 'client',
342
+ bidRequestsCount: 1,
343
+ bidderRequestsCount: 1,
344
+ bidderWinsCount: 0,
345
+ },
346
+ ],
347
+ ortb2: {
348
+ device: {
349
+ ext: {
350
+ cdep: true,
351
+ },
352
+ },
284
353
  },
285
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
286
- 'floorData': {
287
- 'skipped': false,
288
- 'skipRate': 0,
289
- 'modelVersion': 'test model 1.0',
290
- 'location': 'fetch',
291
- 'floorProvider': 'PubXFloorProvider',
292
- 'fetchStatus': 'success'
293
- }
294
- }],
295
- 'sizes': [
296
- [
297
- 300,
298
- 250
299
- ]
300
- ],
301
- 'transactionId': '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294'
302
- }],
303
- 'adUnitCodes': [
304
- '/19968336/header-bid-tag-1'
354
+ auctionStart: 1603865707180,
355
+ timeout: 1000,
356
+ refererInfo: {
357
+ referer: 'http://local-pnh.net:8080/stream/',
358
+ reachedTop: true,
359
+ isAmp: false,
360
+ numIframes: 0,
361
+ stack: ['http://local-pnh.net:8080/stream/'],
362
+ canonicalUrl: null,
363
+ },
364
+ start: 1603865707182,
365
+ },
305
366
  ],
306
- 'bidderRequests': [{
307
- 'bidderCode': 'appnexus',
308
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
309
- 'bidderRequestId': '184cbc05bb90ba',
310
- 'bids': [{
311
- 'bidder': 'appnexus',
312
- 'params': {
313
- 'placementId': 13144370
367
+ noBids: [],
368
+ bidsReceived: [
369
+ {
370
+ bidderCode: 'appnexus',
371
+ width: 300,
372
+ height: 250,
373
+ statusMessage: 'Bid available',
374
+ adId: '32780c4bc382cb',
375
+ requestId: '248f9a4489835e',
376
+ mediaType: 'banner',
377
+ source: 'client',
378
+ cpm: 0.5,
379
+ creativeId: 96846035,
380
+ currency: 'USD',
381
+ netRevenue: true,
382
+ ttl: 300,
383
+ adUnitCode: '/19968336/header-bid-tag-1',
384
+ appnexus: {
385
+ buyerMemberId: 9325,
314
386
  },
315
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
316
- 'floorData': {
317
- 'skipped': false,
318
- 'skipRate': 0,
319
- 'modelVersion': 'test model 1.0',
320
- 'location': 'fetch',
321
- 'floorProvider': 'PubXFloorProvider',
322
- 'fetchStatus': 'success'
387
+ meta: {
388
+ advertiserId: 2529885,
323
389
  },
324
- 'mediaTypes': {
325
- 'banner': {
326
- 'sizes': [
327
- [
328
- 300,
329
- 250
330
- ]
331
- ]
332
- }
390
+ ad: '<!-- Creative 96846035 served by Member 9325 via AppNexus -->',
391
+ originalCpm: 0.5,
392
+ originalCurrency: 'USD',
393
+ floorData: {
394
+ fetchStatus: 'success',
395
+ floorProvider: 'PubXFloorProvider',
396
+ location: 'fetch',
397
+ modelVersion: 'test model 1.0',
398
+ skipRate: 0,
399
+ skipped: false,
400
+ floorValue: 0.4,
401
+ floorRule: '/19968336/header-bid-tag-1|banner',
402
+ floorCurrency: 'USD',
403
+ cpmAfterAdjustments: 0.5,
404
+ enforcements: {
405
+ enforceJS: true,
406
+ enforcePBS: false,
407
+ floorDeals: true,
408
+ bidAdjustment: true,
409
+ },
410
+ matchedFields: {
411
+ gptSlot: '/19968336/header-bid-tag-1',
412
+ mediaType: 'banner',
413
+ },
333
414
  },
334
- 'adUnitCode': '/19968336/header-bid-tag-1',
335
- 'transactionId': '41ec8eaf-3e7c-4a8b-8344-ab796ff6e294',
336
- 'sizes': [
337
- [
338
- 300,
339
- 250
340
- ]
341
- ],
342
- 'bidId': '248f9a4489835e',
343
- 'bidderRequestId': '184cbc05bb90ba',
344
- 'src': 'client',
345
- 'bidRequestsCount': 1,
346
- 'bidderRequestsCount': 1,
347
- 'bidderWinsCount': 0
348
- }],
349
- 'auctionStart': 1603865707180,
350
- 'timeout': 1000,
351
- 'refererInfo': {
352
- 'referer': 'http://local-pnh.net:8080/stream/',
353
- 'reachedTop': true,
354
- 'isAmp': false,
355
- 'numIframes': 0,
356
- 'stack': [
357
- 'http://local-pnh.net:8080/stream/'
358
- ],
359
- 'canonicalUrl': null
360
- },
361
- 'start': 1603865707182
362
- }],
363
- 'noBids': [],
364
- 'bidsReceived': [{
365
- 'bidderCode': 'appnexus',
366
- 'width': 300,
367
- 'height': 250,
368
- 'statusMessage': 'Bid available',
369
- 'adId': '32780c4bc382cb',
370
- 'requestId': '248f9a4489835e',
371
- 'mediaType': 'banner',
372
- 'source': 'client',
373
- 'cpm': 0.5,
374
- 'creativeId': 96846035,
375
- 'currency': 'USD',
376
- 'netRevenue': true,
377
- 'ttl': 300,
378
- 'adUnitCode': '/19968336/header-bid-tag-1',
379
- 'appnexus': {
380
- 'buyerMemberId': 9325
381
- },
382
- 'meta': {
383
- 'advertiserId': 2529885
384
- },
385
- 'ad': '<!-- Creative 96846035 served by Member 9325 via AppNexus -->',
386
- 'originalCpm': 0.5,
387
- 'originalCurrency': 'USD',
388
- 'floorData': {
389
- 'fetchStatus': 'success',
390
- 'floorProvider': 'PubXFloorProvider',
391
- 'location': 'fetch',
392
- 'modelVersion': 'test model 1.0',
393
- 'skipRate': 0,
394
- 'skipped': false,
395
- 'floorValue': 0.4,
396
- 'floorRule': '/19968336/header-bid-tag-1|banner',
397
- 'floorCurrency': 'USD',
398
- 'cpmAfterAdjustments': 0.5,
399
- 'enforcements': {
400
- 'enforceJS': true,
401
- 'enforcePBS': false,
402
- 'floorDeals': true,
403
- 'bidAdjustment': true
415
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
416
+ responseTimestamp: 1616654313071,
417
+ requestTimestamp: 1616654312804,
418
+ bidder: 'appnexus',
419
+ timeToRespond: 267,
420
+ pbLg: '0.50',
421
+ pbMg: '0.50',
422
+ pbHg: '0.50',
423
+ pbAg: '0.50',
424
+ pbDg: '0.50',
425
+ pbCg: '0.50',
426
+ size: '300x250',
427
+ adserverTargeting: {
428
+ hb_bidder: 'appnexus',
429
+ hb_adid: '32780c4bc382cb',
430
+ hb_pb: '0.50',
431
+ hb_size: '300x250',
432
+ hb_source: 'client',
433
+ hb_format: 'banner',
404
434
  },
405
- 'matchedFields': {
406
- 'gptSlot': '/19968336/header-bid-tag-1',
407
- 'mediaType': 'banner'
408
- }
409
- },
410
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
411
- 'responseTimestamp': 1616654313071,
412
- 'requestTimestamp': 1616654312804,
413
- 'bidder': 'appnexus',
414
- 'timeToRespond': 267,
415
- 'pbLg': '0.50',
416
- 'pbMg': '0.50',
417
- 'pbHg': '0.50',
418
- 'pbAg': '0.50',
419
- 'pbDg': '0.50',
420
- 'pbCg': '0.50',
421
- 'size': '300x250',
422
- 'adserverTargeting': {
423
- 'hb_bidder': 'appnexus',
424
- 'hb_adid': '32780c4bc382cb',
425
- 'hb_pb': '0.50',
426
- 'hb_size': '300x250',
427
- 'hb_source': 'client',
428
- 'hb_format': 'banner'
435
+ status: 'rendered',
436
+ params: [
437
+ {
438
+ placementId: 13144370,
439
+ },
440
+ ],
429
441
  },
430
- 'status': 'rendered',
431
- 'params': [{
432
- 'placementId': 13144370
433
- }]
434
- }],
435
- 'winningBids': [],
436
- 'timeout': 1000
442
+ ],
443
+ winningBids: [],
444
+ timeout: 1000,
437
445
  },
438
- 'bidWon': {
439
- 'bidderCode': 'appnexus',
440
- 'width': 300,
441
- 'height': 250,
442
- 'statusMessage': 'Bid available',
443
- 'adId': '32780c4bc382cb',
444
- 'requestId': '248f9a4489835e',
445
- 'mediaType': 'banner',
446
- 'source': 'client',
447
- 'cpm': 0.5,
448
- 'creativeId': 96846035,
449
- 'currency': 'USD',
450
- 'netRevenue': true,
451
- 'ttl': 300,
452
- 'adUnitCode': '/19968336/header-bid-tag-1',
453
- 'appnexus': {
454
- 'buyerMemberId': 9325
446
+ bidWon: {
447
+ bidderCode: 'appnexus',
448
+ width: 300,
449
+ height: 250,
450
+ statusMessage: 'Bid available',
451
+ adId: '32780c4bc382cb',
452
+ requestId: '248f9a4489835e',
453
+ mediaType: 'banner',
454
+ source: 'client',
455
+ cpm: 0.5,
456
+ creativeId: 96846035,
457
+ currency: 'USD',
458
+ netRevenue: true,
459
+ ttl: 300,
460
+ adUnitCode: '/19968336/header-bid-tag-1',
461
+ appnexus: {
462
+ buyerMemberId: 9325,
455
463
  },
456
- 'meta': {
457
- 'advertiserId': 2529885
464
+ meta: {
465
+ advertiserId: 2529885,
458
466
  },
459
- 'ad': '<!-- Creative 96846035 served by Member 9325 via AppNexus -->',
460
- 'originalCpm': 0.5,
461
- 'originalCurrency': 'USD',
462
- 'floorData': {
463
- 'fetchStatus': 'success',
464
- 'floorProvider': 'PubXFloorProvider',
465
- 'location': 'fetch',
466
- 'modelVersion': 'test model 1.0',
467
- 'skipRate': 0,
468
- 'skipped': false,
469
- 'floorValue': 0.4,
470
- 'floorRule': '/19968336/header-bid-tag-1|banner',
471
- 'floorCurrency': 'USD',
472
- 'cpmAfterAdjustments': 0.5,
473
- 'enforcements': {
474
- 'enforceJS': true,
475
- 'enforcePBS': false,
476
- 'floorDeals': true,
477
- 'bidAdjustment': true
467
+ ad: '<!-- Creative 96846035 served by Member 9325 via AppNexus -->',
468
+ originalCpm: 0.5,
469
+ originalCurrency: 'USD',
470
+ floorData: {
471
+ fetchStatus: 'success',
472
+ floorProvider: 'PubXFloorProvider',
473
+ location: 'fetch',
474
+ modelVersion: 'test model 1.0',
475
+ skipRate: 0,
476
+ skipped: false,
477
+ floorValue: 0.4,
478
+ floorRule: '/19968336/header-bid-tag-1|banner',
479
+ floorCurrency: 'USD',
480
+ cpmAfterAdjustments: 0.5,
481
+ enforcements: {
482
+ enforceJS: true,
483
+ enforcePBS: false,
484
+ floorDeals: true,
485
+ bidAdjustment: true,
486
+ },
487
+ matchedFields: {
488
+ gptSlot: '/19968336/header-bid-tag-1',
489
+ mediaType: 'banner',
478
490
  },
479
- 'matchedFields': {
480
- 'gptSlot': '/19968336/header-bid-tag-1',
481
- 'mediaType': 'banner'
482
- }
483
491
  },
484
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
485
- 'responseTimestamp': 1616654313071,
486
- 'requestTimestamp': 1616654312804,
487
- 'bidder': 'appnexus',
488
- 'timeToRespond': 267,
489
- 'pbLg': '0.50',
490
- 'pbMg': '0.50',
491
- 'pbHg': '0.50',
492
- 'pbAg': '0.50',
493
- 'pbDg': '0.50',
494
- 'pbCg': '0.50',
495
- 'size': '300x250',
496
- 'adserverTargeting': {
497
- 'hb_bidder': 'appnexus',
498
- 'hb_adid': '32780c4bc382cb',
499
- 'hb_pb': '0.50',
500
- 'hb_size': '300x250',
501
- 'hb_source': 'client',
502
- 'hb_format': 'banner'
492
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
493
+ responseTimestamp: 1616654313071,
494
+ requestTimestamp: 1616654312804,
495
+ bidder: 'appnexus',
496
+ timeToRespond: 267,
497
+ pbLg: '0.50',
498
+ pbMg: '0.50',
499
+ pbHg: '0.50',
500
+ pbAg: '0.50',
501
+ pbDg: '0.50',
502
+ pbCg: '0.50',
503
+ size: '300x250',
504
+ adserverTargeting: {
505
+ hb_bidder: 'appnexus',
506
+ hb_adid: '32780c4bc382cb',
507
+ hb_pb: '0.50',
508
+ hb_size: '300x250',
509
+ hb_source: 'client',
510
+ hb_format: 'banner',
503
511
  },
504
- 'status': 'rendered',
505
- 'params': [{
506
- 'placementId': 13144370
507
- }]
508
- },
509
- 'pageDetail': {
510
- 'host': location.host,
511
- 'path': location.pathname,
512
- 'search': location.search
512
+ status: 'rendered',
513
+ params: [
514
+ {
515
+ placementId: 13144370,
516
+ },
517
+ ],
513
518
  },
514
- 'pmcDetail': {
515
- 'bidDensity': storage.getItem('pbx:dpbid'),
516
- 'maxBid': storage.getItem('pbx:mxbid'),
517
- 'auctionId': storage.getItem('pbx:aucid')
518
- }
519
519
  };
520
520
 
521
521
  let expectedAfterBid = {
522
- 'bids': [{
523
- 'bidderCode': 'appnexus',
524
- 'bidId': '248f9a4489835e',
525
- 'adUnitCode': '/19968336/header-bid-tag-1',
526
- 'gptSlotCode': getGptSlotInfoForAdUnitCode('/19968336/header-bid-tag-1').gptSlot || null,
527
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
528
- 'sizes': '300x250',
529
- 'renderStatus': 2,
530
- 'requestTimestamp': 1616654312804,
531
- 'creativeId': 96846035,
532
- 'currency': 'USD',
533
- 'cpm': 0.5,
534
- 'netRevenue': true,
535
- 'mediaType': 'banner',
536
- 'statusMessage': 'Bid available',
537
- 'floorData': {
538
- 'fetchStatus': 'success',
539
- 'floorProvider': 'PubXFloorProvider',
540
- 'location': 'fetch',
541
- 'modelVersion': 'test model 1.0',
542
- 'skipRate': 0,
543
- 'skipped': false,
544
- 'floorValue': 0.4,
545
- 'floorRule': '/19968336/header-bid-tag-1|banner',
546
- 'floorCurrency': 'USD',
547
- 'cpmAfterAdjustments': 0.5,
548
- 'enforcements': {
549
- 'enforceJS': true,
550
- 'enforcePBS': false,
551
- 'floorDeals': true,
552
- 'bidAdjustment': true
522
+ bids: [
523
+ {
524
+ bidderCode: 'appnexus',
525
+ bidId: '248f9a4489835e',
526
+ adUnitCode: '/19968336/header-bid-tag-1',
527
+ gptSlotCode:
528
+ getGptSlotInfoForAdUnitCode('/19968336/header-bid-tag-1').gptSlot ||
529
+ null,
530
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
531
+ sizes: '300x250',
532
+ renderStatus: 2,
533
+ requestTimestamp: 1616654312804,
534
+ creativeId: 96846035,
535
+ currency: 'USD',
536
+ cpm: 0.5,
537
+ netRevenue: true,
538
+ mediaType: 'banner',
539
+ statusMessage: 'Bid available',
540
+ floorData: {
541
+ fetchStatus: 'success',
542
+ floorProvider: 'PubXFloorProvider',
543
+ location: 'fetch',
544
+ modelVersion: 'test model 1.0',
545
+ skipRate: 0,
546
+ skipped: false,
547
+ floorValue: 0.4,
548
+ floorRule: '/19968336/header-bid-tag-1|banner',
549
+ floorCurrency: 'USD',
550
+ cpmAfterAdjustments: 0.5,
551
+ enforcements: {
552
+ enforceJS: true,
553
+ enforcePBS: false,
554
+ floorDeals: true,
555
+ bidAdjustment: true,
556
+ },
557
+ matchedFields: {
558
+ gptSlot: '/19968336/header-bid-tag-1',
559
+ mediaType: 'banner',
560
+ },
553
561
  },
554
- 'matchedFields': {
555
- 'gptSlot': '/19968336/header-bid-tag-1',
556
- 'mediaType': 'banner'
557
- }
562
+ placementId: null,
563
+ timeToRespond: 267,
564
+ source: 'client',
565
+ responseTimestamp: 1616654313071,
558
566
  },
559
- 'timeToRespond': 267,
560
- 'responseTimestamp': 1616654313071
561
- }],
562
- 'pageDetail': {
563
- 'host': location.host,
564
- 'path': location.pathname,
565
- 'search': location.search,
566
- 'adUnits': [
567
- '/19968336/header-bid-tag-1'
568
- ]
567
+ ],
568
+ auctionDetail: {
569
+ adUnitCodes: ['/19968336/header-bid-tag-1'],
570
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
571
+ refreshRank: 0,
572
+ timestamp: 1616654312804,
573
+ },
574
+ pageDetail: {
575
+ host: location.host,
576
+ path: location.pathname,
577
+ search: location.search,
569
578
  },
570
- 'floorDetail': {
571
- 'fetchStatus': 'success',
572
- 'floorProvider': 'PubXFloorProvider',
573
- 'location': 'fetch',
574
- 'modelVersion': 'test model 1.0',
575
- 'skipRate': 0,
576
- 'skipped': false
579
+ floorDetail: {
580
+ fetchStatus: 'success',
581
+ floorProvider: 'PubXFloorProvider',
582
+ location: 'fetch',
583
+ modelVersion: 'test model 1.0',
584
+ skipRate: 0,
585
+ skipped: false,
577
586
  },
578
- 'deviceDetail': {
579
- 'platform': navigator.platform,
580
- 'deviceType': getDeviceType(),
581
- 'deviceOS': getOS(),
582
- 'browser': getBrowser()
587
+ deviceDetail: {
588
+ platform: navigator.platform,
589
+ deviceType: getDeviceType(),
590
+ deviceOS: getOS(),
591
+ browser: getBrowser(),
592
+ cdep: true,
583
593
  },
584
- 'pmcDetail': {
585
- 'bidDensity': storage.getItem('pbx:dpbid'),
586
- 'maxBid': storage.getItem('pbx:mxbid'),
587
- 'auctionId': storage.getItem('pbx:aucid')
594
+ userDetail: {
595
+ userIdTypes: Object.keys(getGlobal().getUserIds?.() || {}),
596
+ },
597
+ consentDetail: {
598
+ consentTypes: Object.keys(getGlobal().getConsentMetadata?.() || {}),
599
+ },
600
+ pmacDetail: {},
601
+ initOptions: {
602
+ ...initOptions,
603
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
588
604
  },
589
- 'initOptions': initOptions
590
605
  };
591
606
 
592
607
  let expectedAfterBidWon = {
593
- 'winningBid': {
594
- 'adUnitCode': '/19968336/header-bid-tag-1',
595
- 'gptSlotCode': getGptSlotInfoForAdUnitCode('/19968336/header-bid-tag-1').gptSlot || null,
596
- 'auctionId': 'bc3806e4-873e-453c-8ae5-204f35e923b4',
597
- 'bidderCode': 'appnexus',
598
- 'bidId': '248f9a4489835e',
599
- 'cpm': 0.5,
600
- 'creativeId': 96846035,
601
- 'currency': 'USD',
602
- 'floorData': {
603
- 'fetchStatus': 'success',
604
- 'floorProvider': 'PubXFloorProvider',
605
- 'location': 'fetch',
606
- 'modelVersion': 'test model 1.0',
607
- 'skipRate': 0,
608
- 'skipped': false,
609
- 'floorValue': 0.4,
610
- 'floorRule': '/19968336/header-bid-tag-1|banner',
611
- 'floorCurrency': 'USD',
612
- 'cpmAfterAdjustments': 0.5,
613
- 'enforcements': {
614
- 'enforceJS': true,
615
- 'enforcePBS': false,
616
- 'floorDeals': true,
617
- 'bidAdjustment': true
608
+ winningBid: {
609
+ adUnitCode: '/19968336/header-bid-tag-1',
610
+ gptSlotCode:
611
+ getGptSlotInfoForAdUnitCode('/19968336/header-bid-tag-1').gptSlot ||
612
+ null,
613
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
614
+ bidderCode: 'appnexus',
615
+ bidId: '248f9a4489835e',
616
+ cpm: 0.5,
617
+ creativeId: 96846035,
618
+ currency: 'USD',
619
+ floorData: {
620
+ fetchStatus: 'success',
621
+ floorProvider: 'PubXFloorProvider',
622
+ location: 'fetch',
623
+ modelVersion: 'test model 1.0',
624
+ skipRate: 0,
625
+ skipped: false,
626
+ floorValue: 0.4,
627
+ floorRule: '/19968336/header-bid-tag-1|banner',
628
+ floorCurrency: 'USD',
629
+ cpmAfterAdjustments: 0.5,
630
+ enforcements: {
631
+ enforceJS: true,
632
+ enforcePBS: false,
633
+ floorDeals: true,
634
+ bidAdjustment: true,
635
+ },
636
+ matchedFields: {
637
+ gptSlot: '/19968336/header-bid-tag-1',
638
+ mediaType: 'banner',
618
639
  },
619
- 'matchedFields': {
620
- 'gptSlot': '/19968336/header-bid-tag-1',
621
- 'mediaType': 'banner'
622
- }
623
640
  },
624
- 'floorProvider': 'PubXFloorProvider',
625
- 'floorFetchStatus': 'success',
626
- 'floorLocation': 'fetch',
627
- 'floorModelVersion': 'test model 1.0',
628
- 'floorSkipRate': 0,
629
- 'isFloorSkipped': false,
630
- 'isWinningBid': true,
631
- 'mediaType': 'banner',
632
- 'netRevenue': true,
633
- 'placementId': 13144370,
634
- 'renderedSize': '300x250',
635
- 'renderStatus': 4,
636
- 'responseTimestamp': 1616654313071,
637
- 'requestTimestamp': 1616654312804,
638
- 'status': 'rendered',
639
- 'statusMessage': 'Bid available',
640
- 'timeToRespond': 267
641
+ adServerData: {},
642
+ floorProvider: 'PubXFloorProvider',
643
+ floorFetchStatus: 'success',
644
+ floorLocation: 'fetch',
645
+ floorModelVersion: 'test model 1.0',
646
+ floorSkipRate: 0,
647
+ isFloorSkipped: false,
648
+ isWinningBid: true,
649
+ mediaType: 'banner',
650
+ netRevenue: true,
651
+ placementId: 13144370,
652
+ renderedSize: '300x250',
653
+ sizes: '300x250',
654
+ renderStatus: 4,
655
+ responseTimestamp: 1616654313071,
656
+ requestTimestamp: 1616654312804,
657
+ status: 'rendered',
658
+ statusMessage: 'Bid available',
659
+ timeToRespond: 267,
660
+ source: 'client',
661
+ },
662
+ auctionDetail: {
663
+ adUnitCodes: ['/19968336/header-bid-tag-1'],
664
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
665
+ refreshRank: 0,
666
+ timestamp: 1616654312804,
667
+ },
668
+ pageDetail: {
669
+ host: location.host,
670
+ path: location.pathname,
671
+ search: location.search,
641
672
  },
642
- 'pageDetail': {
643
- 'host': location.host,
644
- 'path': location.pathname,
645
- 'search': location.search
673
+ floorDetail: {
674
+ fetchStatus: 'success',
675
+ floorProvider: 'PubXFloorProvider',
676
+ location: 'fetch',
677
+ modelVersion: 'test model 1.0',
678
+ skipRate: 0,
679
+ skipped: false,
646
680
  },
647
- 'deviceDetail': {
648
- 'platform': navigator.platform,
649
- 'deviceType': getDeviceType(),
650
- 'deviceOS': getOS(),
651
- 'browser': getBrowser()
681
+ deviceDetail: {
682
+ platform: navigator.platform,
683
+ deviceType: getDeviceType(),
684
+ deviceOS: getOS(),
685
+ browser: getBrowser(),
686
+ cdep: true,
652
687
  },
653
- 'initOptions': initOptions
654
- }
688
+ userDetail: {
689
+ userIdTypes: Object.keys(getGlobal().getUserIds?.() || {}),
690
+ },
691
+ consentDetail: {
692
+ consentTypes: Object.keys(getGlobal().getConsentMetadata?.() || {}),
693
+ },
694
+ pmacDetail: {},
695
+ initOptions: {
696
+ ...initOptions,
697
+ auctionId: 'bc3806e4-873e-453c-8ae5-204f35e923b4',
698
+ },
699
+ };
655
700
 
656
701
  adapterManager.registerAnalyticsAdapter({
657
702
  code: 'pubxai',
658
- adapter: pubxaiAnalyticsAdapter
703
+ adapter: pubxaiAnalyticsAdapter,
659
704
  });
660
705
 
661
- beforeEach(function() {
706
+ beforeEach(() => {
662
707
  adapterManager.enableAnalytics({
663
708
  provider: 'pubxai',
664
- options: initOptions
709
+ options: initOptions,
710
+ });
711
+ sinon.stub(navigator, 'sendBeacon').returns(true);
712
+ originalVS = document.visibilityState;
713
+ document['__defineGetter__']('visibilityState', function () {
714
+ return 'hidden';
665
715
  });
666
716
  });
667
717
 
668
- afterEach(function() {
718
+ afterEach(() => {
669
719
  pubxaiAnalyticsAdapter.disableAnalytics();
720
+ navigator.sendBeacon.restore();
721
+ delete auctionCache['bc3806e4-873e-453c-8ae5-204f35e923b4'];
722
+ delete auctionCache['auction2'];
723
+ document['__defineGetter__']('visibilityState', function () {
724
+ return originalVS;
725
+ });
670
726
  });
671
727
 
672
- it('builds and sends auction data', function() {
728
+ it('builds and sends auction data', async () => {
673
729
  // Step 1: Send auction init event
674
730
  events.emit(EVENTS.AUCTION_INIT, prebidEvent['auctionInit']);
675
731
 
@@ -685,20 +741,331 @@ describe('pubxai analytics adapter', function() {
685
741
  // Step 5: Send auction end event
686
742
  events.emit(EVENTS.AUCTION_END, prebidEvent['auctionEnd']);
687
743
 
688
- expect(server.requests.length).to.equal(1);
689
-
690
- let realAfterBid = JSON.parse(server.requests[0].requestBody);
744
+ // Simulate "navigate away" behaviour
745
+ document.dispatchEvent(new Event('visibilitychange'));
691
746
 
692
- expect(realAfterBid).to.deep.equal(expectedAfterBid);
747
+ expect(navigator.sendBeacon.callCount).to.equal(0);
693
748
 
694
749
  // Step 6: Send auction bid won event
695
750
  events.emit(EVENTS.BID_WON, prebidEvent['bidWon']);
696
751
 
697
- expect(server.requests.length).to.equal(2);
752
+ // Simulate end of session
753
+ document.dispatchEvent(new Event('visibilitychange'));
754
+
755
+ expect(navigator.sendBeacon.callCount).to.equal(2);
756
+
757
+ for (const [index, arg] of navigator.sendBeacon.args.entries()) {
758
+ const [expectedUrl, expectedData] = arg;
759
+ const parsedUrl = new URL(expectedUrl);
760
+ expect(parsedUrl.pathname).to.equal(
761
+ ['/analytics/bidwon', '/analytics/auction'][index]
762
+ );
763
+ expect(Object.fromEntries(parsedUrl.searchParams)).to.deep.equal({
764
+ auctionTimestamp: '1616654312804',
765
+ pubxaiAnalyticsVersion: 'v2.0.0',
766
+ prebidVersion: '$prebid.version$',
767
+ });
768
+ expect(expectedData.type).to.equal('text/json');
769
+ expect(JSON.parse(await readBlobSafariCompat(expectedData))).to.deep.equal([
770
+ [expectedAfterBidWon, expectedAfterBid][index],
771
+ ]);
772
+ }
773
+ });
774
+
775
+ it('auction with no bids', async () => {
776
+ // Step 1: Send auction init event
777
+ events.emit(EVENTS.AUCTION_INIT, prebidEvent['auctionInit']);
778
+
779
+ // Step 2: Send bid requested event
780
+ events.emit(EVENTS.BID_REQUESTED, prebidEvent['bidRequested']);
781
+
782
+ // Step 3: Send bid time out event
783
+ events.emit(EVENTS.BID_TIMEOUT, prebidEvent['bidTimeout']);
784
+
785
+ // Simulate "navigate away" behaviour
786
+ document.dispatchEvent(new Event('visibilitychange'));
787
+
788
+ // Step 4: check the number of calls made to pubx.ai
789
+ expect(navigator.sendBeacon.callCount).to.equal(0);
790
+
791
+ // Step 5: Send auction end event
792
+ events.emit(EVENTS.AUCTION_END, prebidEvent['auctionEnd']);
793
+
794
+ // Simulate end of session
795
+ document.dispatchEvent(new Event('visibilitychange'));
796
+
797
+ // Step 6: check the number of calls made to pubx.ai
798
+ expect(navigator.sendBeacon.callCount).to.equal(1);
799
+
800
+ // Step 7: check the pathname of the calls is correct (sent only to the auction endpoint)
801
+ const [expectedUrl, expectedData] = navigator.sendBeacon.args[0];
802
+ const parsedUrl = new URL(expectedUrl);
803
+ expect(parsedUrl.pathname).to.equal('/analytics/auction');
804
+
805
+ // Step 8: check that the meta information in the call is correct
806
+ expect(Object.fromEntries(parsedUrl.searchParams)).to.deep.equal({
807
+ auctionTimestamp: '1616654312804',
808
+ pubxaiAnalyticsVersion: 'v2.0.0',
809
+ prebidVersion: '$prebid.version$',
810
+ });
811
+
812
+ // Step 9: check that the data sent in the request is correct
813
+ expect(expectedData.type).to.equal('text/json');
814
+ expect(JSON.parse(await readBlobSafariCompat(expectedData))).to.deep.equal([
815
+ {
816
+ ...expectedAfterBid,
817
+ bids: [],
818
+ },
819
+ ]);
820
+ });
821
+
822
+ it('2 concurrent auctions', async () => {
823
+ // Step 1: Send auction init event for auction 1
824
+ events.emit(EVENTS.AUCTION_INIT, prebidEvent['auctionInit']);
825
+
826
+ // Step 2: Send bid requested event for auction 1
827
+ events.emit(EVENTS.BID_REQUESTED, prebidEvent['bidRequested']);
828
+
829
+ // Step 3: Send auction init event for auction 2
830
+ events.emit(
831
+ EVENTS.AUCTION_INIT,
832
+ replaceProperty(prebidEvent['auctionInit'], [
833
+ {
834
+ field: 'auctionId',
835
+ updated: '"auction2"',
836
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
837
+ },
838
+ ])
839
+ );
840
+
841
+ // Step 4: Send bid requested event for auction 2
842
+ events.emit(
843
+ EVENTS.BID_REQUESTED,
844
+ replaceProperty(prebidEvent['bidRequested'], [
845
+ {
846
+ field: 'auctionId',
847
+ updated: '"auction2"',
848
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
849
+ },
850
+ ])
851
+ );
852
+
853
+ // Step 5: Send bid response event for auction 1
854
+ events.emit(EVENTS.BID_RESPONSE, prebidEvent['bidResponse']);
855
+
856
+ // Step 6: Send bid time out event for auction 1
857
+ events.emit(EVENTS.BID_TIMEOUT, prebidEvent['bidTimeout']);
858
+
859
+ // Step 7: Send bid response event for auction 2
860
+ events.emit(
861
+ EVENTS.BID_RESPONSE,
862
+ replaceProperty(prebidEvent['bidResponse'], [
863
+ {
864
+ field: 'auctionId',
865
+ updated: '"auction2"',
866
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
867
+ },
868
+ ])
869
+ );
870
+
871
+ // Step 8: Send auction end event for auction 1
872
+ events.emit(EVENTS.AUCTION_END, prebidEvent['auctionEnd']);
873
+
874
+ // Simulate "navigate away" behaviour
875
+ document.dispatchEvent(new Event('visibilitychange'));
876
+
877
+ // Step 9: check the number of calls made to pubx.ai
878
+ expect(navigator.sendBeacon.callCount).to.equal(0);
879
+
880
+ // Step 10: Send auction bid won event for auction 1
881
+ events.emit(EVENTS.BID_WON, prebidEvent['bidWon']);
882
+
883
+ // Simulate "navigate away" behaviour
884
+ document.dispatchEvent(new Event('visibilitychange'));
885
+
886
+ // Step 11: check the number of calls made to pubx.ai
887
+ expect(navigator.sendBeacon.callCount).to.equal(2);
888
+
889
+ // Step 12: Send auction end event for auction 2
890
+ events.emit(
891
+ EVENTS.AUCTION_END,
892
+ replaceProperty(prebidEvent['auctionEnd'], [
893
+ {
894
+ field: 'auctionId',
895
+ updated: '"auction2"',
896
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
897
+ },
898
+ ])
899
+ );
900
+
901
+ // Simulate "navigate away" behaviour
902
+ document.dispatchEvent(new Event('visibilitychange'));
698
903
 
699
- let winEventData = JSON.parse(server.requests[1].requestBody);
904
+ // Step 13: check the number of calls made to pubx.ai
905
+ expect(navigator.sendBeacon.callCount).to.equal(2);
700
906
 
701
- expect(winEventData).to.deep.equal(expectedAfterBidWon);
907
+ // Step 14: Send auction bid won event for auction 2
908
+ events.emit(
909
+ EVENTS.BID_WON,
910
+ replaceProperty(prebidEvent['bidWon'], [
911
+ {
912
+ field: 'auctionId',
913
+ updated: '"auction2"',
914
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
915
+ },
916
+ ])
917
+ );
918
+
919
+ // Simulate end of session
920
+ document.dispatchEvent(new Event('visibilitychange'));
921
+
922
+ // Step 15: check the calls made to pubx.ai
923
+ expect(navigator.sendBeacon.callCount).to.equal(4);
924
+ for (const [index, arg] of navigator.sendBeacon.args.entries()) {
925
+ const [expectedUrl, expectedData] = arg;
926
+ const parsedUrl = new URL(expectedUrl);
927
+ const auctionIdMapFn = index < 2 ? (i, _) => i : replaceProperty;
928
+ expect(parsedUrl.pathname).to.equal(
929
+ ['/analytics/bidwon', '/analytics/auction'][index % 2]
930
+ );
931
+ expect(Object.fromEntries(parsedUrl.searchParams)).to.deep.equal({
932
+ auctionTimestamp: '1616654312804',
933
+ pubxaiAnalyticsVersion: 'v2.0.0',
934
+ prebidVersion: '$prebid.version$',
935
+ });
936
+ expect(expectedData.type).to.equal('text/json');
937
+ expect(JSON.parse(await readBlobSafariCompat(expectedData))).to.deep.equal([
938
+ auctionIdMapFn([expectedAfterBidWon, expectedAfterBid][index % 2], [
939
+ {
940
+ field: 'auctionId',
941
+ updated: '"auction2"',
942
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
943
+ },
944
+ {
945
+ field: 'refreshRank',
946
+ updated: '1',
947
+ replaced: '0',
948
+ },
949
+ ]),
950
+ ]);
951
+ }
952
+ });
953
+
954
+ it('2 concurrent auctions with batch sending', async () => {
955
+ // Step 1: Send auction init event for auction 1
956
+ events.emit(EVENTS.AUCTION_INIT, prebidEvent['auctionInit']);
957
+
958
+ // Step 2: Send bid requested event for auction 1
959
+ events.emit(EVENTS.BID_REQUESTED, prebidEvent['bidRequested']);
960
+
961
+ // Step 3: Send auction init event for auction 2
962
+ events.emit(
963
+ EVENTS.AUCTION_INIT,
964
+ replaceProperty(prebidEvent['auctionInit'], [
965
+ {
966
+ field: 'auctionId',
967
+ updated: '"auction2"',
968
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
969
+ },
970
+ ])
971
+ );
972
+
973
+ // Step 4: Send bid requested event for auction 2
974
+ events.emit(
975
+ EVENTS.BID_REQUESTED,
976
+ replaceProperty(prebidEvent['bidRequested'], [
977
+ {
978
+ field: 'auctionId',
979
+ updated: '"auction2"',
980
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
981
+ },
982
+ ])
983
+ );
984
+
985
+ // Step 5: Send bid response event for auction 1
986
+ events.emit(EVENTS.BID_RESPONSE, prebidEvent['bidResponse']);
987
+
988
+ // Step 6: Send bid time out event for auction 1
989
+ events.emit(EVENTS.BID_TIMEOUT, prebidEvent['bidTimeout']);
990
+
991
+ // Step 7: Send bid response event for auction 2
992
+ events.emit(
993
+ EVENTS.BID_RESPONSE,
994
+ replaceProperty(prebidEvent['bidResponse'], [
995
+ {
996
+ field: 'auctionId',
997
+ updated: '"auction2"',
998
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
999
+ },
1000
+ ])
1001
+ );
1002
+
1003
+ // Step 8: Send auction end event for auction 1
1004
+ events.emit(EVENTS.AUCTION_END, prebidEvent['auctionEnd']);
1005
+
1006
+ // Step 9: Send auction bid won event for auction 1
1007
+ events.emit(EVENTS.BID_WON, prebidEvent['bidWon']);
1008
+
1009
+ // Step 10: Send auction end event for auction 2
1010
+ events.emit(
1011
+ EVENTS.AUCTION_END,
1012
+ replaceProperty(prebidEvent['auctionEnd'], [
1013
+ {
1014
+ field: 'auctionId',
1015
+ updated: '"auction2"',
1016
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
1017
+ },
1018
+ ])
1019
+ );
1020
+
1021
+ // Step 11: Send auction bid won event for auction 2
1022
+ events.emit(
1023
+ EVENTS.BID_WON,
1024
+ replaceProperty(prebidEvent['bidWon'], [
1025
+ {
1026
+ field: 'auctionId',
1027
+ updated: '"auction2"',
1028
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
1029
+ },
1030
+ ])
1031
+ );
1032
+
1033
+ // Step 12: check the number of calls made to pubx.ai
1034
+ expect(navigator.sendBeacon.callCount).to.equal(0);
1035
+
1036
+ // Simulate end of session
1037
+ document.dispatchEvent(new Event('visibilitychange'));
1038
+
1039
+ // Step 13: check the calls made to pubx.ai
1040
+ expect(navigator.sendBeacon.callCount).to.equal(2);
1041
+ for (const [index, arg] of navigator.sendBeacon.args.entries()) {
1042
+ const [expectedUrl, expectedData] = arg;
1043
+ const parsedUrl = new URL(expectedUrl);
1044
+ expect(parsedUrl.pathname).to.equal(
1045
+ ['/analytics/bidwon', '/analytics/auction'][index]
1046
+ );
1047
+ expect(Object.fromEntries(parsedUrl.searchParams)).to.deep.equal({
1048
+ auctionTimestamp: '1616654312804',
1049
+ pubxaiAnalyticsVersion: 'v2.0.0',
1050
+ prebidVersion: '$prebid.version$',
1051
+ });
1052
+ expect(expectedData.type).to.equal('text/json');
1053
+ expect(JSON.parse(await readBlobSafariCompat(expectedData))).to.deep.equal([
1054
+ [expectedAfterBidWon, expectedAfterBid][index],
1055
+ replaceProperty([expectedAfterBidWon, expectedAfterBid][index], [
1056
+ {
1057
+ field: 'auctionId',
1058
+ updated: '"auction2"',
1059
+ replaced: '"bc3806e4-873e-453c-8ae5-204f35e923b4"',
1060
+ },
1061
+ {
1062
+ field: 'refreshRank',
1063
+ updated: '1',
1064
+ replaced: '0',
1065
+ },
1066
+ ]),
1067
+ ]);
1068
+ }
702
1069
  });
703
1070
  });
704
1071
  });