prebid.js 7.25.0 → 7.27.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 (353) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  9. package/dist/adlooxAdServerVideo.js +1 -1
  10. package/dist/adlooxAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/admaticBidAdapter.js +1 -1
  13. package/dist/admixerBidAdapter.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adrelevantisBidAdapter.js +1 -1
  16. package/dist/adtrgtmeBidAdapter.js +1 -1
  17. package/dist/adxcgAnalyticsAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  20. package/dist/aidemBidAdapter.js +1 -0
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/analyticsAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/beopBidAdapter.js +1 -1
  31. package/dist/bidViewability.js +1 -1
  32. package/dist/bidglassBidAdapter.js +1 -1
  33. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/browsiRtdProvider.js +1 -1
  38. package/dist/bucksenseBidAdapter.js +1 -1
  39. package/dist/byDataAnalyticsAdapter.js +1 -1
  40. package/dist/captifyRtdProvider.js +1 -0
  41. package/dist/carodaBidAdapter.js +1 -1
  42. package/dist/chtnwBidAdapter.js +1 -1
  43. package/dist/concertAnalyticsAdapter.js +1 -1
  44. package/dist/concertBidAdapter.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -1
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/datablocksAnalyticsAdapter.js +1 -1
  54. package/dist/dependencies.json +6 -0
  55. package/dist/dfpAdServerVideo.js +1 -1
  56. package/dist/discoveryBidAdapter.js +1 -1
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/eplanningAnalyticsAdapter.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/fintezaAnalyticsAdapter.js +1 -1
  62. package/dist/fluctBidAdapter.js +1 -1
  63. package/dist/ftrackIdSystem.js +1 -1
  64. package/dist/gdprEnforcement.js +1 -1
  65. package/dist/genericAnalyticsAdapter.js +1 -0
  66. package/dist/geoedgeRtdProvider.js +1 -1
  67. package/dist/glimpseBidAdapter.js +1 -1
  68. package/dist/glomexBidAdapter.js +1 -1
  69. package/dist/gmosspBidAdapter.js +1 -1
  70. package/dist/goldbachBidAdapter.js +1 -1
  71. package/dist/googleAnalyticsAdapter.js +1 -1
  72. package/dist/gravitoIdSystem.js +1 -1
  73. package/dist/gridBidAdapter.js +1 -1
  74. package/dist/gridNMBidAdapter.js +1 -1
  75. package/dist/growthCodeAnalyticsAdapter.js +1 -0
  76. package/dist/gumgumBidAdapter.js +1 -1
  77. package/dist/h12mediaBidAdapter.js +1 -1
  78. package/dist/hadronAnalyticsAdapter.js +1 -1
  79. package/dist/id5AnalyticsAdapter.js +1 -1
  80. package/dist/id5IdSystem.js +1 -1
  81. package/dist/impactifyBidAdapter.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/jwplayerRtdProvider.js +1 -1
  89. package/dist/kargoAnalyticsAdapter.js +1 -1
  90. package/dist/kinessoIdSystem.js +1 -1
  91. package/dist/konduitAnalyticsAdapter.js +1 -1
  92. package/dist/kueezBidAdapter.js +1 -1
  93. package/dist/kueezRtbBidAdapter.js +1 -1
  94. package/dist/lassoBidAdapter.js +1 -1
  95. package/dist/lifestreetBidAdapter.js +1 -1
  96. package/dist/limelightDigitalBidAdapter.js +1 -1
  97. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  98. package/dist/liveIntentIdSystem.js +1 -1
  99. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  100. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  101. package/dist/logicadBidAdapter.js +1 -1
  102. package/dist/loglyliftBidAdapter.js +1 -1
  103. package/dist/lotamePanoramaIdSystem.js +1 -1
  104. package/dist/magniteAnalyticsAdapter.js +1 -1
  105. package/dist/malltvAnalyticsAdapter.js +1 -1
  106. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  107. package/dist/marsmediaBidAdapter.js +1 -1
  108. package/dist/mediafuseBidAdapter.js +1 -1
  109. package/dist/medianetAnalyticsAdapter.js +1 -1
  110. package/dist/mediasquareBidAdapter.js +1 -1
  111. package/dist/mgidBidAdapter.js +1 -1
  112. package/dist/minutemediaBidAdapter.js +1 -1
  113. package/dist/nextMillenniumBidAdapter.js +1 -1
  114. package/dist/nexx360BidAdapter.js +1 -1
  115. package/dist/not-for-prod/prebid.js +240 -202
  116. package/dist/oguryBidAdapter.js +1 -1
  117. package/dist/onetagBidAdapter.js +1 -1
  118. package/dist/ooloAnalyticsAdapter.js +1 -1
  119. package/dist/openxAnalyticsAdapter.js +1 -1
  120. package/dist/optimonAnalyticsAdapter.js +1 -1
  121. package/dist/outbrainBidAdapter.js +1 -1
  122. package/dist/parrableIdSystem.js +1 -1
  123. package/dist/pbsExtensions.js +1 -1
  124. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  125. package/dist/pixfutureBidAdapter.js +1 -1
  126. package/dist/prebid-core.js +1 -1
  127. package/dist/prebidServerBidAdapter.js +1 -1
  128. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  129. package/dist/pubCommonId.js +1 -1
  130. package/dist/pubProvidedIdSystem.js +1 -1
  131. package/dist/publinkIdSystem.js +1 -1
  132. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  133. package/dist/pubmaticBidAdapter.js +1 -1
  134. package/dist/pubperfAnalyticsAdapter.js +1 -1
  135. package/dist/pubstackAnalyticsAdapter.js +1 -1
  136. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  137. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  138. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  139. package/dist/pxyzBidAdapter.js +1 -1
  140. package/dist/quantcastBidAdapter.js +1 -1
  141. package/dist/quantcastIdSystem.js +1 -1
  142. package/dist/rasBidAdapter.js +1 -1
  143. package/dist/readpeakBidAdapter.js +1 -1
  144. package/dist/realvuAnalyticsAdapter.js +1 -1
  145. package/dist/redtramBidAdapter.js +1 -0
  146. package/dist/relaidoBidAdapter.js +1 -1
  147. package/dist/relevantAnalyticsAdapter.js +1 -1
  148. package/dist/rhythmoneBidAdapter.js +1 -1
  149. package/dist/riseBidAdapter.js +1 -1
  150. package/dist/rivrAnalyticsAdapter.js +1 -1
  151. package/dist/roxotAnalyticsAdapter.js +1 -1
  152. package/dist/rtbhouseBidAdapter.js +1 -1
  153. package/dist/rtdModule.js +1 -1
  154. package/dist/rubiconAnalyticsAdapter.js +1 -1
  155. package/dist/rubiconBidAdapter.js +1 -1
  156. package/dist/s2sTesting.js +1 -1
  157. package/dist/scaleableAnalyticsAdapter.js +1 -1
  158. package/dist/schain.js +1 -1
  159. package/dist/seedingAllianceBidAdapter.js +1 -1
  160. package/dist/seedtagBidAdapter.js +1 -1
  161. package/dist/sharedIdSystem.js +1 -1
  162. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  163. package/dist/sharethroughBidAdapter.js +1 -1
  164. package/dist/shinezBidAdapter.js +1 -1
  165. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  166. package/dist/smaatoBidAdapter.js +1 -1
  167. package/dist/smartadserverBidAdapter.js +1 -1
  168. package/dist/smartxBidAdapter.js +1 -1
  169. package/dist/smartytechBidAdapter.js +1 -0
  170. package/dist/smilewantedBidAdapter.js +1 -1
  171. package/dist/sonobiAnalyticsAdapter.js +1 -1
  172. package/dist/sonobiBidAdapter.js +1 -1
  173. package/dist/sovrnAnalyticsAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/staqAnalyticsAdapter.js +1 -1
  177. package/dist/sublimeBidAdapter.js +1 -1
  178. package/dist/synacormediaBidAdapter.js +1 -1
  179. package/dist/taboolaBidAdapter.js +1 -1
  180. package/dist/tapadIdSystem.js +1 -1
  181. package/dist/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/teadsBidAdapter.js +1 -1
  184. package/dist/teadsIdSystem.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/trionBidAdapter.js +1 -1
  187. package/dist/tripleliftBidAdapter.js +1 -1
  188. package/dist/ttdBidAdapter.js +1 -1
  189. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  190. package/dist/underdogmediaBidAdapter.js +1 -1
  191. package/dist/undertoneBidAdapter.js +1 -1
  192. package/dist/userId.js +1 -1
  193. package/dist/vidazooBidAdapter.js +1 -1
  194. package/dist/videobyteBidAdapter.js +1 -1
  195. package/dist/viqeoBidAdapter.js +1 -0
  196. package/dist/visxBidAdapter.js +1 -1
  197. package/dist/vuukleBidAdapter.js +1 -1
  198. package/dist/weboramaRtdProvider.js +1 -1
  199. package/dist/widespaceBidAdapter.js +1 -1
  200. package/dist/winrBidAdapter.js +1 -1
  201. package/dist/yahoosspBidAdapter.js +1 -1
  202. package/dist/yandexBidAdapter.js +1 -1
  203. package/dist/yieldlabBidAdapter.js +1 -1
  204. package/dist/yieldliftBidAdapter.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  208. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  209. package/dist/zeta_global_sspBidAdapter.js +1 -1
  210. package/dist/zeusPrimeRtdProvider.js +31 -0
  211. package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
  212. package/integrationExamples/gpt/growthcode.html +134 -0
  213. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  214. package/modules/.submodules.json +3 -1
  215. package/modules/admaticBidAdapter.js +116 -58
  216. package/modules/admaticBidAdapter.md +2 -2
  217. package/modules/admixerBidAdapter.js +1 -1
  218. package/modules/aidemBidAdapter.js +492 -0
  219. package/modules/aidemBidAdapter.md +187 -0
  220. package/modules/beopBidAdapter.js +17 -2
  221. package/modules/browsiRtdProvider.js +6 -4
  222. package/modules/bucksenseBidAdapter.js +1 -1
  223. package/modules/captifyRtdProvider.js +146 -0
  224. package/modules/captifyRtdProvider.md +68 -0
  225. package/modules/criteoBidAdapter.js +3 -3
  226. package/modules/discoveryBidAdapter.js +38 -17
  227. package/modules/discoveryBidAdapter.md +7 -6
  228. package/modules/eplanningBidAdapter.js +2 -6
  229. package/modules/fluctBidAdapter.js +5 -0
  230. package/modules/gdprEnforcement.js +26 -24
  231. package/modules/genericAnalyticsAdapter.js +157 -0
  232. package/modules/geoedgeRtdProvider.js +22 -0
  233. package/modules/glomexBidAdapter.js +2 -0
  234. package/modules/gravitoIdSystem.js +3 -4
  235. package/modules/gridBidAdapter.js +441 -23
  236. package/modules/gridNMBidAdapter.js +1 -1
  237. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  238. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  239. package/modules/impactifyBidAdapter.js +19 -1
  240. package/modules/jwplayerRtdProvider.js +1 -2
  241. package/modules/limelightDigitalBidAdapter.js +1 -1
  242. package/modules/minutemediaBidAdapter.md +3 -3
  243. package/modules/nextMillenniumBidAdapter.js +19 -23
  244. package/modules/nexx360BidAdapter.js +264 -138
  245. package/modules/pubCommonId.js +2 -1
  246. package/modules/pubProvidedIdSystem.js +2 -0
  247. package/modules/rasBidAdapter.js +8 -3
  248. package/modules/rasBidAdapter.md +16 -15
  249. package/modules/redtramBidAdapter.js +155 -0
  250. package/modules/redtramBidAdapter.md +33 -0
  251. package/modules/riseBidAdapter.js +15 -0
  252. package/modules/riseBidAdapter.md +3 -3
  253. package/modules/rtbhouseBidAdapter.js +90 -29
  254. package/modules/rubiconBidAdapter.js +2 -1
  255. package/modules/seedtagBidAdapter.js +67 -56
  256. package/modules/seedtagBidAdapter.md +60 -0
  257. package/modules/sharedIdSystem.js +3 -1
  258. package/modules/smartadserverBidAdapter.js +6 -2
  259. package/modules/smartxBidAdapter.js +11 -8
  260. package/modules/smartytechBidAdapter.js +78 -0
  261. package/modules/smartytechBidAdapter.md +44 -0
  262. package/modules/smnBidAdapter.md +52 -0
  263. package/modules/taboolaBidAdapter.js +3 -3
  264. package/modules/taboolaBidAdapter.md +0 -2
  265. package/modules/tappxBidAdapter.js +21 -6
  266. package/modules/tripleliftBidAdapter.js +1 -1
  267. package/modules/ttdBidAdapter.js +8 -3
  268. package/modules/userId/index.js +1 -1
  269. package/modules/vidazooBidAdapter.js +26 -3
  270. package/modules/viqeoBidAdapter.js +180 -0
  271. package/modules/viqeoBidAdapter.md +56 -0
  272. package/modules/yandexBidAdapter.js +85 -19
  273. package/modules/yandexBidAdapter.md +7 -7
  274. package/modules/yieldlabBidAdapter.js +29 -12
  275. package/modules/yieldliftBidAdapter.js +3 -3
  276. package/modules/yieldoneBidAdapter.js +60 -8
  277. package/modules/yieldoneBidAdapter.md +109 -9
  278. package/modules/zeta_global_sspBidAdapter.js +4 -0
  279. package/modules/zeusPrimeRtdProvider.js +357 -0
  280. package/modules/zeusPrimeRtdProvider.md +60 -0
  281. package/package.json +1 -1
  282. package/src/adloader.js +0 -1
  283. package/src/auction.js +19 -3
  284. package/src/consentHandler.js +8 -0
  285. package/src/events.js +4 -0
  286. package/src/native.js +31 -20
  287. package/src/refererDetection.js +6 -1
  288. package/src/storageManager.js +6 -3
  289. package/test/helpers/analytics.js +34 -0
  290. package/test/mocks/analyticsStub.js +3 -1
  291. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  292. package/test/spec/auctionmanager_spec.js +86 -0
  293. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  294. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  295. package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
  296. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  297. package/test/spec/modules/beopBidAdapter_spec.js +52 -0
  298. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  299. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  300. package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
  301. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  302. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
  303. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  304. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  305. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  306. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  307. package/test/spec/modules/fpdModule_spec.js +1 -1
  308. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  309. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  310. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  311. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  312. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  313. package/test/spec/modules/gridBidAdapter_spec.js +289 -1
  314. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  315. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  316. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  317. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  318. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  319. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  320. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  321. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
  322. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  323. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  324. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  325. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  326. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  327. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  328. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  329. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  330. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  331. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  332. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  333. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  334. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  335. package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
  336. package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
  337. package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
  338. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  339. package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
  340. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  341. package/test/spec/modules/ttdBidAdapter_spec.js +27 -0
  342. package/test/spec/modules/vidazooBidAdapter_spec.js +39 -24
  343. package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
  344. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  345. package/test/spec/modules/yieldlabBidAdapter_spec.js +174 -20
  346. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  347. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  348. package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
  349. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
  350. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
  351. package/test/spec/native_spec.js +68 -56
  352. package/test/spec/refererDetection_spec.js +45 -7
  353. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -20,6 +20,7 @@ import * as events from 'src/events.js';
20
20
  import 'modules/appnexusBidAdapter.js'; // some tests expect this to be in the adapter registry
21
21
  import 'src/prebid.js'
22
22
  import {hook} from '../../../src/hook.js';
23
+ import {VENDORLESS_GVLID} from '../../../src/consentHandler.js';
23
24
 
24
25
  describe('gdpr enforcement', function () {
25
26
  let nextFnSpy;
@@ -150,13 +151,13 @@ describe('gdpr enforcement', function () {
150
151
  }
151
152
  });
152
153
 
153
- deviceAccessHook(nextFnSpy, false);
154
+ deviceAccessHook(nextFnSpy);
154
155
  expect(nextFnSpy.calledOnce).to.equal(true);
155
156
  let result = {
156
157
  hasEnforcementHook: true,
157
158
  valid: false
158
159
  }
159
- sinon.assert.calledWith(nextFnSpy, false, undefined, undefined, result);
160
+ sinon.assert.calledWith(nextFnSpy, undefined, undefined, result);
160
161
  });
161
162
 
162
163
  it('should only check for consent for vendor exceptions when enforcePurpose and enforceVendor are false', function () {
@@ -178,8 +179,8 @@ describe('gdpr enforcement', function () {
178
179
  consentData.apiVersion = 2;
179
180
  gdprDataHandlerStub.returns(consentData);
180
181
 
181
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
182
- deviceAccessHook(nextFnSpy, false, 5, 'rubicon');
182
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
183
+ deviceAccessHook(nextFnSpy, 5, 'rubicon');
183
184
  expect(logWarnSpy.callCount).to.equal(0);
184
185
  });
185
186
 
@@ -201,8 +202,8 @@ describe('gdpr enforcement', function () {
201
202
  consentData.apiVersion = 2;
202
203
  gdprDataHandlerStub.returns(consentData);
203
204
 
204
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
205
- deviceAccessHook(nextFnSpy, false, 3, 'rubicon');
205
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
206
+ deviceAccessHook(nextFnSpy, 3, 'rubicon');
206
207
  expect(logWarnSpy.callCount).to.equal(1);
207
208
  });
208
209
 
@@ -224,13 +225,13 @@ describe('gdpr enforcement', function () {
224
225
  consentData.apiVersion = 2;
225
226
  gdprDataHandlerStub.returns(consentData);
226
227
 
227
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
228
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
228
229
  expect(nextFnSpy.calledOnce).to.equal(true);
229
230
  let result = {
230
231
  hasEnforcementHook: true,
231
232
  valid: true
232
233
  }
233
- sinon.assert.calledWith(nextFnSpy, false, 1, 'appnexus', result);
234
+ sinon.assert.calledWith(nextFnSpy, 1, 'appnexus', result);
234
235
  });
235
236
 
236
237
  it('should use gvlMapping set by publisher', function() {
@@ -255,13 +256,13 @@ describe('gdpr enforcement', function () {
255
256
  consentData.apiVersion = 2;
256
257
  gdprDataHandlerStub.returns(consentData);
257
258
 
258
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
259
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
259
260
  expect(nextFnSpy.calledOnce).to.equal(true);
260
261
  let result = {
261
262
  hasEnforcementHook: true,
262
263
  valid: true
263
264
  }
264
- sinon.assert.calledWith(nextFnSpy, false, 4, 'appnexus', result);
265
+ sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
265
266
  config.resetConfig();
266
267
  });
267
268
 
@@ -290,31 +291,17 @@ describe('gdpr enforcement', function () {
290
291
  consentData.apiVersion = 2;
291
292
  gdprDataHandlerStub.returns(consentData);
292
293
 
293
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
294
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
294
295
  expect(nextFnSpy.calledOnce).to.equal(true);
295
296
  let result = {
296
297
  hasEnforcementHook: true,
297
298
  valid: true
298
299
  }
299
- sinon.assert.calledWith(nextFnSpy, false, 4, 'appnexus', result);
300
+ sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
300
301
  config.resetConfig();
301
302
  curBidderStub.restore();
302
303
  });
303
304
 
304
- it(`should mark module as vendorless for rule validation when isVendorless = true and ${STRICT_STORAGE_ENFORCEMENT} is set`, () => {
305
- setEnforcementConfig({
306
- [STRICT_STORAGE_ENFORCEMENT]: true
307
- });
308
- let consentData = {
309
- vendorData: staticConfig.consentData.getTCData,
310
- gdprApplies: true
311
- }
312
- gdprDataHandlerStub.returns(consentData);
313
- const validate = sinon.stub().callsFake(() => true);
314
- deviceAccessHook(nextFnSpy, true, 123, 'mockModule', undefined, {validate});
315
- expect(validate.args[0][4]('mockModule')).to.be.true;
316
- });
317
-
318
305
  it(`should not enforce consent for vendorless modules if ${STRICT_STORAGE_ENFORCEMENT} is not set`, () => {
319
306
  setEnforcementConfig({});
320
307
  let consentData = {
@@ -323,9 +310,9 @@ describe('gdpr enforcement', function () {
323
310
  }
324
311
  gdprDataHandlerStub.returns(consentData);
325
312
  const validate = sinon.stub().callsFake(() => false);
326
- deviceAccessHook(nextFnSpy, true, 123, 'mockModule', undefined, {validate});
313
+ deviceAccessHook(nextFnSpy, VENDORLESS_GVLID, 'mockModule', undefined, {validate});
327
314
  sinon.assert.callCount(validate, 0);
328
- sinon.assert.calledWith(nextFnSpy, true, 123, 'mockModule', {hasEnforcementHook: true, valid: true});
315
+ sinon.assert.calledWith(nextFnSpy, VENDORLESS_GVLID, 'mockModule', {hasEnforcementHook: true, valid: true});
329
316
  })
330
317
  });
331
318
 
@@ -804,11 +791,12 @@ describe('gdpr enforcement', function () {
804
791
  });
805
792
 
806
793
  describe('validateRules', function () {
807
- const createGdprRule = (purposeName = 'storage', enforcePurpose = true, enforceVendor = true, vendorExceptions = []) => ({
794
+ const createGdprRule = (purposeName = 'storage', enforcePurpose = true, enforceVendor = true, vendorExceptions = [], softVendorExceptions = []) => ({
808
795
  purpose: purposeName,
809
- enforcePurpose: enforcePurpose,
810
- enforceVendor: enforceVendor,
811
- vendorExceptions: vendorExceptions
796
+ enforcePurpose,
797
+ enforceVendor,
798
+ vendorExceptions,
799
+ softVendorExceptions,
812
800
  });
813
801
 
814
802
  const consentData = {
@@ -922,6 +910,19 @@ describe('gdpr enforcement', function () {
922
910
  expect(isAllowed).to.equal(true);
923
911
  });
924
912
 
913
+ describe('when the vendor has a softVendorException', () => {
914
+ const gdprRule = createGdprRule('storage', true, true, [], [vendorBlockedModule]);
915
+
916
+ it('should return false if general consent was not given', () => {
917
+ const isAllowed = validateRules(gdprRule, consentDataWithPurposeConsentFalse, vendorBlockedModule, vendorBlockedGvlId);
918
+ expect(isAllowed).to.be.false;
919
+ })
920
+ it('should return true if general consent was given', () => {
921
+ const isAllowed = validateRules(gdprRule, consentData, vendorBlockedModule, vendorBlockedGvlId);
922
+ expect(isAllowed).to.be.true;
923
+ })
924
+ })
925
+
925
926
  describe('when module does not need vendor consent', () => {
926
927
  Object.entries({
927
928
  'storage': 1,
@@ -937,11 +938,9 @@ describe('gdpr enforcement', function () {
937
938
  it(`should be ${t} when purpose is ${t}`, () => {
938
939
  const consent = utils.deepClone(consentData);
939
940
  consent.vendorData.purpose.consents[purposeNo] = consentGiven;
940
- // vendor consent (and gvlid) should be ignored
941
- consent.vendorData.vendor.consents[123] = !consentGiven;
942
941
  // take legitimate interest out of the picture for this test
943
942
  consent.vendorData.purpose.legitimateInterests = {};
944
- const actual = validateRules(rule, consent, 'mockModule', 123, () => true);
943
+ const actual = validateRules(rule, consent, 'mockModule', VENDORLESS_GVLID);
945
944
  expect(actual).to.equal(consentGiven);
946
945
  })
947
946
  })
@@ -1131,56 +1130,104 @@ describe('gdpr enforcement', function () {
1131
1130
  })
1132
1131
  });
1133
1132
 
1134
- describe('getGvlid', function() {
1133
+ describe('gvlid resolution', () => {
1135
1134
  let sandbox;
1136
- let getGvlidForBidAdapterStub;
1137
- let getGvlidForUserIdModuleStub;
1138
- let getGvlidForAnalyticsAdapterStub;
1139
1135
  beforeEach(function() {
1140
1136
  sandbox = sinon.createSandbox();
1141
- getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
1142
- getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
1143
- getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
1144
1137
  });
1138
+
1145
1139
  afterEach(function() {
1146
1140
  sandbox.restore();
1147
1141
  config.resetConfig();
1148
1142
  });
1149
1143
 
1150
- it('should return "null" if called without passing any argument', function() {
1151
- const gvlid = getGvlid();
1152
- expect(gvlid).to.equal(null);
1153
- });
1144
+ describe('getGvlid', function() {
1145
+ let getGvlidForBidAdapterStub;
1146
+ let getGvlidForUserIdModuleStub;
1147
+ let getGvlidForAnalyticsAdapterStub;
1148
+ beforeEach(function() {
1149
+ getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
1150
+ getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
1151
+ getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
1152
+ });
1154
1153
 
1155
- it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function() {
1156
- getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1157
- getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1158
- getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(null);
1154
+ it('should return "null" if called without passing any argument', function() {
1155
+ const gvlid = getGvlid();
1156
+ expect(gvlid).to.equal(null);
1157
+ });
1159
1158
 
1160
- const gvlid = getGvlid('moduleA');
1161
- expect(gvlid).to.equal(null);
1162
- });
1159
+ it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function() {
1160
+ getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1161
+ getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1162
+ getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(null);
1163
1163
 
1164
- it('should return the GVL ID from gvlMapping if it is defined in setConfig', function() {
1165
- config.setConfig({
1166
- gvlMapping: {
1167
- moduleA: 1
1168
- }
1164
+ const gvlid = getGvlid('moduleA');
1165
+ expect(gvlid).to.equal(null);
1166
+ });
1167
+
1168
+ it('should return the GVL ID from gvlMapping if it is defined in setConfig', function() {
1169
+ config.setConfig({
1170
+ gvlMapping: {
1171
+ moduleA: 1
1172
+ }
1173
+ });
1174
+
1175
+ // Actual GVL ID for moduleA is 2, as defined on its the bidAdapter.js file.
1176
+ getGvlidForBidAdapterStub.withArgs('moduleA').returns(2);
1177
+
1178
+ const gvlid = getGvlid('moduleA');
1179
+ expect(gvlid).to.equal(1);
1169
1180
  });
1170
1181
 
1171
- // Actual GVL ID for moduleA is 2, as defined on its the bidAdapter.js file.
1172
- getGvlidForBidAdapterStub.withArgs('moduleA').returns(2);
1182
+ it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function() {
1183
+ getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1184
+ getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1185
+ getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(7);
1186
+
1187
+ expect(getGvlid('moduleA')).to.equal(7);
1188
+ });
1173
1189
 
1174
- const gvlid = getGvlid('moduleA');
1175
- expect(gvlid).to.equal(1);
1190
+ it('should pass extra arguments to analytics\' getGvlid', () => {
1191
+ getGvlidForAnalyticsAdapterStub.withArgs('analytics').returns(321);
1192
+ const cfg = {some: 'args'};
1193
+ getGvlid('analytics', cfg);
1194
+ sinon.assert.calledWith(getGvlidForAnalyticsAdapterStub, 'analytics', cfg);
1195
+ });
1176
1196
  });
1177
1197
 
1178
- it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function() {
1179
- getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1180
- getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1181
- getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(7);
1198
+ describe('getGvlidForAnalyticsAdapter', () => {
1199
+ let getAnalyticsAdapter, adapter, adapterEntry;
1200
+
1201
+ beforeEach(() => {
1202
+ adapter = {};
1203
+ adapterEntry = {
1204
+ adapter
1205
+ };
1206
+ getAnalyticsAdapter = sandbox.stub(adapterManager, 'getAnalyticsAdapter');
1207
+ getAnalyticsAdapter.withArgs('analytics').returns(adapterEntry);
1208
+ });
1209
+
1210
+ it('should return gvlid from adapterManager if defined', () => {
1211
+ adapterEntry.gvlid = 123;
1212
+ adapter.gvlid = 321
1213
+ expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.equal(123);
1214
+ });
1215
+
1216
+ it('should return gvlid from adapter if defined', () => {
1217
+ adapter.gvlid = 321;
1218
+ expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.equal(321);
1219
+ });
1182
1220
 
1183
- expect(getGvlid('moduleA')).to.equal(7);
1221
+ it('should invoke adapter.gvlid if it\'s a function', () => {
1222
+ adapter.gvlid = (cfg) => cfg.k
1223
+ const cfg = {k: 231};
1224
+ expect(internal.getGvlidForAnalyticsAdapter('analytics', cfg)).to.eql(231);
1225
+ });
1226
+
1227
+ it('should not choke if adapter gvlid fn throws', () => {
1228
+ adapter.gvlid = () => { throw new Error(); };
1229
+ expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.not.be.ok;
1230
+ });
1184
1231
  });
1185
- });
1232
+ })
1186
1233
  });
@@ -0,0 +1,284 @@
1
+ import {defaultHandler, GenericAnalytics} from '../../../modules/genericAnalyticsAdapter.js';
2
+ import * as events from 'src/events.js';
3
+ import * as CONSTANTS from 'src/constants.json';
4
+
5
+ const {AUCTION_INIT, BID_RESPONSE} = CONSTANTS.EVENTS;
6
+
7
+ describe('Generic analytics', () => {
8
+ describe('adapter', () => {
9
+ let adapter, sandbox, clock;
10
+ beforeEach(() => {
11
+ sandbox = sinon.sandbox.create();
12
+ sandbox.stub(events, 'getEvents').returns([]);
13
+ clock = sandbox.useFakeTimers();
14
+ adapter = new GenericAnalytics();
15
+ });
16
+
17
+ afterEach(() => {
18
+ adapter.disableAnalytics();
19
+ sandbox.restore();
20
+ });
21
+
22
+ describe('configuration', () => {
23
+ it('should be accepted if valid', () => {
24
+ adapter.enableAnalytics({
25
+ options: {
26
+ url: 'mock',
27
+ method: 'GET',
28
+ batchSize: 123,
29
+ batchDelay: 321
30
+ }
31
+ });
32
+ expect(adapter.enabled).to.be.true;
33
+ });
34
+
35
+ describe('should not work if', () => {
36
+ afterEach(function() {
37
+ expect(adapter.enabled).to.equal(false, this.currentTest.title);
38
+ });
39
+
40
+ it('neither handler nor url are specified', () => {
41
+ adapter.enableAnalytics({});
42
+ });
43
+
44
+ ['batchSize', 'batchDelay', 'handler'].forEach(option => {
45
+ it(`${option} is not valid`, () => {
46
+ adapter.enableAnalytics({
47
+ options: {
48
+ url: 'mock',
49
+ [option]: false
50
+ }
51
+ });
52
+ });
53
+ });
54
+
55
+ it('method is not GET or POST', () => {
56
+ adapter.enableAnalytics({
57
+ options: {
58
+ url: 'mock',
59
+ method: 'PATCH'
60
+ }
61
+ });
62
+ });
63
+
64
+ it('events is not an object', () => {
65
+ adapter.enableAnalytics({
66
+ options: {
67
+ url: 'mock',
68
+ events: null
69
+ }
70
+ });
71
+ });
72
+
73
+ it('events\' properties are not functions', () => {
74
+ adapter.enableAnalytics({
75
+ options: {
76
+ url: 'mock',
77
+ events: {
78
+ bidResponse: null
79
+ }
80
+ }
81
+ });
82
+ });
83
+ });
84
+ });
85
+
86
+ describe('when handler is specified', () => {
87
+ let handler;
88
+ beforeEach(() => {
89
+ handler = sinon.stub();
90
+ });
91
+
92
+ it('should collect events in batches, and call handler', () => {
93
+ adapter.enableAnalytics({
94
+ options: {
95
+ handler,
96
+ batchSize: 2
97
+ }
98
+ });
99
+ events.emit(AUCTION_INIT, {i: 0});
100
+ sinon.assert.notCalled(handler);
101
+ events.emit(BID_RESPONSE, {i: 0});
102
+ sinon.assert.calledWith(handler, sinon.match((arg) => {
103
+ return sinon.match({eventType: AUCTION_INIT, args: {i: 0}}).test(arg[0]) &&
104
+ sinon.match({eventType: BID_RESPONSE, args: {i: 0}}).test(arg[1]);
105
+ }));
106
+ });
107
+
108
+ it('should not choke if handler throws', () => {
109
+ adapter.enableAnalytics({
110
+ options: {
111
+ handler,
112
+ batchSize: 1
113
+ }
114
+ });
115
+ handler.throws(new Error());
116
+ events.emit(AUCTION_INIT, {i: 0});
117
+ let recv;
118
+ handler.reset();
119
+ handler.callsFake((arg) => {
120
+ recv = arg;
121
+ });
122
+ events.emit(BID_RESPONSE, {i: 1});
123
+ expect(recv).to.eql([{eventType: BID_RESPONSE, args: {i: 1}}]);
124
+ });
125
+
126
+ it('should not cause infinite recursion, if handler triggers more events', () => {
127
+ let i = 0;
128
+ handler.callsFake(() => {
129
+ if (i <= 100) {
130
+ i++;
131
+ events.emit(BID_RESPONSE, {});
132
+ }
133
+ });
134
+ adapter.enableAnalytics({
135
+ options: {
136
+ handler,
137
+ }
138
+ });
139
+ events.emit(AUCTION_INIT, {});
140
+ expect(i >= 100).to.be.false;
141
+ });
142
+
143
+ it('should send incomplete batch after batchDelay', () => {
144
+ adapter.enableAnalytics({
145
+ options: {
146
+ batchDelay: 100,
147
+ batchSize: 2,
148
+ handler
149
+ }
150
+ });
151
+ [0, 1, 2].forEach(i => events.emit(BID_RESPONSE, {i}));
152
+ sinon.assert.calledOnce(handler);
153
+ clock.tick(100);
154
+ sinon.assert.calledTwice(handler);
155
+ });
156
+
157
+ it('does not send empty batches', () => {
158
+ adapter.enableAnalytics({
159
+ options: {
160
+ batchDelay: 100,
161
+ batchSize: 2,
162
+ handler
163
+ }
164
+ });
165
+ [0, 1, 2].forEach(i => events.emit(BID_RESPONSE, {i}));
166
+ sinon.assert.calledOnce(handler);
167
+ clock.tick(50);
168
+ events.emit(BID_RESPONSE, {i: 3});
169
+ sinon.assert.calledTwice(handler);
170
+ clock.tick(100);
171
+ sinon.assert.calledTwice(handler);
172
+ });
173
+
174
+ describe('and options.events is specified', () => {
175
+ it('filters out other events', () => {
176
+ adapter.enableAnalytics({
177
+ options: {
178
+ handler,
179
+ events: {
180
+ bidResponse(bid) {
181
+ return bid;
182
+ }
183
+ }
184
+ }
185
+ });
186
+ events.emit(AUCTION_INIT, {});
187
+ sinon.assert.notCalled(handler);
188
+ });
189
+
190
+ it('transforms event data', () => {
191
+ adapter.enableAnalytics({
192
+ options: {
193
+ handler,
194
+ events: {
195
+ bidResponse(bid) {
196
+ return {
197
+ extra: 'data',
198
+ prop: bid.prop
199
+ }
200
+ }
201
+ }
202
+ }
203
+ });
204
+ events.emit(BID_RESPONSE, {prop: 'value', i: 0});
205
+ sinon.assert.calledWith(handler, sinon.match(data => sinon.match({extra: 'data', prop: 'value'}).test(data[0])));
206
+ });
207
+
208
+ it('does not choke if an event handler throws', () => {
209
+ adapter.enableAnalytics({
210
+ options: {
211
+ handler,
212
+ events: {
213
+ bidResponse(bid) {
214
+ return bid;
215
+ },
216
+ auctionInit(auction) {
217
+ throw new Error();
218
+ }
219
+ }
220
+ }
221
+ });
222
+ events.emit(AUCTION_INIT, {});
223
+ events.emit(BID_RESPONSE, {i: 0});
224
+ sinon.assert.calledOnce(handler);
225
+ sinon.assert.calledWith(handler, sinon.match(data => sinon.match({i: 0}).test(data[0])));
226
+ });
227
+
228
+ it('filters out events when their handler returns undefined', () => {
229
+ adapter.enableAnalytics({
230
+ options: {
231
+ handler,
232
+ events: {
233
+ auctionInit(auction) {
234
+ return auction;
235
+ },
236
+ bidResponse(bid) {}
237
+ }
238
+ }
239
+ });
240
+ events.emit(AUCTION_INIT, {i: 0});
241
+ events.emit(BID_RESPONSE, {i: 1});
242
+ sinon.assert.calledOnce(handler);
243
+ sinon.assert.calledWith(handler, sinon.match(data => sinon.match({i: 0}).test(data[0])));
244
+ });
245
+ });
246
+ });
247
+ });
248
+
249
+ describe('default handler', () => {
250
+ const url = 'mock-url';
251
+
252
+ let ajax;
253
+ beforeEach(() => {
254
+ ajax = sinon.stub();
255
+ });
256
+
257
+ Object.entries({
258
+ 'GET': (data) => JSON.parse(data.data),
259
+ 'POST': (data) => JSON.parse(data)
260
+ }).forEach(([method, parse]) => {
261
+ describe(`when HTTP method is ${method}`, () => {
262
+ it('should send single event when batchSize is 1', () => {
263
+ const handler = defaultHandler({url, method, batchSize: 1, ajax});
264
+ const payload = {i: 0};
265
+ handler([payload, {}]);
266
+ sinon.assert.calledWith(ajax, url, sinon.match.any,
267
+ sinon.match(data => sinon.match(payload).test(parse(data))),
268
+ {method}
269
+ );
270
+ });
271
+
272
+ it('should send multiple events when batchSize is greater than 1', () => {
273
+ const handler = defaultHandler({url, method, batchSize: 10, ajax});
274
+ const payload = [{i: 0}, {i: 1}];
275
+ handler(payload);
276
+ sinon.assert.calledWith(ajax, url, sinon.match.any,
277
+ sinon.match(data => sinon.match(payload).test(parse(data))),
278
+ {method}
279
+ );
280
+ });
281
+ });
282
+ });
283
+ });
284
+ });
@@ -2,6 +2,8 @@ import * as utils from '../../../src/utils.js';
2
2
  import * as hook from '../../../src/hook.js'
3
3
  import { beforeInit, geoedgeSubmodule, setWrapper, wrapper, htmlPlaceholder, WRAPPER_URL, getClientUrl } from '../../../modules/geoedgeRtdProvider.js';
4
4
  import { server } from '../../../test/mocks/xhr.js';
5
+ import * as events from '../../../src/events.js';
6
+ import CONSTANTS from '../../../src/constants.json';
5
7
 
6
8
  let key = '123123123';
7
9
  function makeConfig() {
@@ -88,6 +90,19 @@ describe('Geoedge RTD module', function () {
88
90
  let isLinkPreloadAsScript = arg => arg.tagName === 'LINK' && arg.rel === 'preload' && arg.as === 'script' && arg.href === getClientUrl(key);
89
91
  expect(insertElementStub.calledWith(sinon.match(isLinkPreloadAsScript))).to.equal(true);
90
92
  });
93
+ it('should emit billable events with applicable winning bids', function () {
94
+ let applicableBid = mockBid('bidderA');
95
+ let nonApplicableBid = mockBid('bidderB');
96
+ let counter = 0;
97
+ events.on(CONSTANTS.EVENTS.BILLABLE_EVENT, function (event) {
98
+ if (event.vendor === 'geoedge' && event.type === 'impression') {
99
+ counter += 1;
100
+ }
101
+ });
102
+ events.emit(CONSTANTS.EVENTS.BID_WON, applicableBid);
103
+ events.emit(CONSTANTS.EVENTS.BID_WON, nonApplicableBid);
104
+ expect(counter).to.equal(1);
105
+ });
91
106
  });
92
107
  describe('onBidResponseEvent', function () {
93
108
  let bidFromA = mockBid('bidderA');
@@ -49,6 +49,10 @@ const RESPONSE = {
49
49
  describe('glomexBidAdapter', function () {
50
50
  const adapter = newBidder(spec)
51
51
 
52
+ it('should expose gvlid', function() {
53
+ expect(spec.gvlid).to.equal(967)
54
+ });
55
+
52
56
  describe('inherited functions', function () {
53
57
  it('exists and is a function', function () {
54
58
  expect(adapter.callBids).to.exist.and.to.be.a('function')
@@ -40,7 +40,7 @@ describe('gravitompId module', function () {
40
40
  describe('decode()', function () {
41
41
  it('should return the gravitompId when it exists in cookie', function () {
42
42
  const decoded = gravitoIdSystemSubmodule.decode(GRAVITOID_TEST_OBJ);
43
- expect(decoded).to.be.deep.equal({gravitompId: {id: GRAVITOID_TEST_VALUE}});
43
+ expect(decoded).to.be.deep.equal({gravitompId: GRAVITOID_TEST_VALUE});
44
44
  });
45
45
 
46
46
  it('should return the undefined when decode id is not "string"', function () {