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,189 @@
1
+ import {fillVideoImp, fillVideoResponse, VALIDATIONS} from '../../../libraries/ortbConverter/processors/video.js';
2
+ import {BANNER, VIDEO} from '../../../src/mediaTypes.js';
3
+
4
+ describe('pbjs -> ortb video conversion', () => {
5
+ [
6
+ {
7
+ t: 'non-video request',
8
+ request: {
9
+ mediaTypes: {
10
+ banner: {}
11
+ }
12
+ },
13
+ imp: {}
14
+ },
15
+ {
16
+ t: 'instream video request',
17
+ request: {
18
+ mediaTypes: {
19
+ video: {
20
+ playerSize: [[1, 2]],
21
+ context: 'instream',
22
+ mimes: ['video/mp4'],
23
+ skip: 1,
24
+ }
25
+ }
26
+ },
27
+ imp: {
28
+ video: {
29
+ w: 1,
30
+ h: 2,
31
+ mimes: ['video/mp4'],
32
+ skip: 1,
33
+ placement: 1,
34
+ },
35
+ },
36
+ },
37
+ {
38
+ t: 'outstream video request',
39
+ request: {
40
+ mediaTypes: {
41
+ video: {
42
+ playerSize: [[1, 2]],
43
+ context: 'outstream',
44
+ mimes: ['video/mp4'],
45
+ skip: 1
46
+ }
47
+ }
48
+ },
49
+ imp: {
50
+ video: {
51
+ w: 1,
52
+ h: 2,
53
+ mimes: ['video/mp4'],
54
+ skip: 1,
55
+ },
56
+ },
57
+ },
58
+ {
59
+ t: 'video request with explicit placement',
60
+ request: {
61
+ mediaTypes: {
62
+ video: {
63
+ playerSize: [[1, 2]],
64
+ placement: 'explicit'
65
+ }
66
+ }
67
+ },
68
+ imp: {
69
+ video: {
70
+ w: 1,
71
+ h: 2,
72
+ placement: 'explicit',
73
+ }
74
+ }
75
+ },
76
+ {
77
+ t: 'video request with multiple playerSizes',
78
+ request: {
79
+ mediaTypes: {
80
+ video: {
81
+ playerSize: [[1, 2], [3, 4]]
82
+ }
83
+ }
84
+ },
85
+ imp: {
86
+ video: {
87
+ w: 1,
88
+ h: 2,
89
+ }
90
+ }
91
+ },
92
+ {
93
+ t: 'video request with 2-tuple playerSize',
94
+ request: {
95
+ mediaTypes: {
96
+ video: {
97
+ playerSize: [1, 2]
98
+ }
99
+ }
100
+ },
101
+ imp: {
102
+ video: {
103
+ w: 1,
104
+ h: 2,
105
+ }
106
+ }
107
+ },
108
+ ].forEach(({t, request, imp}) => {
109
+ it(`can handle ${t}`, () => {
110
+ const actual = {};
111
+ fillVideoImp(actual, request, {});
112
+ expect(actual).to.eql(imp);
113
+ });
114
+ });
115
+
116
+ it('should keep ortb2Imp.video', () => {
117
+ const imp = {
118
+ video: {
119
+ someParam: 'someValue'
120
+ }
121
+ };
122
+ fillVideoImp(imp, {mediaTypes: {video: {playerSize: [[1, 2]]}}}, {});
123
+ expect(imp.video.someParam).to.eql('someValue');
124
+ });
125
+
126
+ it('does nothing is context.mediaType is set but is not VIDEO', () => {
127
+ const imp = {};
128
+ fillVideoImp(imp, {mediaTypes: {video: {playerSize: [[1, 2]]}}}, {mediaType: BANNER});
129
+ expect(imp).to.eql({});
130
+ });
131
+ });
132
+
133
+ describe('ortb -> pbjs video conversion', () => {
134
+ [
135
+ {
136
+ t: 'non-video response',
137
+ seatbid: {},
138
+ response: {
139
+ mediaType: BANNER
140
+ },
141
+ expected: {
142
+ mediaType: BANNER
143
+ }
144
+ },
145
+ {
146
+ t: 'simple video response',
147
+ seatbid: {
148
+ adm: 'mockAdm',
149
+ nurl: 'mockNurl'
150
+ },
151
+ response: {
152
+ mediaType: VIDEO,
153
+ },
154
+ context: {
155
+ imp: {
156
+ video: {
157
+ w: 1,
158
+ h: 2
159
+ }
160
+ }
161
+ },
162
+ expected: {
163
+ mediaType: VIDEO,
164
+ playerWidth: 1,
165
+ playerHeight: 2,
166
+ vastXml: 'mockAdm',
167
+ vastUrl: 'mockNurl'
168
+ }
169
+ },
170
+ {
171
+ t: 'video response without playerSize',
172
+ seatbid: {},
173
+ response: {
174
+ mediaType: VIDEO,
175
+ },
176
+ context: {
177
+ imp: {}
178
+ },
179
+ expected: {
180
+ mediaType: VIDEO
181
+ }
182
+ }
183
+ ].forEach(({t, seatbid, context, response, expected}) => {
184
+ it(`can handle ${t}`, () => {
185
+ fillVideoResponse(response, seatbid, context);
186
+ expect(response).to.eql(expected);
187
+ })
188
+ })
189
+ })
@@ -20,6 +20,7 @@ import { setSizeConfig } from 'src/sizeMapping.js';
20
20
  import {find, includes} from 'src/polyfill.js';
21
21
  import s2sTesting from 'modules/s2sTesting.js';
22
22
  import {hook} from '../../../../src/hook.js';
23
+ import {auctionManager} from '../../../../src/auctionManager.js';
23
24
  var events = require('../../../../src/events');
24
25
 
25
26
  const CONFIG = {
@@ -2543,4 +2544,105 @@ describe('adapterManager tests', function () {
2543
2544
  })
2544
2545
  });
2545
2546
  });
2547
+
2548
+ describe('callDataDeletionRequest', () => {
2549
+ function delMethodForBidder(bidderCode) {
2550
+ const del = sinon.stub();
2551
+ adapterManager.registerBidAdapter({
2552
+ callBids: sinon.stub(),
2553
+ getSpec() {
2554
+ return {
2555
+ onDataDeletionRequest: del
2556
+ }
2557
+ }
2558
+ }, bidderCode);
2559
+ return del;
2560
+ }
2561
+
2562
+ function delMethodForAnalytics(provider) {
2563
+ const del = sinon.stub();
2564
+ adapterManager.registerAnalyticsAdapter({
2565
+ code: provider,
2566
+ adapter: {
2567
+ enableAnalytics: sinon.stub(),
2568
+ onDataDeletionRequest: del,
2569
+ },
2570
+ })
2571
+ return del;
2572
+ }
2573
+
2574
+ Object.entries({
2575
+ 'bid adapters': delMethodForBidder,
2576
+ 'analytics adapters': delMethodForAnalytics
2577
+ }).forEach(([t, getDelMethod]) => {
2578
+ describe(t, () => {
2579
+ it('invokes onDataDeletionRequest', () => {
2580
+ const del = getDelMethod('mockAdapter');
2581
+ adapterManager.callDataDeletionRequest();
2582
+ sinon.assert.calledOnce(del);
2583
+ });
2584
+
2585
+ it('does not choke if onDeletionRequest throws', () => {
2586
+ const del1 = getDelMethod('mockAdapter1');
2587
+ const del2 = getDelMethod('mockAdapter2');
2588
+ del1.throws(new Error());
2589
+ adapterManager.callDataDeletionRequest();
2590
+ sinon.assert.calledOnce(del1);
2591
+ sinon.assert.calledOnce(del2);
2592
+ });
2593
+ })
2594
+ })
2595
+
2596
+ describe('for bid adapters', () => {
2597
+ let bidderRequests;
2598
+
2599
+ beforeEach(() => {
2600
+ bidderRequests = [];
2601
+ sinon.stub(auctionManager, 'getBidsRequested').callsFake(() => bidderRequests);
2602
+ })
2603
+ afterEach(() => {
2604
+ auctionManager.getBidsRequested.restore();
2605
+ })
2606
+
2607
+ it('does not invoke onDataDeletionRequest on aliases', () => {
2608
+ const del = delMethodForBidder('mockBidder');
2609
+ adapterManager.aliasBidAdapter('mockBidder', 'mockBidderAlias');
2610
+ adapterManager.aliasBidAdapter('mockBidderAlias2', 'mockBidderAlias');
2611
+ adapterManager.callDataDeletionRequest();
2612
+ sinon.assert.calledOnce(del);
2613
+ });
2614
+
2615
+ it('passes known bidder requests', () => {
2616
+ const del1 = delMethodForBidder('mockBidder1');
2617
+ const del2 = delMethodForBidder('mockBidder2');
2618
+ adapterManager.aliasBidAdapter('mockBidder1', 'mockBidder1Alias');
2619
+ adapterManager.aliasBidAdapter('mockBidder1Alias', 'mockBidder1Alias2')
2620
+ bidderRequests = [
2621
+ {
2622
+ bidderCode: 'mockBidder1',
2623
+ id: 0
2624
+ },
2625
+ {
2626
+ bidderCode: 'mockBidder2',
2627
+ id: 1,
2628
+ },
2629
+ {
2630
+ bidderCode: 'mockBidder1Alias',
2631
+ id: 2,
2632
+ },
2633
+ {
2634
+ bidderCode: 'someOtherBidder',
2635
+ id: 3
2636
+ },
2637
+ {
2638
+ bidderCode: 'mockBidder1Alias2',
2639
+ id: 4
2640
+ }
2641
+ ];
2642
+ adapterManager.callDataDeletionRequest();
2643
+ sinon.assert.calledWith(del1, [bidderRequests[0], bidderRequests[2], bidderRequests[4]]);
2644
+ sinon.assert.calledWith(del2, [bidderRequests[1]]);
2645
+ })
2646
+ })
2647
+ });
2546
2648
  });
@@ -269,6 +269,40 @@ describe('targeting tests', function () {
269
269
  bidCacheFilterFunction = undef;
270
270
  });
271
271
 
272
+ describe('isBidNotExpired', () => {
273
+ let clock;
274
+ beforeEach(() => {
275
+ clock = sandbox.useFakeTimers(0);
276
+ });
277
+
278
+ Object.entries({
279
+ 'bid.ttlBuffer': (bid, ttlBuffer) => {
280
+ bid.ttlBuffer = ttlBuffer
281
+ },
282
+ 'setConfig({ttlBuffer})': (_, ttlBuffer) => {
283
+ config.setConfig({ttlBuffer})
284
+ },
285
+ }).forEach(([t, setup]) => {
286
+ describe(`respects ${t}`, () => {
287
+ [0, 2].forEach(ttlBuffer => {
288
+ it(`when ttlBuffer is ${ttlBuffer}`, () => {
289
+ const bid = {
290
+ responseTimestamp: 0,
291
+ ttl: 10,
292
+ }
293
+ setup(bid, ttlBuffer);
294
+
295
+ expect(filters.isBidNotExpired(bid)).to.be.true;
296
+ clock.tick((bid.ttl - ttlBuffer) * 1000 - 100);
297
+ expect(filters.isBidNotExpired(bid)).to.be.true;
298
+ clock.tick(101);
299
+ expect(filters.isBidNotExpired(bid)).to.be.false;
300
+ });
301
+ });
302
+ });
303
+ });
304
+ });
305
+
272
306
  describe('getAllTargeting', function () {
273
307
  let amBidsReceivedStub;
274
308
  let amGetAdUnitsStub;
@@ -21,7 +21,8 @@ import {hook} from '../../../src/hook.js';
21
21
  import {reset as resetDebugging} from '../../../src/debugging.js';
22
22
  import $$PREBID_GLOBAL$$ from 'src/prebid.js';
23
23
  import {resetAuctionState} from 'src/auction.js';
24
-
24
+ import {stubAuctionIndex} from '../../helpers/indexStub.js';
25
+ import {createBid} from '../../../src/bidfactory.js';
25
26
  var assert = require('chai').assert;
26
27
  var expect = require('chai').expect;
27
28
 
@@ -1241,7 +1242,7 @@ describe('Unit: Prebid Module', function () {
1241
1242
 
1242
1243
  it('should require doc and id params', function () {
1243
1244
  $$PREBID_GLOBAL$$.renderAd();
1244
- var error = 'Error trying to write ad Id :undefined to the page. Missing document or adId';
1245
+ var error = 'Error trying to write ad Id :undefined to the page. Missing adId';
1245
1246
  assert.ok(spyLogError.calledWith(error), 'expected param error was logged');
1246
1247
  });
1247
1248
 
@@ -1458,7 +1459,7 @@ describe('Unit: Prebid Module', function () {
1458
1459
 
1459
1460
  describe('requestBids', function () {
1460
1461
  let logMessageSpy;
1461
- let makeRequestsStub;
1462
+ let makeRequestsStub, createAuctionStub;
1462
1463
  let adUnits;
1463
1464
  let clock;
1464
1465
  before(function () {
@@ -1467,7 +1468,6 @@ describe('Unit: Prebid Module', function () {
1467
1468
  after(function () {
1468
1469
  clock.restore();
1469
1470
  });
1470
- let bidsBackHandlerStub = sinon.stub();
1471
1471
 
1472
1472
  const BIDDER_CODE = 'sampleBidder';
1473
1473
  let bids = [{
@@ -1504,11 +1504,12 @@ describe('Unit: Prebid Module', function () {
1504
1504
  'start': 1000
1505
1505
  }];
1506
1506
 
1507
+ let spec, indexStub, auction, completeAuction;
1508
+
1507
1509
  beforeEach(function () {
1508
1510
  logMessageSpy = sinon.spy(utils, 'logMessage');
1509
1511
  makeRequestsStub = sinon.stub(adapterManager, 'makeBidRequests');
1510
1512
  makeRequestsStub.returns(bidRequests);
1511
-
1512
1513
  adUnits = [{
1513
1514
  code: 'adUnit-code',
1514
1515
  mediaTypes: {
@@ -1516,45 +1517,53 @@ describe('Unit: Prebid Module', function () {
1516
1517
  sizes: [[300, 250]]
1517
1518
  }
1518
1519
  },
1520
+ transactionId: 'mock-tid',
1519
1521
  bids: [
1520
1522
  {bidder: BIDDER_CODE, params: {placementId: 'id'}},
1521
1523
  ]
1522
1524
  }];
1523
- let adUnitCodes = ['adUnit-code'];
1524
- let auction = auctionModule.newAuction({
1525
- adUnits,
1526
- adUnitCodes,
1527
- callback: bidsBackHandlerStub,
1528
- cbTimeout: 2000
1529
- });
1530
- let createAuctionStub = sinon.stub(auctionModule, 'newAuction');
1531
- createAuctionStub.returns(auction);
1532
- });
1533
-
1534
- afterEach(function () {
1535
- clock.restore();
1536
- adapterManager.makeBidRequests.restore();
1537
- auctionModule.newAuction.restore();
1538
- utils.logMessage.restore();
1539
- });
1540
-
1541
- it('should execute callback after timeout', function () {
1542
- let spec = {
1525
+ indexStub = sinon.stub(auctionManager, 'index');
1526
+ indexStub.get(() => stubAuctionIndex({adUnits, bidRequests}))
1527
+ sinon.stub(adapterManager, 'callBids').callsFake((_, bidrequests, addBidResponse, adapterDone) => {
1528
+ completeAuction = (bidsReceived) => {
1529
+ bidsReceived.forEach((bid) => addBidResponse(bid.adUnitCode, Object.assign(createBid(), bid)));
1530
+ bidRequests.forEach((req) => adapterDone.call(req));
1531
+ }
1532
+ })
1533
+ const origNewAuction = auctionModule.newAuction;
1534
+ sinon.stub(auctionModule, 'newAuction').callsFake(function (opts) {
1535
+ auction = origNewAuction(opts);
1536
+ return auction;
1537
+ })
1538
+ spec = {
1543
1539
  code: BIDDER_CODE,
1544
1540
  isBidRequestValid: sinon.stub(),
1545
1541
  buildRequests: sinon.stub(),
1546
1542
  interpretResponse: sinon.stub(),
1547
1543
  getUserSyncs: sinon.stub(),
1548
- onTimeout: sinon.stub()
1544
+ onTimeout: sinon.stub(),
1545
+ onSetTargeting: sinon.stub(),
1549
1546
  };
1550
1547
 
1551
1548
  registerBidder(spec);
1552
1549
  spec.buildRequests.returns([{'id': 123, 'method': 'POST'}]);
1553
1550
  spec.isBidRequestValid.returns(true);
1554
1551
  spec.interpretResponse.returns(bids);
1552
+ });
1553
+
1554
+ afterEach(function () {
1555
+ clock.restore();
1556
+ adapterManager.makeBidRequests.restore();
1557
+ adapterManager.callBids.restore();
1558
+ indexStub.restore();
1559
+ auction.getBidsReceived = () => [];
1560
+ auctionModule.newAuction.restore();
1561
+ utils.logMessage.restore();
1562
+ });
1555
1563
 
1564
+ it('should execute callback after timeout', function () {
1556
1565
  let requestObj = {
1557
- bidsBackHandler: null, // does not need to be defined because of newAuction mock in beforeEach
1566
+ bidsBackHandler: sinon.stub(),
1558
1567
  timeout: 2000,
1559
1568
  adUnits: adUnits
1560
1569
  };
@@ -1567,26 +1576,13 @@ describe('Unit: Prebid Module', function () {
1567
1576
  clock.tick(1);
1568
1577
  assert.ok(logMessageSpy.calledWith(sinon.match(re)), 'executeCallback called');
1569
1578
 
1570
- expect(bidsBackHandlerStub.getCall(0).args[1]).to.equal(true,
1579
+ expect(requestObj.bidsBackHandler.getCall(0).args[1]).to.equal(true,
1571
1580
  'bidsBackHandler should be called with timedOut=true');
1572
1581
 
1573
1582
  sinon.assert.called(spec.onTimeout);
1574
1583
  });
1575
1584
 
1576
- it('should execute callback after setTargeting', function () {
1577
- let spec = {
1578
- code: BIDDER_CODE,
1579
- isBidRequestValid: sinon.stub(),
1580
- buildRequests: sinon.stub(),
1581
- interpretResponse: sinon.stub(),
1582
- onSetTargeting: sinon.stub()
1583
- };
1584
-
1585
- registerBidder(spec);
1586
- spec.buildRequests.returns([{'id': 123, 'method': 'POST'}]);
1587
- spec.isBidRequestValid.returns(true);
1588
- spec.interpretResponse.returns(bids);
1589
-
1585
+ it('should execute `onSetTargeting` after setTargetingForGPTAsync', function () {
1590
1586
  const bidId = 1;
1591
1587
  const auctionId = 1;
1592
1588
  let adResponse = Object.assign({
@@ -1595,6 +1591,7 @@ describe('Unit: Prebid Module', function () {
1595
1591
  width: 300,
1596
1592
  height: 250,
1597
1593
  adUnitCode: bidRequests[0].bids[0].adUnitCode,
1594
+ transactionId: 'mock-tid',
1598
1595
  adserverTargeting: {
1599
1596
  'hb_bidder': BIDDER_CODE,
1600
1597
  'hb_adid': bidId,
@@ -1603,20 +1600,102 @@ describe('Unit: Prebid Module', function () {
1603
1600
  },
1604
1601
  bidder: bids[0].bidderCode,
1605
1602
  }, bids[0]);
1606
- auction.getBidsReceived = function() { return [adResponse]; }
1607
- auction.getAuctionId = () => auctionId;
1608
1603
 
1609
1604
  let requestObj = {
1610
- bidsBackHandler: null, // does not need to be defined because of newAuction mock in beforeEach
1605
+ bidsBackHandler: null,
1611
1606
  timeout: 2000,
1612
1607
  adUnits: adUnits
1613
1608
  };
1614
1609
 
1615
1610
  $$PREBID_GLOBAL$$.requestBids(requestObj);
1611
+ completeAuction([adResponse]);
1616
1612
  $$PREBID_GLOBAL$$.setTargetingForGPTAsync();
1617
1613
 
1618
1614
  sinon.assert.called(spec.onSetTargeting);
1619
1615
  });
1616
+
1617
+ describe('returns a promise that resolves', () => {
1618
+ function delayHook(next, ...args) {
1619
+ setTimeout(() => next(...args))
1620
+ }
1621
+
1622
+ beforeEach(() => {
1623
+ // make sure the return value works correctly when hooks give up priority
1624
+ $$PREBID_GLOBAL$$.requestBids.before(delayHook)
1625
+ });
1626
+
1627
+ afterEach(() => {
1628
+ $$PREBID_GLOBAL$$.requestBids.getHooks({hook: delayHook}).remove();
1629
+ });
1630
+
1631
+ Object.entries({
1632
+ 'immediately, without bidsBackHandler': (req) => $$PREBID_GLOBAL$$.requestBids(req),
1633
+ 'after bidsBackHandler': (() => {
1634
+ const bidsBackHandler = sinon.stub();
1635
+ return function (req) {
1636
+ return $$PREBID_GLOBAL$$.requestBids({...req, bidsBackHandler}).then(({bids, timedOut, auctionId}) => {
1637
+ sinon.assert.calledWith(bidsBackHandler, bids, timedOut, auctionId);
1638
+ return {bids, timedOut, auctionId};
1639
+ })
1640
+ }
1641
+ })(),
1642
+ 'after a bidsBackHandler that throws': (req) => $$PREBID_GLOBAL$$.requestBids({...req, bidsBackHandler: () => { throw new Error() }})
1643
+ }).forEach(([t, requestBids]) => {
1644
+ describe(t, () => {
1645
+ it('with no args, when no adUnits are defined', () => {
1646
+ return requestBids({}).then((res) => {
1647
+ expect(res).to.eql({
1648
+ bids: undefined,
1649
+ timedOut: undefined,
1650
+ auctionId: undefined
1651
+ });
1652
+ });
1653
+ });
1654
+
1655
+ it('on timeout', (done) => {
1656
+ requestBids({
1657
+ auctionId: 'mock-auctionId',
1658
+ adUnits,
1659
+ timeout: 10
1660
+ }).then(({timedOut, bids, auctionId}) => {
1661
+ expect(timedOut).to.be.true;
1662
+ expect(bids).to.eql({});
1663
+ expect(auctionId).to.eql('mock-auctionId');
1664
+ done();
1665
+ });
1666
+ clock.tick(12);
1667
+ });
1668
+
1669
+ it('with auction result', (done) => {
1670
+ const bid = {
1671
+ bidder: 'mock-bidder',
1672
+ adUnitCode: adUnits[0].code,
1673
+ transactionId: adUnits[0].transactionId
1674
+ }
1675
+ requestBids({
1676
+ adUnits,
1677
+ }).then(({bids}) => {
1678
+ sinon.assert.match(bids[bid.adUnitCode].bids[0], bid)
1679
+ done();
1680
+ });
1681
+ // `completeAuction` won't work until we're out of `delayHook`
1682
+ // and the mocked auction has been set up;
1683
+ // setTimeout here takes us after the setTimeout in `delayHook`
1684
+ setTimeout(() => completeAuction([bid]));
1685
+ })
1686
+ })
1687
+ })
1688
+ })
1689
+
1690
+ it('should transfer ttlBuffer to adUnit.ttlBuffer', () => {
1691
+ $$PREBID_GLOBAL$$.requestBids({
1692
+ ttlBuffer: 123,
1693
+ adUnits: [adUnits[0], {...adUnits[0], ttlBuffer: 0}]
1694
+ });
1695
+ sinon.assert.calledWithMatch(auctionModule.newAuction, {
1696
+ adUnits: sinon.match((units) => units[0].ttlBuffer === 123 && units[1].ttlBuffer === 0)
1697
+ })
1698
+ });
1620
1699
  })
1621
1700
 
1622
1701
  describe('requestBids', function () {
@@ -2,7 +2,7 @@ import { getAdServerTargeting } from 'test/fixtures/fixtures.js';
2
2
  import { expect } from 'chai';
3
3
  import CONSTANTS from 'src/constants.json';
4
4
  import * as utils from 'src/utils.js';
5
- import {deepEqual, waitForElementToLoad} from 'src/utils.js';
5
+ import {memoize, deepEqual, waitForElementToLoad} from 'src/utils.js';
6
6
 
7
7
  var assert = require('assert');
8
8
 
@@ -1260,3 +1260,47 @@ describe('Utils', function () {
1260
1260
  });
1261
1261
  });
1262
1262
  });
1263
+
1264
+ describe('memoize', () => {
1265
+ let fn;
1266
+
1267
+ beforeEach(() => {
1268
+ fn = sinon.stub().callsFake(function() {
1269
+ return Array.from(arguments);
1270
+ });
1271
+ });
1272
+
1273
+ it('delegates to fn', () => {
1274
+ expect(memoize(fn)('one', 'two')).to.eql(['one', 'two']);
1275
+ });
1276
+
1277
+ it('caches result after first call, if first argument is the same', () => {
1278
+ const mem = memoize(fn);
1279
+ mem('one', 'two');
1280
+ expect(mem('one', 'three')).to.eql(['one', 'two']);
1281
+ expect(fn.callCount).to.equal(1);
1282
+ });
1283
+
1284
+ it('delegates again when the first argument changes', () => {
1285
+ const mem = memoize(fn);
1286
+ mem('one', 'two');
1287
+ expect(mem('two', 'one')).to.eql(['two', 'one']);
1288
+ expect(fn.callCount).to.eql(2);
1289
+ });
1290
+
1291
+ it('can clear cache with .clear', () => {
1292
+ const mem = memoize(fn);
1293
+ mem('arg');
1294
+ mem.clear();
1295
+ expect(mem('arg')).to.eql(['arg']);
1296
+ expect(fn.callCount).to.equal(2);
1297
+ });
1298
+
1299
+ it('allows setting cache keys', () => {
1300
+ const mem = memoize(fn, (...args) => args.join(','))
1301
+ mem('one', 'two');
1302
+ mem('one', 'three');
1303
+ expect(mem('one', 'three')).to.eql(['one', 'three']);
1304
+ expect(fn.callCount).to.eql(2);
1305
+ })
1306
+ })