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
@@ -4,6 +4,7 @@ import optimonAnalyticsAdapter from '../../../modules/optimonAnalyticsAdapter.js
4
4
  import adapterManager from 'src/adapterManager';
5
5
  import * as events from 'src/events';
6
6
  import constants from 'src/constants.json'
7
+ import {expectEvents} from '../../helpers/analytics.js';
7
8
 
8
9
  const AD_UNIT_CODE = 'demo-adunit-1';
9
10
  const PUBLISHER_CONFIG = {
@@ -14,14 +15,12 @@ const PUBLISHER_CONFIG = {
14
15
 
15
16
  describe('Optimon Analytics Adapter', () => {
16
17
  const optmn_currentWindow = utils.getWindowSelf();
17
- let optmn_queue = [];
18
18
 
19
19
  beforeEach(() => {
20
- optmn_currentWindow.OptimonAnalyticsAdapter = (...optmn_args) => optmn_queue.push(optmn_args);
20
+ optmn_currentWindow.OptimonAnalyticsAdapter = sinon.stub()
21
21
  adapterManager.enableAnalytics({
22
22
  provider: 'optimon'
23
23
  });
24
- optmn_queue = []
25
24
  });
26
25
 
27
26
  afterEach(() => {
@@ -29,13 +28,6 @@ describe('Optimon Analytics Adapter', () => {
29
28
  });
30
29
 
31
30
  it('should forward all events to the queue', () => {
32
- const optmn_arguments = [AD_UNIT_CODE, PUBLISHER_CONFIG];
33
-
34
- events.emit(constants.EVENTS.AUCTION_END, optmn_arguments)
35
- events.emit(constants.EVENTS.BID_TIMEOUT, optmn_arguments)
36
- events.emit(constants.EVENTS.BID_WON, optmn_arguments)
37
-
38
- // 3 Optimon events + 1 Clean.io event
39
- expect(optmn_queue.length).to.eql(4);
31
+ expectEvents().to.beBundledTo(optmn_currentWindow.OptimonAnalyticsAdapter);
40
32
  });
41
33
  });
@@ -52,19 +52,12 @@ describe('Piano DMP Analytics Adapter', () => {
52
52
 
53
53
  // Then
54
54
  const callQueue = (window.cX || {}).callQueue;
55
- const billableEventIndex = callQueue.findIndex(([, params]) => params.eventType === constants.EVENTS.BILLABLE_EVENT);
56
- if (billableEventIndex > -1) {
57
- callQueue.splice(billableEventIndex, 1);
58
- }
59
55
 
60
- expect(callQueue).to.be.an('array');
61
- expect(callQueue.length).to.equal(testEvents.length);
62
-
63
- callQueue.forEach(([method, params], index) => {
56
+ testEvents.forEach(({event, args}) => {
57
+ const [method, params] = callQueue.filter(item => item[1].eventType === event)[0];
64
58
  expect(method).to.equal('prebid');
65
- expect(params.eventType).to.equal(testEvents[index].event);
66
- expect(params.params).to.deep.equal(testEvents[index].args);
67
- });
59
+ expect(params.params).to.deep.equal(args);
60
+ })
68
61
  });
69
62
  });
70
63
  });
@@ -1,9 +1,8 @@
1
- import prebidmanagerAnalytics, {
2
- storage
3
- } from 'modules/prebidmanagerAnalyticsAdapter.js';
1
+ import prebidmanagerAnalytics, {storage} from 'modules/prebidmanagerAnalyticsAdapter.js';
4
2
  import {expect} from 'chai';
5
3
  import {server} from 'test/mocks/xhr.js';
6
4
  import * as utils from 'src/utils.js';
5
+ import {expectEvents} from '../../helpers/analytics.js';
7
6
 
8
7
  let events = require('src/events');
9
8
  let constants = require('src/constants.json');
@@ -95,15 +94,7 @@ describe('Prebid Manager Analytics Adapter', function () {
95
94
  }
96
95
  });
97
96
 
98
- events.emit(constants.EVENTS.AUCTION_INIT, {});
99
- events.emit(constants.EVENTS.BID_REQUESTED, {});
100
- events.emit(constants.EVENTS.BID_RESPONSE, {});
101
- events.emit(constants.EVENTS.BID_WON, {});
102
- events.emit(constants.EVENTS.AUCTION_END, {});
103
- events.emit(constants.EVENTS.BID_TIMEOUT, {});
104
-
105
- // 6 Prebid Manager events + 1 Clean.io event
106
- sinon.assert.callCount(prebidmanagerAnalytics.track, 7);
97
+ expectEvents().to.beTrackedBy(prebidmanagerAnalytics.track);
107
98
  });
108
99
  });
109
100
 
@@ -1,9 +1,10 @@
1
1
  import pubperfAnalytics from 'modules/pubperfAnalyticsAdapter.js';
2
- import { expect } from 'chai';
3
- import { server } from 'test/mocks/xhr.js';
2
+ import {expect} from 'chai';
3
+ import {server} from 'test/mocks/xhr.js';
4
+ import {expectEvents, fireEvents} from '../../helpers/analytics.js';
5
+
4
6
  let events = require('src/events');
5
7
  let utils = require('src/utils.js');
6
- let constants = require('src/constants.json');
7
8
 
8
9
  describe('Pubperf Analytics Adapter', function() {
9
10
  describe('Prebid Manager Analytic tests', function() {
@@ -22,13 +23,7 @@ describe('Pubperf Analytics Adapter', function() {
22
23
  provider: 'pubperf'
23
24
  });
24
25
 
25
- events.emit(constants.EVENTS.AUCTION_INIT, {});
26
- events.emit(constants.EVENTS.BID_REQUESTED, {});
27
- events.emit(constants.EVENTS.BID_RESPONSE, {});
28
- events.emit(constants.EVENTS.BID_WON, {});
29
- events.emit(constants.EVENTS.AUCTION_END, {});
30
- events.emit(constants.EVENTS.BID_TIMEOUT, {});
31
-
26
+ fireEvents();
32
27
  expect(server.requests.length).to.equal(0);
33
28
  expect(utils.logError.called).to.equal(true);
34
29
  });
@@ -42,15 +37,7 @@ describe('Pubperf Analytics Adapter', function() {
42
37
  provider: 'pubperf'
43
38
  });
44
39
 
45
- events.emit(constants.EVENTS.AUCTION_INIT, {});
46
- events.emit(constants.EVENTS.BID_REQUESTED, {});
47
- events.emit(constants.EVENTS.BID_RESPONSE, {});
48
- events.emit(constants.EVENTS.BID_WON, {});
49
- events.emit(constants.EVENTS.AUCTION_END, {});
50
- events.emit(constants.EVENTS.BID_TIMEOUT, {});
51
-
52
- // 6 Pubperf events + 1 Clean.io event
53
- sinon.assert.callCount(pubperfAnalytics.track, 7);
40
+ expectEvents().to.beTrackedBy(pubperfAnalytics.track);
54
41
  });
55
42
  });
56
43
  });
@@ -3,17 +3,16 @@ import pubstackAnalytics from '../../../modules/pubstackAnalyticsAdapter.js';
3
3
  import adapterManager from 'src/adapterManager';
4
4
  import * as events from 'src/events';
5
5
  import constants from 'src/constants.json'
6
+ import {expectEvents} from '../../helpers/analytics.js';
6
7
 
7
8
  describe('Pubstack Analytics Adapter', () => {
8
9
  const scope = utils.getWindowSelf();
9
- let queue = [];
10
10
 
11
11
  beforeEach(() => {
12
- scope.PubstackAnalytics = (...args) => queue.push(args);
12
+ scope.PubstackAnalytics = sinon.stub();
13
13
  adapterManager.enableAnalytics({
14
14
  provider: 'pubstack'
15
15
  });
16
- queue = []
17
16
  });
18
17
 
19
18
  afterEach(() => {
@@ -21,19 +20,6 @@ describe('Pubstack Analytics Adapter', () => {
21
20
  });
22
21
 
23
22
  it('should forward all events to the queue', () => {
24
- // Given
25
- const args = 'any-args'
26
-
27
- // When
28
- events.emit(constants.EVENTS.AUCTION_END, args)
29
- events.emit(constants.EVENTS.BID_REQUESTED, args)
30
- events.emit(constants.EVENTS.BID_ADJUSTMENT, args)
31
- events.emit(constants.EVENTS.BID_RESPONSE, args)
32
- events.emit(constants.EVENTS.BID_WON, args)
33
- events.emit(constants.EVENTS.NO_BID, args)
34
-
35
- // Then
36
- // 6 Pubstack events + 1 Clean.io event
37
- expect(queue.length).to.eql(7);
23
+ expectEvents().to.beBundledTo(scope.PubstackAnalytics);
38
24
  });
39
25
  });
@@ -1,6 +1,7 @@
1
- import { expect } from 'chai';
1
+ import {expect} from 'chai';
2
2
  import pubwiseAnalytics from 'modules/pubwiseAnalyticsAdapter.js';
3
- import {server} from 'test/mocks/xhr.js';
3
+ import {expectEvents} from '../../helpers/analytics.js';
4
+
4
5
  let events = require('src/events');
5
6
  let adapterManager = require('src/adapterManager').default;
6
7
  let constants = require('src/constants.json');
@@ -58,23 +59,16 @@ describe('PubWise Prebid Analytics', function () {
58
59
 
59
60
  sandbox.spy(pubwiseAnalytics, 'track');
60
61
 
61
- // sent
62
- events.emit(constants.EVENTS.AUCTION_INIT, mock.AUCTION_INIT);
63
- events.emit(constants.EVENTS.BID_REQUESTED, {});
64
- events.emit(constants.EVENTS.BID_RESPONSE, {});
65
- events.emit(constants.EVENTS.BID_WON, {});
66
- events.emit(constants.EVENTS.AD_RENDER_FAILED, {});
67
- events.emit(constants.EVENTS.TCF2_ENFORCEMENT, {});
68
- events.emit(constants.EVENTS.BID_TIMEOUT, {});
69
-
70
- // forces flush
71
- events.emit(constants.EVENTS.AUCTION_END, {});
72
-
73
- // eslint-disable-next-line
74
- //console.log(requests);
75
-
76
- /* testing for 6 calls, including the 2 we're not currently tracking */
77
- sandbox.assert.callCount(pubwiseAnalytics.track, 8);
62
+ expectEvents([
63
+ constants.EVENTS.AUCTION_INIT,
64
+ constants.EVENTS.BID_REQUESTED,
65
+ constants.EVENTS.BID_RESPONSE,
66
+ constants.EVENTS.BID_WON,
67
+ constants.EVENTS.AD_RENDER_FAILED,
68
+ constants.EVENTS.TCF2_ENFORCEMENT,
69
+ constants.EVENTS.BID_TIMEOUT,
70
+ constants.EVENTS.AUCTION_END,
71
+ ]).to.beTrackedBy(pubwiseAnalytics.track);
78
72
  });
79
73
 
80
74
  it('should initialize the auction properly', function () {
@@ -59,7 +59,10 @@ describe('rasBidAdapter', function () {
59
59
  area: 'areatest',
60
60
  site: 'test',
61
61
  slotSequence: '0',
62
- network: '4178463'
62
+ network: '4178463',
63
+ customParams: {
64
+ test: 'name=value'
65
+ }
63
66
  }
64
67
  };
65
68
  const bid2 = {
@@ -98,6 +101,7 @@ describe('rasBidAdapter', function () {
98
101
  expect(requests[0].url).to.have.string('euconsent=some-consent-string');
99
102
  expect(requests[0].url).to.have.string('du=https%3A%2F%2Fexample.com%2F');
100
103
  expect(requests[0].url).to.have.string('dr=https%3A%2F%2Fexample.org%2F');
104
+ expect(requests[0].url).to.have.string('test=name%3Dvalue');
101
105
  });
102
106
 
103
107
  it('should return empty consent string when undefined', function () {
@@ -0,0 +1,256 @@
1
+ import {expect} from 'chai';
2
+ import {spec} from '../../../modules/redtramBidAdapter.js';
3
+ import { BANNER } from '../../../src/mediaTypes.js';
4
+ import * as utils from '../../../src/utils.js';
5
+
6
+ describe('RedtramBidAdapter', function () {
7
+ const bid = {
8
+ bidId: '23dc19818e5293',
9
+ bidder: 'redtram',
10
+ mediaTypes: {
11
+ [BANNER]: {
12
+ sizes: [[300, 250]]
13
+ }
14
+ },
15
+ params: {
16
+ placementId: 23611,
17
+ }
18
+ };
19
+
20
+ const bidderRequest = {
21
+ refererInfo: {
22
+ referer: 'test.com'
23
+ }
24
+ };
25
+
26
+ describe('isBidRequestValid', function () {
27
+ it('Should return true if there are bidId, params and key parameters present', function () {
28
+ expect(spec.isBidRequestValid(bid)).to.be.true;
29
+ });
30
+ it('Should return false if at least one of parameters is not present', function () {
31
+ delete bid.params.placementId;
32
+ expect(spec.isBidRequestValid(bid)).to.be.false;
33
+ });
34
+ });
35
+
36
+ describe('buildRequests', function () {
37
+ let serverRequest = spec.buildRequests([bid], bidderRequest);
38
+ it('Creates a ServerRequest object with method, URL and data', function () {
39
+ expect(serverRequest).to.exist;
40
+ expect(serverRequest.method).to.exist;
41
+ expect(serverRequest.url).to.exist;
42
+ expect(serverRequest.data).to.exist;
43
+ });
44
+ it('Returns POST method', function () {
45
+ expect(serverRequest.method).to.equal('POST');
46
+ });
47
+ it('Returns valid URL', function () {
48
+ expect(serverRequest.url).to.equal('https://prebid.redtram.com/pbjs');
49
+ });
50
+ it('Returns valid data if array of bids is valid', function () {
51
+ let data = serverRequest.data;
52
+ expect(data).to.be.an('object');
53
+ expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'host', 'page', 'placements');
54
+ expect(data.deviceWidth).to.be.a('number');
55
+ expect(data.deviceHeight).to.be.a('number');
56
+ expect(data.language).to.be.a('string');
57
+ expect(data.host).to.be.a('string');
58
+ expect(data.page).to.be.a('string');
59
+ expect(data.gdpr).to.not.exist;
60
+ expect(data.ccpa).to.not.exist;
61
+ let placement = data['placements'][0];
62
+ expect(placement).to.have.keys('placementId', 'bidId', 'adFormat', 'sizes', 'schain', 'bidfloor');
63
+ expect(placement.placementId).to.equal(23611);
64
+ expect(placement.bidId).to.equal('23dc19818e5293');
65
+ expect(placement.adFormat).to.equal(BANNER);
66
+ expect(placement.schain).to.be.an('object');
67
+ expect(placement.sizes).to.be.an('array');
68
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
69
+ });
70
+
71
+ it('Returns data with gdprConsent and without uspConsent', function () {
72
+ bidderRequest.gdprConsent = 'test';
73
+ serverRequest = spec.buildRequests([bid], bidderRequest);
74
+ let data = serverRequest.data;
75
+ expect(data.gdpr).to.exist;
76
+ expect(data.gdpr).to.be.a('string');
77
+ expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
78
+ expect(data.ccpa).to.not.exist;
79
+ delete bidderRequest.gdprConsent;
80
+ });
81
+
82
+ it('Returns data with uspConsent and without gdprConsent', function () {
83
+ bidderRequest.uspConsent = 'test';
84
+ serverRequest = spec.buildRequests([bid], bidderRequest);
85
+ let data = serverRequest.data;
86
+ expect(data.ccpa).to.exist;
87
+ expect(data.ccpa).to.be.a('string');
88
+ expect(data.ccpa).to.equal(bidderRequest.uspConsent);
89
+ expect(data.gdpr).to.not.exist;
90
+ });
91
+
92
+ it('Returns empty data if no valid requests are passed', function () {
93
+ serverRequest = spec.buildRequests([]);
94
+ let data = serverRequest.data;
95
+ expect(data.placements).to.be.an('array').that.is.empty;
96
+ });
97
+ });
98
+ describe('interpretResponse', function () {
99
+ it('Should interpret banner response', function () {
100
+ const banner = {
101
+ body: [{
102
+ mediaType: 'banner',
103
+ width: 300,
104
+ height: 250,
105
+ cpm: 0.4,
106
+ ad: 'Test',
107
+ requestId: '23dc19818e5293',
108
+ ttl: 120,
109
+ creativeId: '2',
110
+ netRevenue: true,
111
+ currency: 'USD',
112
+ dealId: '1',
113
+ meta: {}
114
+ }]
115
+ };
116
+ let bannerResponses = spec.interpretResponse(banner);
117
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
118
+ let dataItem = bannerResponses[0];
119
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
120
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
121
+ expect(dataItem.requestId).to.equal('23dc19818e5293');
122
+ expect(dataItem.cpm).to.equal(0.4);
123
+ expect(dataItem.width).to.equal(300);
124
+ expect(dataItem.height).to.equal(250);
125
+ expect(dataItem.ad).to.equal('Test');
126
+ expect(dataItem.ttl).to.equal(120);
127
+ expect(dataItem.creativeId).to.equal('2');
128
+ expect(dataItem.netRevenue).to.be.true;
129
+ expect(dataItem.currency).to.equal('USD');
130
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
131
+ });
132
+ it('Should return an empty array if invalid banner response is passed', function () {
133
+ const invBanner = {
134
+ body: [{
135
+ width: 300,
136
+ cpm: 0.4,
137
+ ad: 'Test',
138
+ requestId: '23dc19818e5293',
139
+ ttl: 120,
140
+ creativeId: '2',
141
+ netRevenue: true,
142
+ currency: 'USD',
143
+ dealId: '1'
144
+ }]
145
+ };
146
+
147
+ let serverResponses = spec.interpretResponse(invBanner);
148
+ expect(serverResponses).to.be.an('array').that.is.empty;
149
+ });
150
+ it('Should return an empty array if invalid response is passed', function () {
151
+ const invalid = {
152
+ body: [{
153
+ ttl: 120,
154
+ creativeId: '2',
155
+ netRevenue: true,
156
+ currency: 'USD',
157
+ dealId: '1'
158
+ }]
159
+ };
160
+ let serverResponses = spec.interpretResponse(invalid);
161
+ expect(serverResponses).to.be.an('array').that.is.empty;
162
+ });
163
+ });
164
+
165
+ describe('getUserSyncs', function () {
166
+ it('should do nothing on getUserSyncs', function () {
167
+ const syncData = spec.getUserSyncs({}, {}, {
168
+ consentString: 'ALL',
169
+ gdprApplies: true
170
+ }, {});
171
+ expect(syncData).to.be.an('array').which.is.not.empty;
172
+ expect(syncData[0]).to.be.an('object')
173
+ expect(syncData[0].type).to.be.a('string')
174
+ expect(syncData[0].type).to.equal('image')
175
+ expect(syncData[0].url).to.be.a('string')
176
+ expect(syncData[0].url).to.equal('https://prebid.redtram.com/sync/image?pbjs=1&gdpr=1&gdpr_consent=ALL&coppa=0')
177
+ });
178
+ });
179
+
180
+ describe('on bidWon', function () {
181
+ beforeEach(function() {
182
+ sinon.stub(utils, 'triggerPixel');
183
+ });
184
+ afterEach(function() {
185
+ utils.triggerPixel.restore();
186
+ });
187
+ it('should replace nurl for banner', function () {
188
+ const nurl = 'nurl/?ap=${' + 'AUCTION_PRICE}';
189
+ const bid = {
190
+ 'bidderCode': 'redtram',
191
+ 'width': 300,
192
+ 'height': 250,
193
+ 'statusMessage': 'Bid available',
194
+ 'adId': '5691dd18ba6ab6',
195
+ 'requestId': '23dc19818e5293',
196
+ 'transactionId': '948c716b-bf64-4303-bcf4-395c2f6a9770',
197
+ 'auctionId': 'a6b7c61f-15a9-481b-8f64-e859787e9c07',
198
+ 'mediaType': 'banner',
199
+ 'source': 'client',
200
+ 'ad': "<div class=\"r23611\"></div>\n<script type=\"text/javascript\">\n(function() {\nvar tag = (function() {\nvar informers = document.getElementsByClassName('r23611'),\nlen = informers.length;\nreturn len ? informers[len - 1] : null;\n})(),\nidn = (function() {\nvar i, num, idn = '', chars = \"abcdefghiklmnopqrstuvwxyz\",\nlen = Math.floor((Math.random() * 2) + 4);\nfor (i = 0; i < len; i++) {\nnum = Math.floor(Math.random() * chars.length);\nidn += chars.substring(num, num + 1);\n}\nreturn idn;\n})();\nvar container = document.createElement('div');\ncontainer.id = idn;\ntag.appendChild(container);\nvar script = document.createElement('script');\nscript.className = 's23611';\nscript.src = 'https://goods.redtram.com/j/23611/?v=1';\nscript.charset = 'utf-8';\nscript.dataset.idn = idn;\ntag.parentNode.insertBefore(script, tag);\n})();\n</script>",
201
+ 'cpm': 0.68,
202
+ 'nurl': nurl,
203
+ 'creativeId': 'test',
204
+ 'currency': 'USD',
205
+ 'dealId': '',
206
+ 'meta': {
207
+ 'advertiserDomains': [],
208
+ 'dchain': {
209
+ 'ver': '1.0',
210
+ 'complete': 0,
211
+ 'nodes': [
212
+ {
213
+ 'name': 'redtram'
214
+ }
215
+ ]
216
+ }
217
+ },
218
+ 'netRevenue': true,
219
+ 'ttl': 120,
220
+ 'metrics': {},
221
+ 'adapterCode': 'redtram',
222
+ 'originalCpm': 0.68,
223
+ 'originalCurrency': 'USD',
224
+ 'responseTimestamp': 1668162732297,
225
+ 'requestTimestamp': 1668162732292,
226
+ 'bidder': 'redtram',
227
+ 'adUnitCode': 'div-prebid',
228
+ 'timeToRespond': 5,
229
+ 'pbLg': '0.50',
230
+ 'pbMg': '0.60',
231
+ 'pbHg': '0.68',
232
+ 'pbAg': '0.65',
233
+ 'pbDg': '0.68',
234
+ 'pbCg': '',
235
+ 'size': '300x250',
236
+ 'adserverTargeting': {
237
+ 'hb_bidder': 'redtram',
238
+ 'hb_adid': '5691dd18ba6ab6',
239
+ 'hb_pb': '0.68',
240
+ 'hb_size': '300x250',
241
+ 'hb_source': 'client',
242
+ 'hb_format': 'banner',
243
+ 'hb_adomain': ''
244
+ },
245
+ 'status': 'rendered',
246
+ 'params': [
247
+ {
248
+ 'placementId': 23611
249
+ }
250
+ ]
251
+ };
252
+ spec.onBidWon(bid);
253
+ expect(bid.nurl).to.deep.equal('nurl/?ap=0.68');
254
+ });
255
+ });
256
+ });
@@ -106,6 +106,9 @@ describe('riseAdapter', function () {
106
106
  bidderCode: 'rise',
107
107
  }
108
108
  const placementId = '12345678';
109
+ const api = [1, 2];
110
+ const mimes = ['application/javascript', 'video/mp4', 'video/quicktime'];
111
+ const protocols = [2, 3, 5, 6];
109
112
 
110
113
  it('sends the placementId to ENDPOINT via POST', function () {
111
114
  bidRequests[0].params.placementId = placementId;
@@ -144,6 +147,27 @@ describe('riseAdapter', function () {
144
147
  expect(request.data.bids[0].bidId).to.equal('299ffc8cca0b87');
145
148
  });
146
149
 
150
+ it('should send the correct supported api array', function () {
151
+ bidRequests[0].mediaTypes.video.api = api;
152
+ const request = spec.buildRequests(bidRequests, bidderRequest);
153
+ expect(request.data.bids[0].api).to.be.an('array');
154
+ expect(request.data.bids[0].api).to.eql([1, 2]);
155
+ });
156
+
157
+ it('should send the correct mimes array', function () {
158
+ bidRequests[1].mediaTypes.banner.mimes = mimes;
159
+ const request = spec.buildRequests(bidRequests, bidderRequest);
160
+ expect(request.data.bids[1].mimes).to.be.an('array');
161
+ expect(request.data.bids[1].mimes).to.eql(['application/javascript', 'video/mp4', 'video/quicktime']);
162
+ });
163
+
164
+ it('should send the correct protocols array', function () {
165
+ bidRequests[0].mediaTypes.video.protocols = protocols;
166
+ const request = spec.buildRequests(bidRequests, bidderRequest);
167
+ expect(request.data.bids[0].protocols).to.be.an('array');
168
+ expect(request.data.bids[0].protocols).to.eql([2, 3, 5, 6]);
169
+ });
170
+
147
171
  it('should send the correct sizes array', function () {
148
172
  const request = spec.buildRequests(bidRequests, bidderRequest);
149
173
  expect(request.data.bids[0].sizes).to.be.an('array');
@@ -1,6 +1,7 @@
1
1
  import { expect } from 'chai';
2
2
  import { OPENRTB, spec } from 'modules/rtbhouseBidAdapter.js';
3
3
  import { newBidder } from 'src/adapters/bidderFactory.js';
4
+ import { config } from 'src/config.js';
4
5
 
5
6
  describe('RTBHouseAdapter', () => {
6
7
  const adapter = newBidder(spec);
@@ -97,6 +98,10 @@ describe('RTBHouseAdapter', () => {
97
98
  ];
98
99
  });
99
100
 
101
+ afterEach(function () {
102
+ config.resetConfig();
103
+ });
104
+
100
105
  it('should build test param into the request', () => {
101
106
  let builtTestRequest = spec.buildRequests(bidRequests, bidderRequest).data;
102
107
  expect(JSON.parse(builtTestRequest).test).to.equal(1);
@@ -263,6 +268,45 @@ describe('RTBHouseAdapter', () => {
263
268
  expect(data.source).to.not.have.property('ext');
264
269
  });
265
270
 
271
+ context('FLEDGE', function() {
272
+ afterEach(function () {
273
+ config.resetConfig();
274
+ });
275
+
276
+ it('sends bid request to FLEDGE ENDPOINT via POST', function () {
277
+ let bidRequest = Object.assign([], bidRequests);
278
+ delete bidRequest[0].params.test;
279
+ config.setConfig({ fledgeConfig: true });
280
+ const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: true });
281
+ expect(request.url).to.equal('https://prebid-eu.creativecdn.com/bidder/prebidfledge/bids');
282
+ expect(request.method).to.equal('POST');
283
+ });
284
+
285
+ it('when FLEDGE is disabled, should not send imp.ext.ae', function () {
286
+ let bidRequest = Object.assign([], bidRequests);
287
+ delete bidRequest[0].params.test;
288
+ bidRequest[0].ortb2Imp = {
289
+ ext: { ae: 2 }
290
+ };
291
+ const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: false });
292
+ let data = JSON.parse(request.data);
293
+ if (data.imp[0].ext) {
294
+ expect(data.imp[0].ext).to.not.have.property('ae');
295
+ }
296
+ });
297
+
298
+ it('when FLEDGE is enabled, should send whatever is set in ortb2imp.ext.ae in all bid requests', function () {
299
+ let bidRequest = Object.assign([], bidRequests);
300
+ delete bidRequest[0].params.test;
301
+ bidRequest[0].ortb2Imp = {
302
+ ext: { ae: 2 }
303
+ };
304
+ const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: true });
305
+ let data = JSON.parse(request.data);
306
+ expect(data.imp[0].ext.ae).to.equal(2);
307
+ });
308
+ });
309
+
266
310
  describe('native imp', () => {
267
311
  function basicRequest(extension) {
268
312
  return Object.assign({
@@ -460,6 +504,29 @@ describe('RTBHouseAdapter', () => {
460
504
  'h': 250
461
505
  }];
462
506
 
507
+ let fledgeResponse = {
508
+ 'id': 'bid-identifier',
509
+ 'ext': {
510
+ 'igbid': [{
511
+ 'impid': 'test-bid-id',
512
+ 'igbuyer': [{
513
+ 'igdomain': 'https://buyer-domain.com',
514
+ 'buyersignal': {}
515
+ }]
516
+ }],
517
+ 'sellerTimeout': 500,
518
+ 'seller': 'https://seller-domain.com',
519
+ 'decisionLogicUrl': 'https://seller-domain.com/decision-logic.js'
520
+ },
521
+ 'bidid': 'bid-identifier',
522
+ 'seatbid': [{
523
+ 'bid': [{
524
+ 'id': 'bid-response-id',
525
+ 'impid': 'test-bid-id'
526
+ }]
527
+ }]
528
+ };
529
+
463
530
  it('should get correct bid response', function () {
464
531
  let expectedResponse = [
465
532
  {
@@ -488,6 +555,18 @@ describe('RTBHouseAdapter', () => {
488
555
  expect(result.length).to.equal(0);
489
556
  });
490
557
 
558
+ context('when the response contains FLEDGE interest groups config', function () {
559
+ let bidderRequest;
560
+ let response = spec.interpretResponse({body: fledgeResponse}, {bidderRequest});
561
+
562
+ it('should return FLEDGE auction_configs alongside bids', function () {
563
+ expect(response).to.have.property('bids');
564
+ expect(response).to.have.property('fledgeAuctionConfigs');
565
+ expect(response.fledgeAuctionConfigs.length).to.equal(1);
566
+ expect(response.fledgeAuctionConfigs[0].bidId).to.equal('test-bid-id');
567
+ });
568
+ });
569
+
491
570
  describe('native', () => {
492
571
  const adm = {
493
572
  native: {