prebid.js 7.26.0 → 7.28.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 (334) hide show
  1. package/.github/workflows/issue_tracker.yml +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adWMGAnalyticsAdapter.js +1 -1
  5. package/dist/adagioAnalyticsAdapter.js +1 -1
  6. package/dist/adagioBidAdapter.js +1 -1
  7. package/dist/adbookpspBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.js +1 -1
  9. package/dist/adhashBidAdapter.js +1 -1
  10. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxAdServerVideo.js +1 -1
  12. package/dist/adlooxAnalyticsAdapter.js +1 -1
  13. package/dist/adlooxRtdProvider.js +1 -1
  14. package/dist/admaticBidAdapter.js +1 -1
  15. package/dist/admixerBidAdapter.js +1 -1
  16. package/dist/adomikAnalyticsAdapter.js +1 -1
  17. package/dist/adrelevantisBidAdapter.js +1 -1
  18. package/dist/adtrgtmeBidAdapter.js +1 -1
  19. package/dist/adxcgAnalyticsAdapter.js +1 -1
  20. package/dist/adxcgBidAdapter.js +1 -1
  21. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  22. package/dist/aidemBidAdapter.js +1 -0
  23. package/dist/ajaBidAdapter.js +1 -1
  24. package/dist/amxBidAdapter.js +1 -1
  25. package/dist/amxIdSystem.js +1 -1
  26. package/dist/analyticsAdapter.js +1 -1
  27. package/dist/appierAnalyticsAdapter.js +1 -1
  28. package/dist/appnexusBidAdapter.js +1 -1
  29. package/dist/asoBidAdapter.js +1 -1
  30. package/dist/atsAnalyticsAdapter.js +1 -1
  31. package/dist/axonixBidAdapter.js +1 -1
  32. package/dist/bidViewability.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bridgewellBidAdapter.js +1 -1
  37. package/dist/brightMountainMediaBidAdapter.js +1 -1
  38. package/dist/browsiRtdProvider.js +1 -1
  39. package/dist/bucksenseBidAdapter.js +1 -1
  40. package/dist/byDataAnalyticsAdapter.js +1 -1
  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/kargoBidAdapter.js +1 -1
  91. package/dist/kinessoIdSystem.js +1 -1
  92. package/dist/konduitAnalyticsAdapter.js +1 -1
  93. package/dist/kueezBidAdapter.js +1 -1
  94. package/dist/kueezRtbBidAdapter.js +1 -1
  95. package/dist/lassoBidAdapter.js +1 -1
  96. package/dist/lifestreetBidAdapter.js +1 -1
  97. package/dist/limelightDigitalBidAdapter.js +1 -1
  98. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  99. package/dist/liveIntentIdSystem.js +1 -1
  100. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  101. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  102. package/dist/logicadBidAdapter.js +1 -1
  103. package/dist/loglyliftBidAdapter.js +1 -1
  104. package/dist/lotamePanoramaIdSystem.js +1 -1
  105. package/dist/magniteAnalyticsAdapter.js +1 -1
  106. package/dist/malltvAnalyticsAdapter.js +1 -1
  107. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  108. package/dist/marsmediaBidAdapter.js +1 -1
  109. package/dist/mediafuseBidAdapter.js +1 -1
  110. package/dist/mediagoBidAdapter.js +1 -1
  111. package/dist/medianetAnalyticsAdapter.js +1 -1
  112. package/dist/mediasquareBidAdapter.js +1 -1
  113. package/dist/mgidBidAdapter.js +1 -1
  114. package/dist/minutemediaBidAdapter.js +1 -1
  115. package/dist/nexx360BidAdapter.js +1 -1
  116. package/dist/not-for-prod/prebid.js +206 -202
  117. package/dist/oguryBidAdapter.js +1 -1
  118. package/dist/onetagBidAdapter.js +1 -1
  119. package/dist/ooloAnalyticsAdapter.js +1 -1
  120. package/dist/openxAnalyticsAdapter.js +1 -1
  121. package/dist/optimonAnalyticsAdapter.js +1 -1
  122. package/dist/outbrainBidAdapter.js +1 -1
  123. package/dist/parrableIdSystem.js +1 -1
  124. package/dist/pbsExtensions.js +1 -1
  125. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  126. package/dist/pixfutureBidAdapter.js +1 -1
  127. package/dist/prebid-core.js +2 -2
  128. package/dist/prebidServerBidAdapter.js +1 -1
  129. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  130. package/dist/pubCommonId.js +1 -1
  131. package/dist/pubProvidedIdSystem.js +1 -1
  132. package/dist/publinkIdSystem.js +1 -1
  133. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  134. package/dist/pubmaticBidAdapter.js +1 -1
  135. package/dist/pubperfAnalyticsAdapter.js +1 -1
  136. package/dist/pubstackAnalyticsAdapter.js +1 -1
  137. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  138. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  139. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  140. package/dist/pxyzBidAdapter.js +1 -1
  141. package/dist/quantcastBidAdapter.js +1 -1
  142. package/dist/quantcastIdSystem.js +1 -1
  143. package/dist/rasBidAdapter.js +1 -1
  144. package/dist/readpeakBidAdapter.js +1 -1
  145. package/dist/realvuAnalyticsAdapter.js +1 -1
  146. package/dist/redtramBidAdapter.js +1 -0
  147. package/dist/relaidoBidAdapter.js +1 -1
  148. package/dist/relevantAnalyticsAdapter.js +1 -1
  149. package/dist/rhythmoneBidAdapter.js +1 -1
  150. package/dist/riseBidAdapter.js +1 -1
  151. package/dist/rivrAnalyticsAdapter.js +1 -1
  152. package/dist/roxotAnalyticsAdapter.js +1 -1
  153. package/dist/rtbhouseBidAdapter.js +1 -1
  154. package/dist/rtdModule.js +1 -1
  155. package/dist/rubiconAnalyticsAdapter.js +1 -1
  156. package/dist/rubiconBidAdapter.js +1 -1
  157. package/dist/s2sTesting.js +1 -1
  158. package/dist/scaleableAnalyticsAdapter.js +1 -1
  159. package/dist/schain.js +1 -1
  160. package/dist/seedingAllianceBidAdapter.js +1 -1
  161. package/dist/seedtagBidAdapter.js +1 -1
  162. package/dist/sharedIdSystem.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/sigmoidAnalyticsAdapter.js +1 -1
  167. package/dist/smaatoBidAdapter.js +1 -1
  168. package/dist/smartadserverBidAdapter.js +1 -1
  169. package/dist/smartxBidAdapter.js +1 -1
  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/targetVideoBidAdapter.js +1 -1
  182. package/dist/teadsBidAdapter.js +1 -1
  183. package/dist/teadsIdSystem.js +1 -1
  184. package/dist/terceptAnalyticsAdapter.js +1 -1
  185. package/dist/trionBidAdapter.js +1 -1
  186. package/dist/tripleliftBidAdapter.js +1 -1
  187. package/dist/ttdBidAdapter.js +1 -1
  188. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  189. package/dist/underdogmediaBidAdapter.js +1 -1
  190. package/dist/undertoneBidAdapter.js +1 -1
  191. package/dist/userId.js +1 -1
  192. package/dist/vidazooBidAdapter.js +1 -1
  193. package/dist/videobyteBidAdapter.js +1 -1
  194. package/dist/visxBidAdapter.js +1 -1
  195. package/dist/vuukleBidAdapter.js +1 -1
  196. package/dist/weboramaRtdProvider.js +1 -1
  197. package/dist/widespaceBidAdapter.js +1 -1
  198. package/dist/winrBidAdapter.js +1 -1
  199. package/dist/yahoosspBidAdapter.js +1 -1
  200. package/dist/yandexBidAdapter.js +1 -1
  201. package/dist/yieldlabBidAdapter.js +1 -1
  202. package/dist/yieldliftBidAdapter.js +1 -1
  203. package/dist/yieldmoBidAdapter.js +1 -1
  204. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  205. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  206. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/growthcode.html +134 -0
  208. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  209. package/libraries/ortb2.5StrictTranslator/dsl.js +54 -0
  210. package/libraries/ortb2.5StrictTranslator/spec.js +81 -0
  211. package/libraries/ortb2.5StrictTranslator/translator.js +37 -0
  212. package/libraries/ortb2.5Translator/translator.js +82 -0
  213. package/modules/33acrossIdSystem.js +3 -0
  214. package/modules/adhashBidAdapter.js +115 -30
  215. package/modules/adhashBidAdapter.md +1 -3
  216. package/modules/admaticBidAdapter.js +10 -1
  217. package/modules/admixerBidAdapter.js +1 -1
  218. package/modules/aidemBidAdapter.js +492 -0
  219. package/modules/aidemBidAdapter.md +187 -0
  220. package/modules/browsiRtdProvider.js +6 -4
  221. package/modules/bucksenseBidAdapter.js +1 -1
  222. package/modules/criteoBidAdapter.js +3 -3
  223. package/modules/discoveryBidAdapter.js +3 -0
  224. package/modules/eplanningBidAdapter.js +2 -6
  225. package/modules/fluctBidAdapter.js +5 -0
  226. package/modules/gdprEnforcement.js +26 -24
  227. package/modules/genericAnalyticsAdapter.js +157 -0
  228. package/modules/geoedgeRtdProvider.js +22 -0
  229. package/modules/glomexBidAdapter.js +2 -0
  230. package/modules/gravitoIdSystem.js +3 -4
  231. package/modules/gridBidAdapter.js +1 -1
  232. package/modules/gridNMBidAdapter.js +1 -1
  233. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  234. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  235. package/modules/impactifyBidAdapter.js +19 -1
  236. package/modules/jwplayerRtdProvider.js +1 -2
  237. package/modules/kargoBidAdapter.js +1 -1
  238. package/modules/lassoBidAdapter.js +8 -4
  239. package/modules/limelightDigitalBidAdapter.js +1 -1
  240. package/modules/liveIntentIdSystem.js +1 -2
  241. package/modules/mediagoBidAdapter.js +2 -1
  242. package/modules/minutemediaBidAdapter.md +3 -3
  243. package/modules/nexx360BidAdapter.js +264 -138
  244. package/modules/openxBidAdapter.md +15 -14
  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/smartxBidAdapter.js +1 -1
  259. package/modules/smnBidAdapter.md +52 -0
  260. package/modules/taboolaBidAdapter.js +20 -7
  261. package/modules/tripleliftBidAdapter.js +1 -1
  262. package/modules/ttdBidAdapter.js +4 -0
  263. package/modules/vidazooBidAdapter.js +31 -8
  264. package/modules/yandexBidAdapter.js +85 -19
  265. package/modules/yandexBidAdapter.md +7 -7
  266. package/modules/yieldlabBidAdapter.js +10 -4
  267. package/modules/yieldliftBidAdapter.js +3 -3
  268. package/package.json +2 -2
  269. package/src/auction.js +30 -4
  270. package/src/consentHandler.js +8 -0
  271. package/src/constants.json +2 -1
  272. package/src/events.js +4 -0
  273. package/src/native.js +31 -20
  274. package/src/refererDetection.js +6 -1
  275. package/src/storageManager.js +6 -3
  276. package/test/helpers/analytics.js +34 -0
  277. package/test/helpers/refererDetectionHelper.js +88 -0
  278. package/test/mocks/analyticsStub.js +3 -1
  279. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  280. package/test/spec/auctionmanager_spec.js +119 -1
  281. package/test/spec/modules/33acrossIdSystem_spec.js +4 -1
  282. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  283. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  284. package/test/spec/modules/adhashBidAdapter_spec.js +65 -11
  285. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  286. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  287. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  288. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  289. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  290. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  291. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  292. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  293. package/test/spec/modules/fpdModule_spec.js +1 -1
  294. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  295. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  296. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  297. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  298. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  299. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  300. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  301. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  302. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  303. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  304. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  305. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  306. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  307. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  308. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  309. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  310. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  311. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  312. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  313. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  314. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  315. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  316. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  317. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  318. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  319. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  320. package/test/spec/modules/taboolaBidAdapter_spec.js +39 -0
  321. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  322. package/test/spec/modules/ttdBidAdapter_spec.js +50 -9
  323. package/test/spec/modules/vidazooBidAdapter_spec.js +173 -27
  324. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  325. package/test/spec/modules/yieldlabBidAdapter_spec.js +49 -20
  326. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  327. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  328. package/test/spec/native_spec.js +68 -56
  329. package/test/spec/ortb2.5StrictTranslator/dsl_spec.js +137 -0
  330. package/test/spec/ortb2.5StrictTranslator/spec_spec.js +358 -0
  331. package/test/spec/ortb2.5StrictTranslator/translator_spec.js +16 -0
  332. package/test/spec/ortb2.5Translator/translator_spec.js +64 -0
  333. package/test/spec/refererDetection_spec.js +46 -95
  334. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -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 () {
@@ -0,0 +1,70 @@
1
+ import adapterManager from '../../../src/adapterManager.js';
2
+ import growthCodeAnalyticsAdapter from '../../../modules/growthCodeAnalyticsAdapter.js';
3
+ import { expect } from 'chai';
4
+ import * as events from '../../../src/events.js';
5
+ import constants from '../../../src/constants.json';
6
+ import { generateUUID } from '../../../src/utils.js';
7
+ import { server } from 'test/mocks/xhr.js';
8
+
9
+ describe('growthCode analytics adapter', () => {
10
+ beforeEach(() => {
11
+ growthCodeAnalyticsAdapter.enableAnalytics({
12
+ provider: 'growthCodeAnalytics',
13
+ options: {
14
+ pid: 'TEST01',
15
+ trackEvents: [
16
+ 'auctionInit',
17
+ 'auctionEnd',
18
+ 'bidAdjustment',
19
+ 'bidTimeout',
20
+ 'bidTimeout',
21
+ 'bidRequested',
22
+ 'bidResponse',
23
+ 'setTargeting',
24
+ 'requestBids',
25
+ 'addAdUnits',
26
+ 'noBid',
27
+ 'bidWon',
28
+ 'bidderDone']
29
+ }
30
+ });
31
+ });
32
+
33
+ afterEach(() => {
34
+ growthCodeAnalyticsAdapter.disableAnalytics();
35
+ });
36
+
37
+ it('registers itself with the adapter manager', () => {
38
+ const adapter = adapterManager.getAnalyticsAdapter('growthCodeAnalytics');
39
+ expect(adapter).to.exist;
40
+ expect(adapter.adapter).to.equal(growthCodeAnalyticsAdapter);
41
+ });
42
+
43
+ it('tolerates undefined or empty config', () => {
44
+ growthCodeAnalyticsAdapter.enableAnalytics(undefined);
45
+ growthCodeAnalyticsAdapter.enableAnalytics({});
46
+ });
47
+
48
+ it('sends auction end events to the backend', () => {
49
+ const auction = {
50
+ auctionId: generateUUID(),
51
+ adUnits: [{
52
+ code: 'usr1234',
53
+ mediaTypes: {
54
+ banner: {
55
+ sizes: [[300, 250], [300, 600], [728, 90]]
56
+ }
57
+ },
58
+ adUnitCodes: ['usr1234']
59
+ }],
60
+ };
61
+ events.emit(constants.EVENTS.AUCTION_END, auction);
62
+ assert(server.requests.length > 0)
63
+ const body = JSON.parse(server.requests[0].requestBody);
64
+ var eventTypes = [];
65
+ body.events.forEach(e => eventTypes.push(e.eventType));
66
+ assert(eventTypes.length > 0)
67
+ assert(eventTypes.indexOf(constants.EVENTS.AUCTION_END) > -1);
68
+ growthCodeAnalyticsAdapter.disableAnalytics();
69
+ });
70
+ });
@@ -166,6 +166,19 @@ describe('ImpactifyAdapter', function () {
166
166
  }
167
167
  };
168
168
 
169
+ it('should pass bidfloor', function () {
170
+ videoBidRequests[0].getFloor = function() {
171
+ return {
172
+ currency: 'USD',
173
+ floor: 1.23,
174
+ }
175
+ }
176
+
177
+ const res = spec.buildRequests(videoBidRequests, videoBidderRequest)
178
+ const resData = JSON.parse(res.data)
179
+ expect(resData.imp[0].bidfloor).to.equal(1.23)
180
+ });
181
+
169
182
  it('sends video bid request to ENDPOINT via POST', function () {
170
183
  const request = spec.buildRequests(videoBidRequests, videoBidderRequest);
171
184
  expect(request.url).to.equal(ORIGIN + AUCTIONURI);
@@ -1,5 +1,6 @@
1
1
  import invisiblyAdapter from 'modules/invisiblyAnalyticsAdapter.js';
2
2
  import { expect } from 'chai';
3
+ import {expectEvents} from '../../helpers/analytics.js';
3
4
  let events = require('src/events');
4
5
  let constants = require('src/constants.json');
5
6
 
@@ -197,14 +198,8 @@ describe('Invisibly Analytics Adapter test suite', function () {
197
198
  account: 'invisibly',
198
199
  },
199
200
  });
200
- events.emit(constants.EVENTS.AUCTION_INIT, MOCK.AUCTION_INIT);
201
- events.emit(constants.EVENTS.AUCTION_END, MOCK.AUCTION_END);
202
- events.emit(constants.EVENTS.BID_REQUESTED, MOCK.BID_REQUESTED);
203
- events.emit(constants.EVENTS.BID_RESPONSE, MOCK.BID_RESPONSE);
204
- events.emit(constants.EVENTS.BID_WON, MOCK.BID_WON);
205
201
 
206
- // 5 Invisibly events + 1 Clean.io event
207
- sinon.assert.callCount(invisiblyAdapter.track, 6);
202
+ expectEvents().to.beTrackedBy(invisiblyAdapter.track);
208
203
  });
209
204
 
210
205
  it('should not catch events triggered without invisibly account config', function () {
@@ -382,9 +377,6 @@ describe('Invisibly Analytics Adapter test suite', function () {
382
377
  expect(invisiblyEvents.event_data.pageViewId).to.exist;
383
378
  expect(invisiblyEvents.event_data.ver).to.equal(1);
384
379
  expect(invisiblyEvents.event_type).to.equal('PREBID_bidWon');
385
-
386
- // 1 Invisibly event + 1 Clean.io event
387
- sinon.assert.callCount(invisiblyAdapter.track, 2);
388
380
  });
389
381
 
390
382
  // spec for bidder done event
@@ -522,7 +514,6 @@ describe('Invisibly Analytics Adapter test suite', function () {
522
514
  expect(invisiblyEvents.event_data.auctionId).to.equal(
523
515
  MOCK.AUCTION_END.auctionId
524
516
  );
525
- sinon.assert.callCount(invisiblyAdapter.track, 1);
526
517
  });
527
518
 
528
519
  // should not call sendEvent for events not supported by the adapter
@@ -541,22 +532,21 @@ describe('Invisibly Analytics Adapter test suite', function () {
541
532
  it('track all event without errors', function () {
542
533
  invisiblyAdapter.enableAnalytics(MOCK.config);
543
534
 
544
- events.emit(constants.EVENTS.AUCTION_INIT, MOCK.AUCTION_INIT);
545
- events.emit(constants.EVENTS.AUCTION_END, MOCK.AUCTION_END);
546
- events.emit(constants.EVENTS.BID_ADJUSTMENT, MOCK.BID_ADJUSTMENT);
547
- events.emit(constants.EVENTS.BID_TIMEOUT, MOCK.BID_TIMEOUT);
548
- events.emit(constants.EVENTS.BID_REQUESTED, MOCK.BID_REQUESTED);
549
- events.emit(constants.EVENTS.BID_RESPONSE, MOCK.BID_RESPONSE);
550
- events.emit(constants.EVENTS.NO_BID, MOCK.NO_BID);
551
- events.emit(constants.EVENTS.BID_WON, MOCK.BID_WON);
552
- events.emit(constants.EVENTS.BIDDER_DONE, MOCK.BIDDER_DONE);
553
- events.emit(constants.EVENTS.SET_TARGETING, MOCK.SET_TARGETING);
554
- events.emit(constants.EVENTS.REQUEST_BIDS, MOCK.REQUEST_BIDS);
555
- events.emit(constants.EVENTS.ADD_AD_UNITS, MOCK.ADD_AD_UNITS);
556
- events.emit(constants.EVENTS.AD_RENDER_FAILED, MOCK.AD_RENDER_FAILED);
557
-
558
- // 13 Invisibly events + 1 Clean.io event
559
- sinon.assert.callCount(invisiblyAdapter.track, 14);
535
+ expectEvents([
536
+ constants.EVENTS.AUCTION_INIT,
537
+ constants.EVENTS.AUCTION_END,
538
+ constants.EVENTS.BID_ADJUSTMENT,
539
+ constants.EVENTS.BID_TIMEOUT,
540
+ constants.EVENTS.BID_REQUESTED,
541
+ constants.EVENTS.BID_RESPONSE,
542
+ constants.EVENTS.NO_BID,
543
+ constants.EVENTS.BID_WON,
544
+ constants.EVENTS.BIDDER_DONE,
545
+ constants.EVENTS.SET_TARGETING,
546
+ constants.EVENTS.REQUEST_BIDS,
547
+ constants.EVENTS.ADD_AD_UNITS,
548
+ constants.EVENTS.AD_RENDER_FAILED
549
+ ]).to.beTrackedBy(invisiblyAdapter.track);
560
550
  });
561
551
  });
562
552
 
@@ -659,9 +659,9 @@ describe('jwplayerRtdProvider', function() {
659
659
  const segment2 = 'segment2';
660
660
  const segment3 = 'segment3';
661
661
  const contentSegments = getContentSegments([segment1, segment2, segment3]);
662
- expect(contentSegments[0]).to.deep.equal({ id: segment1, value: segment1 });
663
- expect(contentSegments[1]).to.deep.equal({ id: segment2, value: segment2 });
664
- expect(contentSegments[2]).to.deep.equal({ id: segment3, value: segment3 });
662
+ expect(contentSegments[0]).to.deep.equal({ id: segment1 });
663
+ expect(contentSegments[1]).to.deep.equal({ id: segment2 });
664
+ expect(contentSegments[2]).to.deep.equal({ id: segment3 });
665
665
  });
666
666
  });
667
667
 
@@ -121,7 +121,5 @@ describe(`Konduit Analytics Adapter`, () => {
121
121
  expect(requestBody.konduitId).to.be.equal(konduitId);
122
122
  expect(requestBody.prebidVersion).to.be.equal('$prebid.version$');
123
123
  expect(requestBody.environment).to.be.an('object');
124
- // 6 Konduit events + 1 Clean.io event
125
- sinon.assert.callCount(konduitAnalyticsAdapter.track, 7);
126
124
  });
127
125
  });
@@ -2,6 +2,7 @@ import liAnalytics from 'modules/liveIntentAnalyticsAdapter';
2
2
  import { expect } from 'chai';
3
3
  import { server } from 'test/mocks/xhr.js';
4
4
  import { auctionManager } from 'src/auctionManager.js';
5
+ import {expectEvents} from '../../helpers/analytics.js';
5
6
 
6
7
  let utils = require('src/utils');
7
8
  let refererDetection = require('src/refererDetection');
@@ -286,12 +287,8 @@ describe('LiveIntent Analytics Adapter ', () => {
286
287
  });
287
288
 
288
289
  it('track is called', () => {
289
- liAnalytics.enableAnalytics(config);
290
290
  sandbox.stub(liAnalytics, 'track');
291
- events.emit(constants.EVENTS.AUCTION_END, args);
292
- events.emit(constants.EVENTS.AUCTION_END, args);
293
- events.emit(constants.EVENTS.AUCTION_END, args);
294
- clock.tick(6000);
295
- sinon.assert.callCount(liAnalytics.track, 3)
291
+ liAnalytics.enableAnalytics(config);
292
+ expectEvents().to.beTrackedBy(liAnalytics.track);
296
293
  })
297
294
  });
@@ -3,6 +3,7 @@ import medianetAnalytics from 'modules/medianetAnalyticsAdapter.js';
3
3
  import * as utils from 'src/utils.js';
4
4
  import CONSTANTS from 'src/constants.json';
5
5
  import * as events from 'src/events.js';
6
+ import {clearEvents} from 'src/events.js';
6
7
 
7
8
  const {
8
9
  EVENTS: { AUCTION_INIT, BID_REQUESTED, BID_RESPONSE, NO_BID, BID_TIMEOUT, AUCTION_END, SET_TARGETING, BID_WON }
@@ -127,7 +128,12 @@ describe('Media.net Analytics Adapter', function() {
127
128
  options: {
128
129
  cid: CUSTOMER_ID
129
130
  }
130
- };
131
+ }
132
+
133
+ before(() => {
134
+ clearEvents();
135
+ });
136
+
131
137
  beforeEach(function () {
132
138
  sandbox = sinon.sandbox.create();
133
139
  });