prebid.js 7.22.0 → 7.24.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 (314) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/aaxBlockmeterRtdProvider.js +1 -0
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/admaticBidAdapter.js +1 -0
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adtrgtmeBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.js +1 -1
  10. package/dist/adyoulikeBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/amxBidAdapter.js +1 -1
  13. package/dist/amxIdSystem.js +1 -1
  14. package/dist/analyticsAdapter.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/audiencerunBidAdapter.js +1 -1
  19. package/dist/axonixBidAdapter.js +1 -1
  20. package/dist/bidViewability.js +1 -1
  21. package/dist/bidViewabilityIO.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bluebillywigBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/browsiRtdProvider.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/chtnwBidAdapter.js +1 -0
  30. package/dist/cleanioRtdProvider.js +1 -1
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectIdSystem.js +1 -1
  33. package/dist/connectadBidAdapter.js +1 -1
  34. package/dist/consentManagement.js +1 -1
  35. package/dist/consentManagementUsp.js +1 -1
  36. package/dist/consumableBidAdapter.js +1 -1
  37. package/dist/conversantBidAdapter.js +1 -1
  38. package/dist/craftBidAdapter.js +1 -1
  39. package/dist/criteoBidAdapter.js +1 -1
  40. package/dist/currency.js +1 -1
  41. package/dist/dependencies.json +19 -0
  42. package/dist/dfpAdServerVideo.js +1 -1
  43. package/dist/dgkeywordRtdProvider.js +1 -1
  44. package/dist/dspxBidAdapter.js +1 -1
  45. package/dist/eplanningBidAdapter.js +1 -1
  46. package/dist/finativeBidAdapter.js +1 -1
  47. package/dist/gdprEnforcement.js +1 -1
  48. package/dist/glimpseBidAdapter.js +1 -1
  49. package/dist/gmosspBidAdapter.js +1 -1
  50. package/dist/goldbachBidAdapter.js +1 -1
  51. package/dist/googleAnalyticsAdapter.js +1 -1
  52. package/dist/gridBidAdapter.js +1 -1
  53. package/dist/gridNMBidAdapter.js +1 -1
  54. package/dist/growthCodeIdSystem.js +1 -1
  55. package/dist/gumgumBidAdapter.js +1 -1
  56. package/dist/h12mediaBidAdapter.js +1 -1
  57. package/dist/id5AnalyticsAdapter.js +1 -1
  58. package/dist/id5IdSystem.js +1 -1
  59. package/dist/impactifyBidAdapter.js +1 -1
  60. package/dist/improvedigitalBidAdapter.js +1 -1
  61. package/dist/inmarBidAdapter.js +1 -1
  62. package/dist/insticatorBidAdapter.js +1 -1
  63. package/dist/instreamTracking.js +1 -1
  64. package/dist/ixBidAdapter.js +1 -1
  65. package/dist/jixieBidAdapter.js +1 -1
  66. package/dist/justpremiumBidAdapter.js +1 -1
  67. package/dist/jwplayerVideoProvider.js +1 -0
  68. package/dist/kargoBidAdapter.js +1 -1
  69. package/dist/konduitAnalyticsAdapter.js +1 -1
  70. package/dist/kueezBidAdapter.js +1 -1
  71. package/dist/kueezRtbBidAdapter.js +1 -0
  72. package/dist/lassoBidAdapter.js +1 -1
  73. package/dist/lifestreetBidAdapter.js +1 -1
  74. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  75. package/dist/logicadBidAdapter.js +1 -1
  76. package/dist/loglyliftBidAdapter.js +1 -1
  77. package/dist/magniteAnalyticsAdapter.js +1 -1
  78. package/dist/malltvAnalyticsAdapter.js +1 -1
  79. package/dist/marsmediaBidAdapter.js +1 -1
  80. package/dist/mediafuseBidAdapter.js +1 -1
  81. package/dist/mediakeysBidAdapter.js +1 -1
  82. package/dist/mediasquareBidAdapter.js +1 -1
  83. package/dist/mgidBidAdapter.js +1 -1
  84. package/dist/mgidRtdProvider.js +1 -0
  85. package/dist/minutemediaBidAdapter.js +1 -1
  86. package/dist/multibid.js +1 -1
  87. package/dist/not-for-prod/prebid.js +153 -141
  88. package/dist/oguryBidAdapter.js +1 -1
  89. package/dist/onetagBidAdapter.js +1 -1
  90. package/dist/ooloAnalyticsAdapter.js +1 -1
  91. package/dist/openxOrtbBidAdapter.js +1 -1
  92. package/dist/ortbConverter.js +1 -0
  93. package/dist/outbrainBidAdapter.js +1 -1
  94. package/dist/oxxionRtdProvider.js +1 -0
  95. package/dist/parrableIdSystem.js +1 -1
  96. package/dist/pbsExtensions.js +1 -0
  97. package/dist/permutiveRtdProvider.js +1 -1
  98. package/dist/pixfutureBidAdapter.js +1 -1
  99. package/dist/prebid-core.js +1 -1
  100. package/dist/prebidServerBidAdapter.js +1 -1
  101. package/dist/priceFloors.js +1 -1
  102. package/dist/pubCommonId.js +1 -1
  103. package/dist/publinkIdSystem.js +1 -1
  104. package/dist/pubmaticBidAdapter.js +1 -1
  105. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  106. package/dist/pxyzBidAdapter.js +1 -1
  107. package/dist/quantcastBidAdapter.js +1 -1
  108. package/dist/readpeakBidAdapter.js +1 -1
  109. package/dist/relaidoBidAdapter.js +1 -1
  110. package/dist/rhythmoneBidAdapter.js +1 -1
  111. package/dist/riseBidAdapter.js +1 -1
  112. package/dist/rtdModule.js +1 -1
  113. package/dist/rubiconAnalyticsAdapter.js +1 -1
  114. package/dist/rubiconBidAdapter.js +1 -1
  115. package/dist/schain.js +1 -1
  116. package/dist/seedingAllianceBidAdapter.js +1 -1
  117. package/dist/seedtagBidAdapter.js +1 -1
  118. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  119. package/dist/sharethroughBidAdapter.js +1 -1
  120. package/dist/shinezBidAdapter.js +1 -1
  121. package/dist/smaatoBidAdapter.js +1 -1
  122. package/dist/smartadserverBidAdapter.js +1 -1
  123. package/dist/smartxBidAdapter.js +1 -1
  124. package/dist/smilewantedBidAdapter.js +1 -1
  125. package/dist/sonobiBidAdapter.js +1 -1
  126. package/dist/sovrnAnalyticsAdapter.js +1 -1
  127. package/dist/sovrnBidAdapter.js +1 -1
  128. package/dist/spotxBidAdapter.js +1 -1
  129. package/dist/sspBCBidAdapter.js +1 -1
  130. package/dist/sublimeBidAdapter.js +1 -1
  131. package/dist/synacormediaBidAdapter.js +1 -1
  132. package/dist/targetVideoBidAdapter.js +1 -1
  133. package/dist/teadsBidAdapter.js +1 -1
  134. package/dist/teadsIdSystem.js +1 -1
  135. package/dist/trionBidAdapter.js +1 -1
  136. package/dist/tripleliftBidAdapter.js +1 -1
  137. package/dist/ttdBidAdapter.js +1 -1
  138. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  139. package/dist/underdogmediaBidAdapter.js +1 -1
  140. package/dist/undertoneBidAdapter.js +1 -1
  141. package/dist/userId.js +1 -1
  142. package/dist/vidazooBidAdapter.js +1 -1
  143. package/dist/video.js +1 -0
  144. package/dist/videoModule.js +1 -0
  145. package/dist/videobyteBidAdapter.js +1 -1
  146. package/dist/videojsVideoProvider.js +1 -0
  147. package/dist/visxBidAdapter.js +1 -1
  148. package/dist/vuukleBidAdapter.js +1 -1
  149. package/dist/widespaceBidAdapter.js +1 -1
  150. package/dist/winrBidAdapter.js +1 -1
  151. package/dist/yahoosspBidAdapter.js +1 -1
  152. package/dist/yieldmoBidAdapter.js +1 -1
  153. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  154. package/integrationExamples/gpt/mgidRtdProvider_example.html +143 -0
  155. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +98 -0
  156. package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +89 -0
  157. package/integrationExamples/videoModule/jwplayer/eventListeners.html +244 -0
  158. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +122 -0
  159. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +80 -0
  160. package/integrationExamples/videoModule/jwplayer/playlist.html +122 -0
  161. package/integrationExamples/videoModule/videojs/bidMarkedAsUsed.html +126 -0
  162. package/integrationExamples/videoModule/videojs/bidRequestScheduling.html +132 -0
  163. package/integrationExamples/videoModule/videojs/eventListeners.html +238 -0
  164. package/integrationExamples/videoModule/videojs/gamAdServerMediation.html +138 -0
  165. package/integrationExamples/videoModule/videojs/mediaMetadata.html +103 -0
  166. package/integrationExamples/videoModule/videojs/playlist.html +151 -0
  167. package/libraries/ortbConverter/README.md +378 -0
  168. package/libraries/ortbConverter/converter.js +135 -0
  169. package/libraries/ortbConverter/lib/composer.js +43 -0
  170. package/libraries/ortbConverter/lib/mergeProcessors.js +9 -0
  171. package/libraries/ortbConverter/lib/sizes.js +14 -0
  172. package/libraries/ortbConverter/processors/banner.js +40 -0
  173. package/libraries/ortbConverter/processors/default.js +167 -0
  174. package/libraries/ortbConverter/processors/mediaType.js +21 -0
  175. package/libraries/ortbConverter/processors/native.js +37 -0
  176. package/libraries/ortbConverter/processors/video.js +66 -0
  177. package/libraries/pbsExtensions/pbsExtensions.js +12 -0
  178. package/libraries/pbsExtensions/processors/aliases.js +17 -0
  179. package/libraries/pbsExtensions/processors/mediaType.js +23 -0
  180. package/libraries/pbsExtensions/processors/params.js +22 -0
  181. package/libraries/pbsExtensions/processors/pbs.js +99 -0
  182. package/libraries/pbsExtensions/processors/requestExtPrebid.js +30 -0
  183. package/libraries/pbsExtensions/processors/video.js +23 -0
  184. package/libraries/video/constants/enums.js +5 -0
  185. package/libraries/video/constants/events.js +97 -0
  186. package/libraries/video/constants/ortb.js +169 -0
  187. package/libraries/video/constants/vendorCodes.js +6 -0
  188. package/libraries/video/shared/eventHandler.js +18 -0
  189. package/libraries/video/shared/parentModule.js +82 -0
  190. package/libraries/video/shared/state.js +47 -0
  191. package/libraries/video/shared/vastXmlBuilder.js +77 -0
  192. package/libraries/video/shared/vastXmlEditor.js +115 -0
  193. package/modules/.submodules.json +7 -1
  194. package/modules/aaxBlockmeterRtdProvider.js +59 -0
  195. package/modules/aaxBlockmeterRtdProvider.md +48 -0
  196. package/modules/admaticBidAdapter.js +147 -0
  197. package/modules/admaticBidAdapter.md +48 -0
  198. package/modules/amxBidAdapter.js +1 -0
  199. package/modules/appnexusBidAdapter.js +38 -1
  200. package/modules/chtnwBidAdapter.js +110 -0
  201. package/modules/chtnwBidAdapter.md +31 -0
  202. package/modules/concertBidAdapter.js +44 -2
  203. package/modules/connectIdSystem.js +36 -23
  204. package/modules/connectIdSystem.md +3 -2
  205. package/modules/consentManagement.js +22 -1
  206. package/modules/consentManagementUsp.js +29 -7
  207. package/modules/criteoBidAdapter.js +25 -5
  208. package/modules/currency.js +9 -0
  209. package/modules/dgkeywordRtdProvider.js +3 -3
  210. package/modules/gridNMBidAdapter.js +10 -14
  211. package/modules/growthCodeIdSystem.js +9 -5
  212. package/modules/gumgumBidAdapter.js +4 -0
  213. package/modules/improvedigitalBidAdapter.js +191 -470
  214. package/modules/ixBidAdapter.js +54 -71
  215. package/modules/jwplayerVideoProvider.js +929 -0
  216. package/modules/jwplayerVideoProvider.md +25 -0
  217. package/modules/kargoBidAdapter.js +1 -1
  218. package/modules/kueezRtbBidAdapter.js +278 -0
  219. package/modules/kueezRtbBidAdapter.md +35 -0
  220. package/modules/magniteAnalyticsAdapter.js +6 -1
  221. package/modules/mgidRtdProvider.js +190 -0
  222. package/modules/mgidRtdProvider.md +51 -0
  223. package/modules/multibid/index.js +12 -0
  224. package/modules/openxOrtbBidAdapter.js +120 -275
  225. package/modules/oxxionRtdProvider.js +119 -0
  226. package/modules/oxxionRtdProvider.md +48 -0
  227. package/modules/permutiveRtdProvider.js +2 -1
  228. package/modules/permutiveRtdProvider.md +36 -1
  229. package/modules/prebidServerBidAdapter/index.js +19 -716
  230. package/modules/prebidServerBidAdapter/ortbConverter.js +274 -0
  231. package/modules/priceFloors.js +73 -1
  232. package/modules/pubmaticBidAdapter.js +21 -29
  233. package/modules/rtdModule/index.js +22 -1
  234. package/modules/schain.js +24 -1
  235. package/modules/spotxBidAdapter.js +16 -15
  236. package/modules/synacormediaBidAdapter.js +1 -1
  237. package/modules/teadsIdSystem.js +5 -0
  238. package/modules/tripleliftBidAdapter.js +1 -1
  239. package/modules/userId/eids.js +3 -10
  240. package/modules/userId/index.js +64 -6
  241. package/modules/videoModule/addingSubmodule.md +521 -0
  242. package/modules/videoModule/coreVideo.js +234 -0
  243. package/modules/videoModule/gamAdServerSubmodule.js +27 -0
  244. package/modules/videoModule/index.js +244 -0
  245. package/modules/videoModule/videoImpressionVerifier.js +206 -0
  246. package/modules/videojsVideoProvider.js +854 -0
  247. package/modules/videojsVideoProvider.md +17 -0
  248. package/package.json +12 -8
  249. package/src/adRendering.js +1 -1
  250. package/src/adapterManager.js +56 -7
  251. package/src/adloader.js +3 -1
  252. package/src/auction.js +6 -1
  253. package/src/events.js +5 -1
  254. package/src/pbjsORTB.js +35 -0
  255. package/src/prebid.js +137 -112
  256. package/src/targeting.js +10 -2
  257. package/src/utils/currency.js +16 -0
  258. package/src/utils.js +21 -0
  259. package/test/spec/auctionmanager_spec.js +15 -0
  260. package/test/spec/modules/aaxBlockmeter_spec.js +58 -0
  261. package/test/spec/modules/admaticBidAdapter_spec.js +46 -0
  262. package/test/spec/modules/chtnwBidAdapter_spec.js +105 -0
  263. package/test/spec/modules/concertBidAdapter_spec.js +56 -0
  264. package/test/spec/modules/connectIdSystem_spec.js +175 -5
  265. package/test/spec/modules/consentManagementUsp_spec.js +64 -18
  266. package/test/spec/modules/criteoBidAdapter_spec.js +28 -0
  267. package/test/spec/modules/dgkeywordRtdProvider_spec.js +3 -3
  268. package/test/spec/modules/eids_spec.js +10 -7
  269. package/test/spec/modules/ftrackIdSystem_spec.js +34 -22
  270. package/test/spec/modules/gumgumBidAdapter_spec.js +15 -0
  271. package/test/spec/modules/improvedigitalBidAdapter_spec.js +231 -211
  272. package/test/spec/modules/ixBidAdapter_spec.js +412 -350
  273. package/test/spec/modules/kueezRtbBidAdapter_spec.js +396 -0
  274. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +26 -0
  275. package/test/spec/modules/mgidRtdProvider_spec.js +366 -0
  276. package/test/spec/modules/openxOrtbBidAdapter_spec.js +77 -49
  277. package/test/spec/modules/oxxionRtdProvider_spec.js +142 -0
  278. package/test/spec/modules/permutiveRtdProvider_spec.js +64 -5
  279. package/test/spec/modules/prebidServerBidAdapter_spec.js +139 -137
  280. package/test/spec/modules/realTimeDataModule_spec.js +65 -0
  281. package/test/spec/modules/tripleliftBidAdapter_spec.js +14 -0
  282. package/test/spec/modules/userId_spec.js +67 -1
  283. package/test/spec/modules/videoModule/coreVideo_spec.js +98 -0
  284. package/test/spec/modules/videoModule/pbVideo_spec.js +362 -0
  285. package/test/spec/modules/videoModule/shared/parentModule_spec.js +73 -0
  286. package/test/spec/modules/videoModule/shared/state_spec.js +26 -0
  287. package/test/spec/modules/videoModule/shared/vastXmlBuilder_spec.js +103 -0
  288. package/test/spec/modules/videoModule/shared/vastXmlEditor_spec.js +209 -0
  289. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +846 -0
  290. package/test/spec/modules/videoModule/submodules/videojsVideoProvider_spec.js +391 -0
  291. package/test/spec/modules/videoModule/videoImpressionVerifier_spec.js +112 -0
  292. package/test/spec/ortbConverter/banner_spec.js +203 -0
  293. package/test/spec/ortbConverter/composer_spec.js +69 -0
  294. package/test/spec/ortbConverter/converter_spec.js +283 -0
  295. package/test/spec/ortbConverter/currency_spec.js +40 -0
  296. package/test/spec/ortbConverter/default_processors_spec.js +61 -0
  297. package/test/spec/ortbConverter/gdpr_spec.js +38 -0
  298. package/test/spec/ortbConverter/mediaTypes_spec.js +67 -0
  299. package/test/spec/ortbConverter/mergeProcessors_spec.js +59 -0
  300. package/test/spec/ortbConverter/multibid_spec.js +35 -0
  301. package/test/spec/ortbConverter/native_spec.js +95 -0
  302. package/test/spec/ortbConverter/pbjsORTB_spec.js +67 -0
  303. package/test/spec/ortbConverter/pbsExtensions/aliases_spec.js +57 -0
  304. package/test/spec/ortbConverter/pbsExtensions/params_spec.js +96 -0
  305. package/test/spec/ortbConverter/pbsExtensions/video_spec.js +52 -0
  306. package/test/spec/ortbConverter/priceFloors_spec.js +143 -0
  307. package/test/spec/ortbConverter/schain_spec.js +33 -0
  308. package/test/spec/ortbConverter/userId_spec.js +21 -0
  309. package/test/spec/ortbConverter/usp_spec.js +15 -0
  310. package/test/spec/ortbConverter/video_spec.js +189 -0
  311. package/test/spec/unit/core/adapterManager_spec.js +102 -0
  312. package/test/spec/unit/core/targeting_spec.js +34 -0
  313. package/test/spec/unit/pbjs_api_spec.js +124 -45
  314. package/test/spec/utils_spec.js +45 -1
@@ -0,0 +1,69 @@
1
+ import {compose} from '../../../libraries/ortbConverter/lib/composer.js';
2
+
3
+ describe('compose', () => {
4
+ it('runs each component in order of priority', () => {
5
+ const order = [];
6
+ const components = {
7
+ first: {
8
+ fn: sinon.stub().callsFake(() => order.push(1)),
9
+ },
10
+ second: {
11
+ fn: sinon.stub().callsFake(() => order.push(2)),
12
+ priority: 10
13
+ },
14
+ third: {
15
+ fn: sinon.stub().callsFake(() => order.push(3)),
16
+ priority: 5
17
+ }
18
+ };
19
+ compose(components)();
20
+ expect(order).to.eql([2, 3, 1]);
21
+ });
22
+
23
+ it('passes parameters to each component', () => {
24
+ const components = {
25
+ first: {
26
+ fn: sinon.stub()
27
+ },
28
+ second: {
29
+ fn: sinon.stub()
30
+ }
31
+ };
32
+ compose(components)('one', 'two');
33
+ Object.values(components).forEach(comp => {
34
+ sinon.assert.calledWith(comp.fn, 'one', 'two')
35
+ })
36
+ })
37
+
38
+ it('respects overrides', () => {
39
+ const components = {
40
+ first: {
41
+ fn: sinon.stub()
42
+ },
43
+ second: {
44
+ fn: sinon.stub()
45
+ }
46
+ };
47
+ const overrides = {
48
+ second: sinon.stub()
49
+ }
50
+ compose(components, overrides)('one', 'two');
51
+ sinon.assert.calledWith(overrides.second, components.second.fn, 'one', 'two')
52
+ })
53
+
54
+ it('disables components when override is false', () => {
55
+ const components = {
56
+ first: {
57
+ fn: sinon.stub(),
58
+ },
59
+ second: {
60
+ fn: sinon.stub()
61
+ }
62
+ };
63
+ const overrides = {
64
+ second: false
65
+ };
66
+ compose(components, overrides)('one', 'two');
67
+ sinon.assert.notCalled(components.second.fn);
68
+ })
69
+ });
@@ -0,0 +1,283 @@
1
+ import {ortbConverter} from '../../../libraries/ortbConverter/converter.js';
2
+ import {BID_RESPONSE, IMP, REQUEST, RESPONSE} from '../../../src/pbjsORTB.js';
3
+
4
+ describe('pbjs-ortb converter', () => {
5
+ const MOCK_BIDDER_REQUEST = {
6
+ id: 'bidderRequest',
7
+ bids: [
8
+ {
9
+ id: 111
10
+ },
11
+ {
12
+ id: 112
13
+ }
14
+ ]
15
+ }
16
+
17
+ const MOCK_ORTB_RESPONSE = {
18
+ id: 'response',
19
+ seatbid: [
20
+ {
21
+ seat: 'mockBidder1',
22
+ bid: [
23
+ {
24
+ impid: 'imp0'
25
+ },
26
+ {
27
+ impid: 'imp1'
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ seat: 'mockBidder2',
33
+ bid: [
34
+ {
35
+ impid: 'imp1'
36
+ }
37
+ ]
38
+ }
39
+ ]
40
+ }
41
+
42
+ let processors, reqCnt, impCnt;
43
+
44
+ beforeEach(() => {
45
+ reqCnt = 0;
46
+ impCnt = 0;
47
+ processors = {
48
+ [REQUEST]: {
49
+ req: {
50
+ fn(ortbRequest, bidderRequest, context) {
51
+ ortbRequest.id = `req${reqCnt++}`;
52
+ if (context.ctx) {
53
+ ortbRequest.ctx = context.ctx;
54
+ }
55
+ }
56
+ }
57
+ },
58
+ [IMP]: {
59
+ imp: {
60
+ fn(imp, bidRequest, context) {
61
+ imp.id = `imp${impCnt++}`;
62
+ imp.bidId = bidRequest.id;
63
+ if (context.ctx) {
64
+ imp.ctx = context.ctx;
65
+ }
66
+ if (context.reqContext?.ctx) {
67
+ imp.reqCtx = context.reqContext?.ctx;
68
+ }
69
+ }
70
+ }
71
+ },
72
+ [BID_RESPONSE]: {
73
+ resp: {
74
+ fn(bidResponse, bid, context) {
75
+ bidResponse.impid = bid.impid;
76
+ bidResponse.bidId = context.imp.bidId;
77
+ if (context.ctx) {
78
+ bidResponse.ctx = context.ctx;
79
+ }
80
+ if (context.reqContext?.ctx) {
81
+ bidResponse.reqCtx = context.reqContext?.ctx;
82
+ }
83
+ }
84
+ }
85
+ },
86
+ [RESPONSE]: {
87
+ resp: {
88
+ fn(response, ortbResponse, context) {
89
+ response.marker = true;
90
+ if (context.ctx) {
91
+ response.ctx = context.ctx;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ });
98
+
99
+ function makeConverter(options = {}) {
100
+ options = Object.assign({
101
+ processors: () => processors
102
+ }, options);
103
+ return ortbConverter(options);
104
+ }
105
+
106
+ it('runs each processor', () => {
107
+ const cvt = makeConverter();
108
+ const request = cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST});
109
+ expect(request).to.eql({
110
+ id: 'req0',
111
+ imp: [
112
+ {id: 'imp0', bidId: 111},
113
+ {id: 'imp1', bidId: 112}
114
+ ]
115
+ });
116
+ const response = cvt.fromORTB({request, response: MOCK_ORTB_RESPONSE});
117
+ expect(response.bids).to.eql([{
118
+ impid: 'imp0',
119
+ bidId: 111
120
+ }, {
121
+ impid: 'imp1',
122
+ bidId: 112
123
+ }, {
124
+ impid: 'imp1',
125
+ bidId: 112
126
+ }]);
127
+ expect(response.marker).to.be.true;
128
+ });
129
+
130
+ it('fromORTB throws if request was not produced by the same converter', () => {
131
+ expect(() => {
132
+ makeConverter().fromORTB({
133
+ request: {
134
+ imp: [
135
+ {
136
+ id: 'imp0'
137
+ }
138
+ ]
139
+ },
140
+ response: MOCK_ORTB_RESPONSE
141
+ })
142
+ }).to.throw();
143
+ });
144
+
145
+ it('gives precedence to the bidRequests argument over bidderRequest.bids', () => {
146
+ expect(makeConverter().toORTB({bidderRequest: MOCK_BIDDER_REQUEST, bidRequests: [MOCK_BIDDER_REQUEST.bids[0]]})).to.eql({
147
+ id: 'req0',
148
+ imp: [
149
+ {
150
+ id: 'imp0',
151
+ bidId: 111
152
+ }
153
+ ]
154
+ })
155
+ });
156
+
157
+ it('passes context to every processor', () => {
158
+ const cvt = makeConverter();
159
+ const request = cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST, context: {ctx: 'context'}});
160
+ expect(request.ctx).to.equal('context');
161
+ request.imp.forEach(imp => expect(imp.ctx).to.equal('context'));
162
+ const response = cvt.fromORTB({request, response: MOCK_ORTB_RESPONSE});
163
+ expect(response.ctx).to.eql('context');
164
+ response.bids.forEach(bidResponse => expect(bidResponse.ctx).to.equal('context'));
165
+ });
166
+
167
+ it('passes request context to imp and bidResponse processors', () => {
168
+ const cvt = makeConverter();
169
+ const request = cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST, context: {ctx: 'context'}});
170
+ expect(request.imp[0].reqCtx).to.eql('context');
171
+ const response = cvt.fromORTB({request, response: MOCK_ORTB_RESPONSE});
172
+ expect(response.bids[0].reqCtx).to.eql('context');
173
+ });
174
+
175
+ it('allows overriding of imp building with `imp`', () => {
176
+ const cvt = makeConverter({
177
+ imp: function (buildImp, bidRequest, context) {
178
+ return Object.assign({
179
+ extraArg: bidRequest.id,
180
+ extraCtx: context.ctx
181
+ }, buildImp(bidRequest, context));
182
+ }
183
+ });
184
+ const request = cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST, context: {ctx: 'context'}});
185
+ expect(request.imp.length).to.eql(2);
186
+ request.imp.forEach(imp => {
187
+ expect(imp.extraArg).to.eql(imp.bidId);
188
+ expect(imp.extraCtx).to.eql('context');
189
+ })
190
+ });
191
+
192
+ it('allows filtering imps with `imp`', () => {
193
+ const cvt = makeConverter({
194
+ imp(buildImp, bidRequest, context) {
195
+ if (bidRequest.id === 112) {
196
+ return buildImp(bidRequest, context);
197
+ }
198
+ }
199
+ });
200
+ expect(cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST}).imp.length).to.eql(1);
201
+ });
202
+
203
+ it('does not include imps that have no id', () => {
204
+ const cvt = makeConverter({
205
+ imp(buildImp, bidRequest, context) {
206
+ const imp = buildImp(bidRequest, context);
207
+ delete imp.id;
208
+ return imp;
209
+ }
210
+ });
211
+ expect(cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST}).imp.length).to.eql(0);
212
+ })
213
+
214
+ it('allows overriding of response building with bidResponse', () => {
215
+ const cvt = makeConverter({
216
+ bidResponse(buildResponse, bid, context) {
217
+ return Object.assign({
218
+ extraArg: context.bidRequest.id,
219
+ extraCtx: context.ctx
220
+ }, buildResponse(bid, context));
221
+ }
222
+ });
223
+ const response = cvt.fromORTB({
224
+ response: MOCK_ORTB_RESPONSE,
225
+ request: cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST, context: {ctx: 'context'}})
226
+ });
227
+
228
+ expect(response.bids.length).to.equal(3);
229
+ response.bids.forEach(response => {
230
+ expect(response.extraArg).to.eql(response.bidId);
231
+ expect(response.extraCtx).to.eql('context');
232
+ });
233
+ });
234
+
235
+ it('allows filtering of responses with `bidResponse`', () => {
236
+ const cvt = makeConverter({
237
+ bidResponse(buildBidResponse, bid, context) {
238
+ if (context.seatbid.seat === 'mockBidder1' && context.imp.id === 'imp0') {
239
+ return buildBidResponse(bid, context);
240
+ }
241
+ }
242
+ });
243
+ expect(cvt.fromORTB({
244
+ request: cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST}),
245
+ response: MOCK_ORTB_RESPONSE
246
+ }).bids.length).to.equal(1);
247
+ });
248
+
249
+ it('allows overriding of request building with `request`', () => {
250
+ const cvt = makeConverter({
251
+ request(buildRequest, imps, bidderRequest, context) {
252
+ return {
253
+ request: buildRequest(imps, bidderRequest, context),
254
+ extraArg: bidderRequest.id,
255
+ extraCtx: context.ctx
256
+ }
257
+ }
258
+ });
259
+ const req = cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST, context: {ctx: 'context'}});
260
+ expect(req.extraArg).to.equal(MOCK_BIDDER_REQUEST.id);
261
+ expect(req.extraCtx).to.equal('context');
262
+ expect(req.request.imp.length).to.equal(2);
263
+ });
264
+
265
+ it('allows overriding of response building with `response`', () => {
266
+ const cvt = makeConverter({
267
+ response(buildResponse, bidResponses, ortbResponse, context) {
268
+ return {
269
+ response: buildResponse(bidResponses, ortbResponse, context),
270
+ extraArg: ortbResponse.id,
271
+ extraCtx: context.ctx
272
+ }
273
+ }
274
+ });
275
+ const resp = cvt.fromORTB({
276
+ request: cvt.toORTB({bidderRequest: MOCK_BIDDER_REQUEST, context: {ctx: 'context'}}),
277
+ response: MOCK_ORTB_RESPONSE,
278
+ });
279
+ expect(resp.extraArg).to.equal(MOCK_ORTB_RESPONSE.id);
280
+ expect(resp.extraCtx).to.equal('context');
281
+ expect(resp.response.bids.length).to.equal(3);
282
+ })
283
+ })
@@ -0,0 +1,40 @@
1
+ import {config} from 'src/config.js';
2
+ import {setOrtbCurrency} from '../../../modules/currency.js';
3
+
4
+ describe('pbjs -> ortb currency', () => {
5
+ before(() => {
6
+ config.resetConfig();
7
+ });
8
+
9
+ afterEach(() => {
10
+ config.resetConfig();
11
+ });
12
+
13
+ it('does not set cur by default', () => {
14
+ const req = {};
15
+ setOrtbCurrency(req, {}, {});
16
+ expect(req).to.eql({});
17
+ });
18
+
19
+ it('sets currency based on config', () => {
20
+ config.setConfig({
21
+ currency: {
22
+ adServerCurrency: 'EUR'
23
+ }
24
+ });
25
+ const req = {};
26
+ setOrtbCurrency(req, {}, {});
27
+ expect(req.cur).to.eql(['EUR']);
28
+ });
29
+
30
+ it('sets currency based on context', () => {
31
+ config.setConfig({
32
+ currency: {
33
+ adServerCurrency: 'EUR'
34
+ }
35
+ });
36
+ const req = {};
37
+ setOrtbCurrency(req, {}, {currency: 'JPY'});
38
+ expect(req.cur).to.eql(['JPY']);
39
+ })
40
+ });
@@ -0,0 +1,61 @@
1
+ import {setDevice, setSite} from '../../../libraries/ortbConverter/processors/default.js';
2
+
3
+ describe('setDevice', () => {
4
+ it('sets device.w, h, dnt, language, ua', () => {
5
+ const req = {};
6
+ setDevice(req);
7
+ ['h', 'w', 'dnt', 'language', 'ua'].forEach(prop => expect(req.device[prop]).to.exist)
8
+ });
9
+
10
+ it('does not override FPD', () => {
11
+ const req = {
12
+ device: {
13
+ w: 'w',
14
+ h: 'h',
15
+ ext: {}
16
+ }
17
+ };
18
+ setDevice(req);
19
+ sinon.assert.match(req.device, {
20
+ w: 'w',
21
+ h: 'h',
22
+ ext: {}
23
+ })
24
+ });
25
+ });
26
+
27
+ describe('setSite', () => {
28
+ const refererInfo = {
29
+ page: 'page.com',
30
+ ref: 'ref.com',
31
+ domain: 'domain.com'
32
+ };
33
+
34
+ it('sets site, domain, ref from refererInfo', () => {
35
+ const req = {
36
+ site: {
37
+ ext: {}
38
+ }
39
+ };
40
+ setSite(req, {refererInfo});
41
+ sinon.assert.match(req.site, refererInfo);
42
+ expect(req.site.ext).to.eql({});
43
+ });
44
+
45
+ it('does not override FPD', () => {
46
+ const req = {
47
+ site: {
48
+ ref: 'other ref'
49
+ }
50
+ }
51
+ setSite(req, {refererInfo});
52
+ expect(req.site.ref).to.eql('other ref');
53
+ ['domain', 'page'].forEach(prop => expect(req.site[prop]).to.eql(refererInfo[prop]));
54
+ });
55
+
56
+ it('does not set null properties from refererInfo', () => {
57
+ const req = {};
58
+ setSite(req, {refererInfo: {...refererInfo, ref: null}});
59
+ expect(req.site.ref).to.not.exist;
60
+ });
61
+ });
@@ -0,0 +1,38 @@
1
+ import {setOrtbAdditionalConsent, setOrtbGdpr} from '../../../modules/consentManagement.js';
2
+
3
+ describe('pbjs - ortb gpdr', () => {
4
+ it('sets gdpr properties from bidderRequest', () => {
5
+ const req = {};
6
+ setOrtbGdpr(req, {gdprConsent: {gdprApplies: true, consentString: 'consent'}});
7
+ expect(req.regs.ext.gdpr).to.eql(1);
8
+ expect(req.user.ext.consent).to.eql('consent');
9
+ });
10
+
11
+ it('does not set it if missing', () => {
12
+ const req = {};
13
+ setOrtbGdpr(req, {});
14
+ expect(req).to.eql({});
15
+ });
16
+
17
+ it('sets user.ext.consent, but not regs.ext.gdpr, if gpdrApplies is not a boolean', () => {
18
+ const req = {};
19
+ setOrtbGdpr(req, {
20
+ gdprConsent: {consentString: 'mock-consent'}
21
+ });
22
+ expect(req).to.eql({
23
+ user: {
24
+ ext: {
25
+ consent: 'mock-consent'
26
+ }
27
+ }
28
+ })
29
+ });
30
+ });
31
+
32
+ describe('pbjs -> ortb addtlConsent', () => {
33
+ it('sets ConsentedProvidersSettings', () => {
34
+ const req = {};
35
+ setOrtbAdditionalConsent(req, {gdprConsent: {addtlConsent: 'tl'}});
36
+ expect(req.user.ext.ConsentedProvidersSettings.consented_providers).to.eql('tl');
37
+ });
38
+ })
@@ -0,0 +1,67 @@
1
+ import {ORTB_MTYPES, setResponseMediaType} from '../../../libraries/ortbConverter/processors/mediaType.js';
2
+ import {BANNER} from '../../../src/mediaTypes.js';
3
+ import {extPrebidMediaType} from '../../../libraries/pbsExtensions/processors/mediaType.js';
4
+
5
+ function testMtype(processor) {
6
+ describe('respects 2.6 mtype', () => {
7
+ Object.entries(ORTB_MTYPES).forEach(([mtype, pbtype]) => {
8
+ it(`${mtype} -> ${pbtype}`, () => {
9
+ const resp = {};
10
+ processor(resp, {
11
+ mtype: parseInt(mtype, 10)
12
+ }, {});
13
+ expect(resp.mediaType).to.eql(pbtype);
14
+ });
15
+ });
16
+ });
17
+ }
18
+
19
+ describe('ortb -> pbjs mediaType conversion', () => {
20
+ testMtype(setResponseMediaType);
21
+ it('throws if mtype is missing', () => {
22
+ expect(() => {
23
+ setResponseMediaType({}, {});
24
+ }).to.throw();
25
+ });
26
+
27
+ it('respects pre-set bidResponse.mediaType', () => {
28
+ const resp = {mediaType: 'video'};
29
+ setResponseMediaType(resp, {mtype: 1});
30
+ expect(resp.mediaType).to.eql('video');
31
+ });
32
+
33
+ it('gives precedence to context.mediaType', () => {
34
+ const resp = {};
35
+ setResponseMediaType(resp, {mtype: 1}, {mediaType: 'video'});
36
+ expect(resp.mediaType).to.eql('video')
37
+ })
38
+ });
39
+
40
+ describe('ortb -> pbjs mediaType conversion based on ext.prebid.type', () => {
41
+ testMtype(extPrebidMediaType);
42
+ describe('respects ext.prebid.type', () => {
43
+ Object.values(ORTB_MTYPES).forEach(mediaType => {
44
+ const response = {};
45
+ extPrebidMediaType(response, {
46
+ ext: {
47
+ prebid: {
48
+ type: mediaType
49
+ }
50
+ }
51
+ }, {});
52
+ expect(response.mediaType).to.eql(mediaType);
53
+ });
54
+ });
55
+
56
+ it('defaults to banner', () => {
57
+ const response = {};
58
+ extPrebidMediaType(response, {}, {});
59
+ expect(response.mediaType).to.eql(BANNER);
60
+ });
61
+
62
+ it('gives precedence to context.mediaType', () => {
63
+ const response = {};
64
+ extPrebidMediaType(response, {ext: {prebid: {type: 'banner'}}}, {mediaType: 'video'});
65
+ expect(response.mediaType).to.eql('video');
66
+ })
67
+ });
@@ -0,0 +1,59 @@
1
+ import {mergeProcessors} from '../../../libraries/ortbConverter/lib/mergeProcessors.js';
2
+ import {BID_RESPONSE, IMP, REQUEST, RESPONSE} from '../../../src/pbjsORTB.js';
3
+
4
+ describe('mergeProcessors', () => {
5
+ it('can merge', () => {
6
+ const result = mergeProcessors({
7
+ [REQUEST]: {
8
+ first: {
9
+ priority: 0,
10
+ fn: 'first'
11
+ }
12
+ },
13
+ [RESPONSE]: {
14
+ second: {
15
+ priority: 1,
16
+ fn: 'second'
17
+ }
18
+ }
19
+ }, {
20
+ [REQUEST]: {
21
+ first: {
22
+ fn: 'overriden'
23
+ }
24
+ },
25
+ [IMP]: {
26
+ third: {
27
+ fn: 'third'
28
+ }
29
+ }
30
+ }, {
31
+ [IMP]: {
32
+ third: {
33
+ priority: 3,
34
+ fn: 'overridden'
35
+ }
36
+ }
37
+ });
38
+ expect(result).to.eql({
39
+ [REQUEST]: {
40
+ first: {
41
+ fn: 'overriden'
42
+ }
43
+ },
44
+ [IMP]: {
45
+ third: {
46
+ priority: 3,
47
+ fn: 'overridden'
48
+ },
49
+ },
50
+ [RESPONSE]: {
51
+ second: {
52
+ priority: 1,
53
+ fn: 'second'
54
+ }
55
+ },
56
+ [BID_RESPONSE]: {}
57
+ });
58
+ });
59
+ });
@@ -0,0 +1,35 @@
1
+ import {config} from 'src/config.js';
2
+ import {setOrtbExtPrebidMultibid} from '../../../modules/multibid/index.js';
3
+
4
+ describe('pbjs - ortb ext.prebid.multibid', () => {
5
+ before(() => {
6
+ config.resetConfig();
7
+ });
8
+ afterEach(() => {
9
+ config.resetConfig();
10
+ });
11
+
12
+ it('sets ext.prebid.multibid according to config', () => {
13
+ config.setConfig({
14
+ multibid: [
15
+ {
16
+ bidder: 'A',
17
+ maxBids: 2
18
+ },
19
+ {
20
+ bidder: 'B',
21
+ maxBids: 3
22
+ }
23
+ ]
24
+ });
25
+ const req = {};
26
+ setOrtbExtPrebidMultibid(req);
27
+ expect(req.ext.prebid.multibid).to.eql([{bidder: 'A', maxbids: 2}, {bidder: 'B', maxbids: 3}]);
28
+ });
29
+
30
+ it('does not set it if not configured', () => {
31
+ const req = {};
32
+ setOrtbExtPrebidMultibid(req);
33
+ expect(req).to.eql({});
34
+ })
35
+ });