prebid.js 9.5.0 → 9.7.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 (253) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  2. package/.github/release-drafter.yml +4 -0
  3. package/README.md +4 -4
  4. package/dist/33acrossAnalyticsAdapter.js +1 -1
  5. package/dist/33acrossBidAdapter.js +1 -1
  6. package/dist/33acrossIdSystem.js +1 -1
  7. package/dist/BTBidAdapter.js +1 -1
  8. package/dist/adagioAnalyticsAdapter.js +1 -1
  9. package/dist/adagioBidAdapter.js +1 -1
  10. package/dist/adagioUtils.js +1 -1
  11. package/dist/addefendBidAdapter.js +1 -1
  12. package/dist/adgenerationBidAdapter.js +1 -1
  13. package/dist/adkernelBidAdapter.js +1 -1
  14. package/dist/adlooxRtdProvider.js +1 -1
  15. package/dist/adqueryBidAdapter.js +1 -1
  16. package/dist/adrelevantisBidAdapter.js +1 -1
  17. package/dist/adstirBidAdapter.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/adyoulikeBidAdapter.js +1 -1
  22. package/dist/agmaAnalyticsAdapter.js +1 -1
  23. package/dist/aidemBidAdapter.js +1 -1
  24. package/dist/ajaBidAdapter.js +1 -1
  25. package/dist/amxBidAdapter.js +1 -1
  26. package/dist/amxIdSystem.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/axonixBidAdapter.js +1 -1
  31. package/dist/bidglassBidAdapter.js +1 -1
  32. package/dist/big-richmediaBidAdapter.js +1 -1
  33. package/dist/bridBidAdapter.js +1 -1
  34. package/dist/bridgewellBidAdapter.js +1 -1
  35. package/dist/brightMountainMediaBidAdapter.js +1 -1
  36. package/dist/carodaBidAdapter.js +1 -1
  37. package/dist/chtnwBidAdapter.js +1 -1
  38. package/dist/chunk-core.js +1 -1
  39. package/dist/cleanmedianetBidAdapter.js +1 -1
  40. package/dist/concertBidAdapter.js +1 -1
  41. package/dist/connectIdSystem.js +1 -1
  42. package/dist/connectadBidAdapter.js +1 -1
  43. package/dist/connectionInfo.js +1 -0
  44. package/dist/consumableBidAdapter.js +1 -1
  45. package/dist/conversantAnalyticsAdapter.js +1 -1
  46. package/dist/conversantBidAdapter.js +1 -1
  47. package/dist/craftBidAdapter.js +1 -1
  48. package/dist/criteoBidAdapter.js +1 -1
  49. package/dist/cwireBidAdapter.js +1 -1
  50. package/dist/dailymotionBidAdapter.js +1 -1
  51. package/dist/dependencies.json +31 -2
  52. package/dist/docereeAdManagerBidAdapter.js +1 -1
  53. package/dist/dspxBidAdapter.js +1 -1
  54. package/dist/dxkultureBidAdapter.js +1 -1
  55. package/dist/eplanningBidAdapter.js +1 -1
  56. package/dist/euidIdSystem.js +1 -1
  57. package/dist/exadsBidAdapter.js +1 -1
  58. package/dist/feedadBidAdapter.js +1 -1
  59. package/dist/finativeBidAdapter.js +1 -1
  60. package/dist/freewheel-sspBidAdapter.js +1 -1
  61. package/dist/gamoshiBidAdapter.js +1 -1
  62. package/dist/gmosspBidAdapter.js +1 -1
  63. package/dist/goldbachBidAdapter.js +1 -1
  64. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  65. package/dist/greenbidsRtdProvider.js +1 -1
  66. package/dist/gridBidAdapter.js +1 -1
  67. package/dist/gumgumBidAdapter.js +1 -1
  68. package/dist/h12mediaBidAdapter.js +1 -1
  69. package/dist/hypelabBidAdapter.js +1 -1
  70. package/dist/id5AnalyticsAdapter.js +1 -1
  71. package/dist/id5IdSystem.js +1 -1
  72. package/dist/idImportLibrary.js +1 -1
  73. package/dist/imdsBidAdapter.js +1 -1
  74. package/dist/improvedigitalBidAdapter.js +1 -1
  75. package/dist/insticatorBidAdapter.js +1 -1
  76. package/dist/intentIqAnalyticsAdapter.js +1 -1
  77. package/dist/ixBidAdapter.js +1 -1
  78. package/dist/jixieBidAdapter.js +1 -1
  79. package/dist/justpremiumBidAdapter.js +1 -1
  80. package/dist/kargoBidAdapter.js +1 -1
  81. package/dist/kimberliteBidAdapter.js +1 -1
  82. package/dist/konduitAnalyticsAdapter.js +1 -1
  83. package/dist/kueezBidAdapter.js +1 -1
  84. package/dist/lassoBidAdapter.js +1 -1
  85. package/dist/lifestreetBidAdapter.js +1 -1
  86. package/dist/liveIntentIdSystem.js +1 -1
  87. package/dist/logicadBidAdapter.js +1 -1
  88. package/dist/loglyliftBidAdapter.js +1 -1
  89. package/dist/luceadBidAdapter.js +1 -1
  90. package/dist/mabidderBidAdapter.js +1 -1
  91. package/dist/magniteAnalyticsAdapter.js +1 -1
  92. package/dist/malltvAnalyticsAdapter.js +1 -1
  93. package/dist/marsmediaBidAdapter.js +1 -1
  94. package/dist/mediafuseBidAdapter.js +1 -1
  95. package/dist/medianetAnalyticsAdapter.js +1 -1
  96. package/dist/medianetBidAdapter.js +1 -1
  97. package/dist/mediasquareBidAdapter.js +1 -1
  98. package/dist/mgidBidAdapter.js +1 -1
  99. package/dist/minutemediaBidAdapter.js +1 -1
  100. package/dist/missenaBidAdapter.js +1 -1
  101. package/dist/mobianRtdProvider.js +1 -1
  102. package/dist/nexx360BidAdapter.js +1 -1
  103. package/dist/nobidAnalyticsAdapter.js +1 -1
  104. package/dist/nobidBidAdapter.js +1 -1
  105. package/dist/not-for-prod/prebid.js +174 -170
  106. package/dist/oguryBidAdapter.js +1 -1
  107. package/dist/onetagBidAdapter.js +1 -1
  108. package/dist/ooloAnalyticsAdapter.js +1 -1
  109. package/dist/openwebBidAdapter.js +1 -1
  110. package/dist/openxBidAdapter.js +1 -1
  111. package/dist/optidigitalBidAdapter.js +1 -1
  112. package/dist/orbidderBidAdapter.js +1 -1
  113. package/dist/ortbConverter.js +1 -1
  114. package/dist/outbrainBidAdapter.js +1 -1
  115. package/dist/ownadxBidAdapter.js +1 -0
  116. package/dist/pixfutureBidAdapter.js +1 -1
  117. package/dist/prismaBidAdapter.js +1 -1
  118. package/dist/publinkIdSystem.js +1 -1
  119. package/dist/publirBidAdapter.js +1 -1
  120. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  121. package/dist/pubmaticBidAdapter.js +1 -1
  122. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  123. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  124. package/dist/pxyzBidAdapter.js +1 -1
  125. package/dist/quantcastBidAdapter.js +1 -1
  126. package/dist/readpeakBidAdapter.js +1 -1
  127. package/dist/relaidoBidAdapter.js +1 -1
  128. package/dist/retailspotBidAdapter.js +1 -1
  129. package/dist/rhythmoneBidAdapter.js +1 -1
  130. package/dist/riseBidAdapter.js +1 -1
  131. package/dist/riseUtils.js +1 -0
  132. package/dist/rubiconBidAdapter.js +1 -1
  133. package/dist/seedingAllianceBidAdapter.js +1 -1
  134. package/dist/seedtagBidAdapter.js +1 -1
  135. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  136. package/dist/sharethroughBidAdapter.js +1 -1
  137. package/dist/shinezBidAdapter.js +1 -1
  138. package/dist/smaatoBidAdapter.js +1 -1
  139. package/dist/smartadserverBidAdapter.js +1 -1
  140. package/dist/smarthubBidAdapter.js +1 -1
  141. package/dist/smartxBidAdapter.js +1 -1
  142. package/dist/smilewantedBidAdapter.js +1 -1
  143. package/dist/snigelBidAdapter.js +1 -1
  144. package/dist/sonobiBidAdapter.js +1 -1
  145. package/dist/sovrnBidAdapter.js +1 -1
  146. package/dist/sspBCBidAdapter.js +1 -1
  147. package/dist/stnBidAdapter.js +1 -1
  148. package/dist/stvBidAdapter.js +1 -1
  149. package/dist/sublimeBidAdapter.js +1 -1
  150. package/dist/taboolaBidAdapter.js +1 -1
  151. package/dist/tappxBidAdapter.js +1 -1
  152. package/dist/targetVideoBidAdapter.js +1 -1
  153. package/dist/teadsBidAdapter.js +1 -1
  154. package/dist/telariaBidAdapter.js +1 -1
  155. package/dist/teqblazeUtils.js +1 -1
  156. package/dist/terceptAnalyticsAdapter.js +1 -1
  157. package/dist/themoneytizerBidAdapter.js +1 -1
  158. package/dist/trionBidAdapter.js +1 -1
  159. package/dist/tripleliftBidAdapter.js +1 -1
  160. package/dist/ttdBidAdapter.js +1 -1
  161. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  162. package/dist/uid2IdSystem.js +1 -1
  163. package/dist/uid2IdSystem_shared.js +1 -1
  164. package/dist/underdogmediaBidAdapter.js +1 -1
  165. package/dist/undertoneBidAdapter.js +1 -1
  166. package/dist/unrulyBidAdapter.js +1 -1
  167. package/dist/viantOrtbBidAdapter.js +1 -1
  168. package/dist/vidazooUtils.js +1 -1
  169. package/dist/videobyteBidAdapter.js +1 -1
  170. package/dist/visxBidAdapter.js +1 -1
  171. package/dist/vuukleBidAdapter.js +1 -1
  172. package/dist/widespaceBidAdapter.js +1 -1
  173. package/dist/winrBidAdapter.js +1 -1
  174. package/dist/wurflRtdProvider.js +1 -0
  175. package/dist/yahooAdsBidAdapter.js +1 -1
  176. package/dist/yieldmoBidAdapter.js +1 -1
  177. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  178. package/integrationExamples/gpt/wurflRtdProvider_example.html +106 -0
  179. package/libraries/connectionInfo/connectionUtils.js +33 -0
  180. package/libraries/ortbConverter/processors/video.js +2 -24
  181. package/libraries/riseUtils/index.js +331 -0
  182. package/libraries/teqblazeUtils/bidderUtils.js +15 -11
  183. package/libraries/vidazooUtils/bidderUtils.js +16 -0
  184. package/modules/.submodules.json +3 -1
  185. package/modules/51DegreesRtdProvider.md +11 -7
  186. package/modules/adagioAnalyticsAdapter.js +101 -84
  187. package/modules/adagioAnalyticsAdapter.md +4 -0
  188. package/modules/adagioBidAdapter.js +14 -66
  189. package/modules/adkernelBidAdapter.js +2 -2
  190. package/modules/aidemBidAdapter.js +2 -0
  191. package/modules/appnexusBidAdapter.js +1 -1
  192. package/modules/cleanmedianetBidAdapter.js +1 -1
  193. package/modules/connectIdSystem.js +5 -3
  194. package/modules/dailymotionBidAdapter.js +19 -0
  195. package/modules/docereeAdManagerBidAdapter.js +9 -12
  196. package/modules/gamoshiBidAdapter.js +1 -1
  197. package/modules/greenbidsAnalyticsAdapter.js +7 -4
  198. package/modules/greenbidsRtdProvider.js +15 -5
  199. package/modules/id5IdSystem.js +14 -93
  200. package/modules/idImportLibrary.js +14 -6
  201. package/modules/insticatorBidAdapter.js +35 -31
  202. package/modules/kargoBidAdapter.js +11 -14
  203. package/modules/kimberliteBidAdapter.js +24 -7
  204. package/modules/kimberliteBidAdapter.md +30 -1
  205. package/modules/minutemediaBidAdapter.js +21 -398
  206. package/modules/mobianRtdProvider.js +28 -14
  207. package/modules/nexx360BidAdapter.js +3 -2
  208. package/modules/openwebBidAdapter.js +18 -396
  209. package/modules/ownadxBidAdapter.js +99 -0
  210. package/modules/prismaBidAdapter.js +1 -27
  211. package/modules/publirBidAdapter.js +20 -273
  212. package/modules/pubmaticBidAdapter.js +2 -1
  213. package/modules/resetdigitalBidAdapter.md +54 -45
  214. package/modules/riseBidAdapter.js +19 -400
  215. package/modules/sharethroughBidAdapter.js +5 -0
  216. package/modules/shinezBidAdapter.js +17 -361
  217. package/modules/smarthubBidAdapter.js +45 -177
  218. package/modules/stnBidAdapter.js +22 -398
  219. package/modules/telariaBidAdapter.js +2 -32
  220. package/modules/ttdBidAdapter.js +14 -32
  221. package/modules/uid2IdSystem_shared.js +51 -39
  222. package/modules/viantOrtbBidAdapter.js +1 -1
  223. package/modules/wurflRtdProvider.js +213 -0
  224. package/modules/wurflRtdProvider.md +67 -0
  225. package/package.json +1 -1
  226. package/src/adloader.js +1 -0
  227. package/src/prebid.js +6 -1
  228. package/src/video.js +78 -1
  229. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
  230. package/test/spec/modules/adagioBidAdapter_spec.js +32 -67
  231. package/test/spec/modules/appnexusBidAdapter_spec.js +0 -33
  232. package/test/spec/modules/cleanmedianetBidAdapter_spec.js +1 -1
  233. package/test/spec/modules/connectIdSystem_spec.js +27 -28
  234. package/test/spec/modules/dailymotionBidAdapter_spec.js +50 -0
  235. package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +1 -0
  236. package/test/spec/modules/gamoshiBidAdapter_spec.js +1 -1
  237. package/test/spec/modules/id5IdSystem_spec.js +25 -98
  238. package/test/spec/modules/idImportLibrary_spec.js +14 -0
  239. package/test/spec/modules/insticatorBidAdapter_spec.js +8 -1
  240. package/test/spec/modules/kargoBidAdapter_spec.js +7 -8
  241. package/test/spec/modules/kimberliteBidAdapter_spec.js +137 -65
  242. package/test/spec/modules/mobianRtdProvider_spec.js +46 -43
  243. package/test/spec/modules/nexx360BidAdapter_spec.js +1 -1
  244. package/test/spec/modules/ownadxBidAdapter_spec.js +103 -0
  245. package/test/spec/modules/pubmaticBidAdapter_spec.js +18 -0
  246. package/test/spec/modules/sharethroughBidAdapter_spec.js +35 -0
  247. package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
  248. package/test/spec/modules/ttdBidAdapter_spec.js +10 -1
  249. package/test/spec/modules/viantOrtbBidAdapter_spec.js +1 -1
  250. package/test/spec/modules/vidazooBidAdapter_spec.js +12 -4
  251. package/test/spec/modules/wurflRtdProvider_spec.js +324 -0
  252. package/test/spec/unit/pbjs_api_spec.js +11 -0
  253. package/test/spec/video_spec.js +103 -1
@@ -389,7 +389,7 @@ describe('InsticatorBidAdapter', function () {
389
389
  expect(data.device).to.be.an('object');
390
390
  expect(data.device.w).to.equal(window.innerWidth);
391
391
  expect(data.device.h).to.equal(window.innerHeight);
392
- expect(data.device.js).to.equal(true);
392
+ expect(data.device.js).to.equal(1);
393
393
  expect(data.device.ext).to.be.an('object');
394
394
  expect(data.device.ext.localStorage).to.equal(true);
395
395
  expect(data.device.ext.cookies).to.equal(false);
@@ -439,6 +439,13 @@ describe('InsticatorBidAdapter', function () {
439
439
  insticator: {
440
440
  adUnitId: bidRequest.params.adUnitId,
441
441
  },
442
+ prebid: {
443
+ bidder: {
444
+ insticator: {
445
+ adUnitId: bidRequest.params.adUnitId,
446
+ }
447
+ }
448
+ }
442
449
  }
443
450
  }]);
444
451
  expect(data.ext).to.be.an('object');
@@ -1885,16 +1885,15 @@ describe('kargo adapter tests', function() {
1885
1885
  describe('getUserSyncs', function() {
1886
1886
  let crb = {};
1887
1887
  const clientId = 'random-client-id-string';
1888
- const baseUrl = 'https://crb.kargo.com/api/v1/initsyncrnd/random-client-id-string?seed=3205e885-8d37-4139-b47e-f82cff268000&idx=0&gdpr=0&gdpr_consent=&us_privacy=&gpp=&gpp_sid=';
1888
+ const baseUrl = 'https://crb.kargo.com/api/v1/initsyncrnd/random-client-id-string?seed=3205e885-8d37-4139-b47e-f82cff268000&gdpr=0&gdpr_consent=&us_privacy=&gpp=&gpp_sid=';
1889
1889
 
1890
- function buildSyncUrls(baseUrl = 'https://crb.kargo.com/api/v1/initsyncrnd/random-client-id-string?seed=3205e885-8d37-4139-b47e-f82cff268000&idx=0&gdpr=0&gdpr_consent=&us_privacy=&gpp=&gpp_sid=') {
1890
+ function buildSyncUrls(baseUrl = 'https://crb.kargo.com/api/v1/initsyncrnd/random-client-id-string?seed=3205e885-8d37-4139-b47e-f82cff268000&gdpr=0&gdpr_consent=&us_privacy=&gpp=&gpp_sid=') {
1891
1891
  let syncs = [];
1892
- for (let i = 0; i < 5; i++) {
1893
- syncs.push({
1894
- type: 'iframe',
1895
- url: baseUrl.replace(/idx=\d+&/, `idx=${i}&`),
1896
- });
1897
- }
1892
+
1893
+ syncs.push({
1894
+ type: 'iframe',
1895
+ url: baseUrl
1896
+ });
1898
1897
 
1899
1898
  return syncs;
1900
1899
  }
@@ -1,6 +1,6 @@
1
- import { spec } from 'modules/kimberliteBidAdapter.js';
1
+ import { spec, ENDPOINT_URL } from 'modules/kimberliteBidAdapter.js';
2
2
  import { assert } from 'chai';
3
- import { BANNER } from '../../../src/mediaTypes.js';
3
+ import { BANNER, VIDEO } from '../../../src/mediaTypes.js';
4
4
 
5
5
  const BIDDER_CODE = 'kimberlite';
6
6
 
@@ -8,74 +8,104 @@ describe('kimberliteBidAdapter', function () {
8
8
  const sizes = [[640, 480]];
9
9
 
10
10
  describe('isBidRequestValid', function () {
11
- let bidRequest;
11
+ let bidRequests;
12
12
 
13
13
  beforeEach(function () {
14
- bidRequest = {
15
- mediaTypes: {
16
- [BANNER]: {
17
- sizes: [[320, 240]]
14
+ bidRequests = [
15
+ {
16
+ mediaTypes: {
17
+ [BANNER]: {
18
+ sizes: [[320, 240]]
19
+ }
20
+ },
21
+ params: {
22
+ placementId: 'test-placement'
18
23
  }
19
24
  },
20
- params: {
21
- placementId: 'test-placement'
25
+ {
26
+ mediaTypes: {
27
+ [VIDEO]: {
28
+ mimes: ['video/mp4']
29
+ }
30
+ },
31
+ params: {
32
+ placementId: 'test-placement'
33
+ }
22
34
  }
23
- };
35
+ ];
24
36
  });
25
37
 
26
- it('pass on valid bidRequest', function () {
27
- assert.isTrue(spec.isBidRequestValid(bidRequest));
38
+ it('pass on valid banner bidRequest', function () {
39
+ assert.isTrue(spec.isBidRequestValid(bidRequests[0]));
28
40
  });
29
41
 
30
42
  it('fails on missed placementId', function () {
31
- delete bidRequest.params.placementId;
32
- assert.isFalse(spec.isBidRequestValid(bidRequest));
43
+ delete bidRequests[0].params.placementId;
44
+ assert.isFalse(spec.isBidRequestValid(bidRequests[0]));
33
45
  });
34
46
 
35
47
  it('fails on empty banner', function () {
36
- delete bidRequest.mediaTypes.banner;
37
- assert.isFalse(spec.isBidRequestValid(bidRequest));
48
+ delete bidRequests[0].mediaTypes.banner;
49
+ assert.isFalse(spec.isBidRequestValid(bidRequests[0]));
38
50
  });
39
51
 
40
52
  it('fails on empty banner.sizes', function () {
41
- delete bidRequest.mediaTypes.banner.sizes;
42
- assert.isFalse(spec.isBidRequestValid(bidRequest));
53
+ delete bidRequests[0].mediaTypes.banner.sizes;
54
+ assert.isFalse(spec.isBidRequestValid(bidRequests[0]));
43
55
  });
44
56
 
45
57
  it('fails on empty request', function () {
46
58
  assert.isFalse(spec.isBidRequestValid());
47
59
  });
60
+
61
+ it('pass on valid video bidRequest', function () {
62
+ assert.isTrue(spec.isBidRequestValid(bidRequests[1]));
63
+ });
64
+
65
+ it('fails on missed video.mimes', function () {
66
+ delete bidRequests[1].mediaTypes.video.mimes;
67
+ assert.isFalse(spec.isBidRequestValid(bidRequests[1]));
68
+ });
48
69
  });
49
70
 
50
71
  describe('buildRequests', function () {
51
72
  let bidRequests, bidderRequest;
52
73
 
53
74
  beforeEach(function () {
54
- bidRequests = [{
55
- mediaTypes: {
56
- [BANNER]: {sizes: sizes}
75
+ bidRequests = [
76
+ {
77
+ mediaTypes: {
78
+ [BANNER]: {sizes: sizes}
79
+ },
80
+ params: {
81
+ placementId: 'test-placement'
82
+ }
57
83
  },
58
- params: {
59
- placementId: 'test-placement'
84
+ {
85
+ mediaTypes: {
86
+ [VIDEO]: {
87
+ mimes: ['video/mp4'],
88
+ }
89
+ },
90
+ params: {
91
+ placementId: 'test-placement'
92
+ }
60
93
  }
61
- }];
94
+ ];
62
95
 
63
96
  bidderRequest = {
64
97
  refererInfo: {
65
98
  domain: 'example.com',
66
99
  page: 'https://www.example.com/test.html',
67
- },
68
- bids: [{
69
- mediaTypes: {
70
- [BANNER]: {sizes: sizes}
71
- }
72
- }]
100
+ }
73
101
  };
74
102
  });
75
103
 
76
104
  it('valid bid request', function () {
77
105
  const bidRequest = spec.buildRequests(bidRequests, bidderRequest);
106
+
78
107
  assert.equal(bidRequest.method, 'POST');
108
+ assert.equal(bidRequest.url, ENDPOINT_URL);
79
109
  assert.ok(bidRequest.data);
80
110
 
81
111
  const requestData = bidRequest.data;
@@ -87,10 +117,10 @@ describe('kimberliteBidAdapter', function () {
87
117
  expect(requestData.ext).to.be.an('Object').and.have.all.keys('prebid');
88
118
  expect(requestData.ext.prebid).to.be.an('Object').and.have.all.keys('ver', 'adapterVer');
89
119
 
90
- const impData = requestData.imp[0];
91
- expect(impData.banner).is.to.be.an('Object').and.have.all.keys(['format', 'topframe']);
120
+ const impBannerData = requestData.imp[0];
121
+ expect(impBannerData.banner).is.to.be.an('Object').and.have.all.keys(['format', 'topframe']);
92
122
 
93
- const bannerData = impData.banner;
123
+ const bannerData = impBannerData.banner;
94
124
  expect(bannerData.format).to.be.an('array').and.is.not.empty;
95
125
 
96
126
  const formatData = bannerData.format[0];
@@ -98,30 +128,44 @@ describe('kimberliteBidAdapter', function () {
98
128
 
99
129
  assert.equal(formatData.w, sizes[0][0]);
100
130
  assert.equal(formatData.h, sizes[0][1]);
131
+
132
+ if (FEATURES.VIDEO) {
133
+ const impVideoData = requestData.imp[1];
134
+ expect(impVideoData.video).is.to.be.an('Object').and.have.all.keys(['mimes']);
135
+
136
+ const videoData = impVideoData.video;
137
+ expect(videoData.mimes).to.be.an('array').and.is.not.empty;
138
+ expect(videoData.mimes[0]).to.be.a('string').that.equals('video/mp4');
139
+ }
101
140
  });
102
141
  });
103
142
 
104
143
  describe('interpretResponse', function () {
105
- let bidderResponse, bidderRequest, bidRequest, expectedBid;
144
+ let bidderResponse, bidderRequest, bidRequest, expectedBids;
106
145
 
107
146
  const requestId = '07fba8b0-8812-4dc6-b91e-4a525d81729c';
108
- const bidId = '222209853178';
109
- const impId = 'imp-id';
110
- const crId = 'creative-id';
111
- const adm = '<a href="http://test.landing.com">landing</a>';
147
+ const bannerAdm = '<a href="http://test.landing.com">landing</a>';
148
+ const videoAdm = '<VAST version="3.0">test vast</VAST>';
112
149
 
113
150
  beforeEach(function () {
114
151
  bidderResponse = {
115
152
  body: {
116
153
  id: requestId,
117
154
  seatbid: [{
118
- bid: [{
119
- crid: crId,
120
- id: bidId,
121
- impid: impId,
122
- price: 1,
123
- adm: adm
124
- }]
155
+ bid: [
156
+ {
157
+ crid: 1,
158
+ impid: 1,
159
+ price: 1,
160
+ adm: bannerAdm
161
+ },
162
+ {
163
+ crid: 2,
164
+ impid: 2,
165
+ price: 1,
166
+ adm: videoAdm
167
+ }
168
+ ]
125
169
  }]
126
170
  }
127
171
  };
@@ -131,36 +175,64 @@ describe('kimberliteBidAdapter', function () {
131
175
  domain: 'example.com',
132
176
  page: 'https://www.example.com/test.html',
133
177
  },
134
- bids: [{
135
- bidId: impId,
136
- mediaTypes: {
137
- [BANNER]: {sizes: sizes}
178
+ bids: [
179
+ {
180
+ bidId: 1,
181
+ mediaTypes: {
182
+ banner: {sizes: sizes}
183
+ },
184
+ params: {
185
+ placementId: 'test-placement'
186
+ }
138
187
  },
139
- params: {
140
- placementId: 'test-placement'
188
+ {
189
+ bidId: 2,
190
+ mediaTypes: {
191
+ video: {
192
+ mimes: ['video/mp4']
193
+ }
194
+ },
195
+ params: {
196
+ placementId: 'test-placement'
197
+ }
141
198
  }
142
- }]
199
+ ]
143
200
  };
144
201
 
145
- expectedBid = {
146
- mediaType: 'banner',
147
- requestId: 'imp-id',
148
- seatBidId: '222209853178',
149
- cpm: 1,
150
- creative_id: 'creative-id',
151
- creativeId: 'creative-id',
152
- ttl: 300,
153
- netRevenue: true,
154
- ad: adm,
155
- meta: {}
156
- };
202
+ expectedBids = [
203
+ {
204
+ mediaType: 'banner',
205
+ requestId: 1,
206
+ cpm: 1,
207
+ creative_id: 1,
208
+ creativeId: 1,
209
+ ttl: 300,
210
+ netRevenue: true,
211
+ ad: bannerAdm,
212
+ meta: {}
213
+ },
214
+ {
215
+ mediaType: 'video',
216
+ requestId: 2,
217
+ cpm: 1,
218
+ creative_id: 2,
219
+ creativeId: 2,
220
+ ttl: 300,
221
+ netRevenue: true,
222
+ vastXml: videoAdm,
223
+ meta: {}
224
+ },
225
+ ];
157
226
 
158
227
  bidRequest = spec.buildRequests(bidderRequest.bids, bidderRequest);
159
228
  });
160
229
 
161
230
  it('pass on valid request', function () {
162
231
  const bids = spec.interpretResponse(bidderResponse, bidRequest);
163
- assert.deepEqual(bids[0], expectedBid);
232
+ assert.deepEqual(bids[0], expectedBids[0]);
233
+ if (FEATURES.VIDEO) {
234
+ assert.deepEqual(bids[1], expectedBids[1]);
235
+ }
164
236
  });
165
237
 
166
238
  it('fails on empty response', function () {
@@ -23,83 +23,86 @@ describe('Mobian RTD Submodule', function () {
23
23
  ajaxStub.restore();
24
24
  });
25
25
 
26
- it('should return no_risk when server responds with garm_no_risk', function () {
26
+ it('should return risk level when server responds with garm_risk', function () {
27
27
  ajaxStub = sinon.stub(ajax, 'ajaxBuilder').returns(function(url, callbacks) {
28
- callbacks.success({
29
- garm_no_risk: true,
30
- garm_low_risk: false,
31
- garm_medium_risk: false,
32
- garm_high_risk: false
33
- });
28
+ callbacks.success(JSON.stringify({
29
+ garm_risk: 'low',
30
+ sentiment_positive: true,
31
+ emotion_joy: true
32
+ }));
34
33
  });
35
34
 
36
35
  return mobianBrandSafetySubmodule.getBidRequestData(bidReqConfig, {}, {}).then((risk) => {
37
- expect(risk).to.have.property('mobianGarmRisk');
38
- expect(risk['mobianGarmRisk']).to.equal('no_risk');
36
+ expect(risk).to.deep.equal({
37
+ risk: 'low',
38
+ contentCategories: [],
39
+ sentiment: 'positive',
40
+ emotions: ['joy']
41
+ });
39
42
  expect(bidReqConfig.ortb2Fragments.global.site.ext.data.mobian).to.deep.equal(risk);
40
43
  });
41
44
  });
42
45
 
43
- it('should return low_risk when server responds with garm_no_risk', function () {
46
+ it('should handle response with GARM content categories, sentiment, and emotions', function () {
44
47
  ajaxStub = sinon.stub(ajax, 'ajaxBuilder').returns(function(url, callbacks) {
45
- callbacks.success({
46
- garm_no_risk: false,
47
- garm_low_risk: true,
48
- garm_medium_risk: false,
49
- garm_high_risk: false
50
- });
48
+ callbacks.success(JSON.stringify({
49
+ garm_risk: 'medium',
50
+ garm_content_category_arms: true,
51
+ garm_content_category_crime: true,
52
+ sentiment_negative: true,
53
+ emotion_anger: true,
54
+ emotion_fear: true
55
+ }));
51
56
  });
52
57
 
53
58
  return mobianBrandSafetySubmodule.getBidRequestData(bidReqConfig, {}, {}).then((risk) => {
54
- expect(risk).to.have.property('mobianGarmRisk');
55
- expect(risk['mobianGarmRisk']).to.equal('low_risk');
59
+ expect(risk).to.deep.equal({
60
+ risk: 'medium',
61
+ contentCategories: ['arms', 'crime'],
62
+ sentiment: 'negative',
63
+ emotions: ['anger', 'fear']
64
+ });
56
65
  expect(bidReqConfig.ortb2Fragments.global.site.ext.data.mobian).to.deep.equal(risk);
57
66
  });
58
67
  });
59
68
 
60
- it('should return medium_risk when server responds with garm_medium_risk', function () {
69
+ it('should return unknown risk when garm_risk is not present', function () {
61
70
  ajaxStub = sinon.stub(ajax, 'ajaxBuilder').returns(function(url, callbacks) {
62
- callbacks.success({
63
- garm_no_risk: false,
64
- garm_low_risk: false,
65
- garm_medium_risk: true,
66
- garm_high_risk: false
67
- });
71
+ callbacks.success(JSON.stringify({
72
+ sentiment_neutral: true
73
+ }));
68
74
  });
69
75
 
70
76
  return mobianBrandSafetySubmodule.getBidRequestData(bidReqConfig, {}, {}).then((risk) => {
71
- expect(risk).to.have.property('mobianGarmRisk');
72
- expect(risk['mobianGarmRisk']).to.equal('medium_risk');
77
+ expect(risk).to.deep.equal({
78
+ risk: 'unknown',
79
+ contentCategories: [],
80
+ sentiment: 'neutral',
81
+ emotions: []
82
+ });
73
83
  expect(bidReqConfig.ortb2Fragments.global.site.ext.data.mobian).to.deep.equal(risk);
74
84
  });
75
85
  });
76
86
 
77
- it('should return high_risk when server responds with garm_high_risk', function () {
87
+ it('should return empty object when server response is not valid JSON', function () {
78
88
  ajaxStub = sinon.stub(ajax, 'ajaxBuilder').returns(function(url, callbacks) {
79
- callbacks.success({
80
- garm_no_risk: false,
81
- garm_low_risk: false,
82
- garm_medium_risk: false,
83
- garm_high_risk: true
84
- });
89
+ callbacks.success('unexpected output not even of the right type');
85
90
  });
86
-
91
+ const originalConfig = JSON.parse(JSON.stringify(bidReqConfig));
87
92
  return mobianBrandSafetySubmodule.getBidRequestData(bidReqConfig, {}, {}).then((risk) => {
88
- expect(risk).to.have.property('mobianGarmRisk');
89
- expect(risk['mobianGarmRisk']).to.equal('high_risk');
90
- expect(bidReqConfig.ortb2Fragments.global.site.ext.data.mobian).to.deep.equal(risk);
93
+ expect(risk).to.deep.equal({});
94
+ // Check that bidReqConfig hasn't been modified
95
+ expect(bidReqConfig).to.deep.equal(originalConfig);
91
96
  });
92
97
  });
93
98
 
94
- it('should return unknown when server response is not of the expected shape', function () {
99
+ it('should handle error response', function () {
95
100
  ajaxStub = sinon.stub(ajax, 'ajaxBuilder').returns(function(url, callbacks) {
96
- callbacks.success('unexpected output not even of the right type');
101
+ callbacks.error();
97
102
  });
98
103
 
99
104
  return mobianBrandSafetySubmodule.getBidRequestData(bidReqConfig, {}, {}).then((risk) => {
100
- expect(risk).to.have.property('mobianGarmRisk');
101
- expect(risk['mobianGarmRisk']).to.equal('unknown');
102
- expect(bidReqConfig.ortb2Fragments.global.site.ext.data.mobian).to.deep.equal(risk);
105
+ expect(risk).to.deep.equal({});
103
106
  });
104
107
  });
105
108
  });
@@ -405,7 +405,7 @@ describe('Nexx360 bid adapter tests', function () {
405
405
  expect(requestContent.imp[1].tagid).to.be.eql('div-2-abcd');
406
406
  expect(requestContent.imp[1].ext.adUnitCode).to.be.eql('div-2-abcd');
407
407
  expect(requestContent.imp[1].ext.divId).to.be.eql('div-2-abcd');
408
- expect(requestContent.ext.bidderVersion).to.be.eql('4.1');
408
+ expect(requestContent.ext.bidderVersion).to.be.eql('4.2');
409
409
  expect(requestContent.ext.source).to.be.eql('prebid.js');
410
410
  });
411
411
 
@@ -0,0 +1,103 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from 'modules/ownadxBidAdapter.js';
3
+
4
+ describe('ownadx', function () {
5
+ const METHOD = 'POST';
6
+ const URL = 'https://pbs-js.prebid-ownadx.com/publisher/prebid/9/1231?token=3f2941af4f7e446f9a19ca6045f8cff4';
7
+
8
+ const bidRequest = {
9
+ bidder: 'ownadx',
10
+ params: {
11
+ tokenId: '3f2941af4f7e446f9a19ca6045f8cff4',
12
+ sspId: '1231',
13
+ seatId: '9'
14
+ },
15
+ mediaTypes: {
16
+ banner: {
17
+ sizes: [[300, 250], [300, 600]]
18
+ }
19
+ },
20
+ sizes: [
21
+ [300, 250],
22
+ [300, 600]
23
+ ],
24
+ bidId: 'bid-id-123456',
25
+ adUnitCode: 'ad-unit-code-1',
26
+ bidderRequestId: 'bidder-request-id-123456',
27
+ auctionId: 'auction-id-123456',
28
+ transactionId: 'transaction-id-123456'
29
+ };
30
+
31
+ describe('isBidRequestValid', function () {
32
+ it('should return true where required params found', function () {
33
+ expect(spec.isBidRequestValid(bidRequest)).to.equal(true);
34
+ });
35
+ });
36
+
37
+ describe('buildRequests', function () {
38
+ let bidderRequest = {
39
+ refererInfo: {
40
+ page: 'https://www.test.com',
41
+ reachedTop: true,
42
+ isAmp: false,
43
+ numIframes: 0,
44
+ stack: [
45
+ 'https://www.test.com'
46
+ ],
47
+ canonicalUrl: null
48
+ }
49
+ };
50
+
51
+ it('should build correct POST request for banner bid', function () {
52
+ const request = spec.buildRequests([bidRequest], bidderRequest)[0];
53
+ expect(request).to.be.an('object');
54
+ expect(request.method).to.equal('POST');
55
+ expect(request.url).to.equal('https://pbs-js.prebid-ownadx.com/publisher/prebid/9/1231?token=3f2941af4f7e446f9a19ca6045f8cff4');
56
+ const payload = request.data;
57
+ expect(payload).to.be.an('object');
58
+ expect(payload.sizes).to.be.an('array');
59
+ expect(payload.slotBidId).to.be.a('string');
60
+ expect(payload.PageUrl).to.be.a('string');
61
+ expect(payload.mediaChannel).to.be.a('number');
62
+ });
63
+ });
64
+
65
+ describe('interpretResponse', function () {
66
+ let serverResponse = {
67
+ body: {
68
+ tokenId: '3f2941af4f7e446f9a19ca6045f8cff4',
69
+ bid: 'BID-XXXX-XXXX',
70
+ width: '300',
71
+ height: '250',
72
+ cpm: '0.7',
73
+ adm: '<html><h1>Ad from OwnAdX</h1></html>',
74
+ slotBidId: 'bid-id-123456',
75
+ adType: '1',
76
+ statusText: 'Success'
77
+ }
78
+ };
79
+
80
+ let expectedResponse = [{
81
+ token: '3f2941af4f7e446f9a19ca6045f8cff4',
82
+ requestId: 'bid-id-123456',
83
+ cpm: '0.7',
84
+ currency: 'USD',
85
+ aType: '1',
86
+ netRevenue: false,
87
+ width: '300',
88
+ height: '250',
89
+ creativeId: 0,
90
+ ttl: 300,
91
+ ad: '<html><h1>Ad from OwnAdX</h1></html>',
92
+ meta: {
93
+ mediaType: 'banner',
94
+ advertiserDomains: []
95
+ }
96
+ }];
97
+
98
+ it('should correctly interpret valid banner response', function () {
99
+ let result = spec.interpretResponse(serverResponse);
100
+ expect(result).to.deep.equal(expectedResponse);
101
+ });
102
+ });
103
+ });
@@ -2974,6 +2974,24 @@ describe('PubMatic adapter', function () {
2974
2974
  expect(data.device).to.include.any.keys('connectiontype');
2975
2975
  }
2976
2976
  });
2977
+
2978
+ it('should send imp.pmp in request if pmp json is present in adUnit ortb2Imp object', function () {
2979
+ let originalBidRequests = utils.deepClone(bidRequests);
2980
+ originalBidRequests[0].ortb2Imp.pmp = {
2981
+ 'private_auction': 0,
2982
+ 'deals': [{ 'id': '5678' }]
2983
+ }
2984
+ const bidRequest = spec.buildRequests(originalBidRequests);
2985
+ let data = JSON.parse(bidRequest.data);
2986
+ expect(data.imp[0].pmp).to.exist.and.to.be.an('object');
2987
+ })
2988
+
2989
+ it('should not send imp.pmp in request if pmp json is not present in adUnit ortb2Imp object', function () {
2990
+ let originalBidRequests = utils.deepClone(bidRequests);
2991
+ const bidRequest = spec.buildRequests(originalBidRequests);
2992
+ let data = JSON.parse(bidRequest.data);
2993
+ expect(data.imp[0].pmp).to.deep.equal(undefined);
2994
+ })
2977
2995
  });
2978
2996
 
2979
2997
  it('Request params dctr check', function () {
@@ -346,6 +346,41 @@ describe('sharethrough adapter spec', function () {
346
346
 
347
347
  expect(openRtbReq.user.ext.eids).to.deep.equal([]);
348
348
  });
349
+
350
+ it('should add ORTB2 device data to the request', () => {
351
+ const bidderRequestWithOrtb2Device = {
352
+ ...bidderRequest,
353
+ ...{
354
+ ortb2: {
355
+ device: {
356
+ w: 980,
357
+ h: 1720,
358
+ dnt: 0,
359
+ ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1',
360
+ language: 'en',
361
+ devicetype: 1,
362
+ make: 'Apple',
363
+ model: 'iPhone 12 Pro Max',
364
+ os: 'iOS',
365
+ osv: '17.4',
366
+ },
367
+ },
368
+ },
369
+ };
370
+
371
+ const [request] = spec.buildRequests(bidRequests, bidderRequestWithOrtb2Device);
372
+
373
+ expect(request.data.device.w).to.equal(bidderRequestWithOrtb2Device.ortb2.device.w);
374
+ expect(request.data.device.h).to.equal(bidderRequestWithOrtb2Device.ortb2.device.h);
375
+ expect(request.data.device.dnt).to.equal(bidderRequestWithOrtb2Device.ortb2.device.dnt);
376
+ expect(request.data.device.ua).to.equal(bidderRequestWithOrtb2Device.ortb2.device.ua);
377
+ expect(request.data.device.language).to.equal(bidderRequestWithOrtb2Device.ortb2.device.language);
378
+ expect(request.data.device.devicetype).to.equal(bidderRequestWithOrtb2Device.ortb2.device.devicetype);
379
+ expect(request.data.device.make).to.equal(bidderRequestWithOrtb2Device.ortb2.device.make);
380
+ expect(request.data.device.model).to.equal(bidderRequestWithOrtb2Device.ortb2.device.model);
381
+ expect(request.data.device.os).to.equal(bidderRequestWithOrtb2Device.ortb2.device.os);
382
+ expect(request.data.device.osv).to.equal(bidderRequestWithOrtb2Device.ortb2.device.osv);
383
+ });
349
384
  });
350
385
 
351
386
  describe('no referer provided', () => {