prebid.js 7.33.0 → 7.35.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 (219) hide show
  1. package/.devcontainer/devcontainer.json +2 -1
  2. package/.github/workflows/issue_tracker.yml +27 -16
  3. package/dist/33acrossBidAdapter.js +1 -1
  4. package/dist/33acrossIdSystem.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/admaticBidAdapter.js +1 -1
  9. package/dist/admixerBidAdapter.js +1 -1
  10. package/dist/adnuntiusBidAdapter.js +1 -1
  11. package/dist/adrelevantisBidAdapter.js +1 -1
  12. package/dist/adtrgtmeBidAdapter.js +1 -1
  13. package/dist/adxcgBidAdapter.js +1 -1
  14. package/dist/adyoulikeBidAdapter.js +1 -1
  15. package/dist/ajaBidAdapter.js +1 -1
  16. package/dist/amxBidAdapter.js +1 -1
  17. package/dist/amxIdSystem.js +1 -1
  18. package/dist/appierAnalyticsAdapter.js +1 -1
  19. package/dist/appnexusBidAdapter.js +1 -1
  20. package/dist/arcspanRtdProvider.js +1 -0
  21. package/dist/asoBidAdapter.js +1 -1
  22. package/dist/axonixBidAdapter.js +1 -1
  23. package/dist/bidglassBidAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bliinkBidAdapter.js +1 -1
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/chtnwBidAdapter.js +1 -1
  30. package/dist/concertBidAdapter.js +1 -1
  31. package/dist/connectadBidAdapter.js +1 -1
  32. package/dist/consentManagement.js +1 -1
  33. package/dist/consumableBidAdapter.js +1 -1
  34. package/dist/conversantBidAdapter.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/cwireBidAdapter.js +1 -1
  38. package/dist/dspxBidAdapter.js +1 -1
  39. package/dist/emx_digitalBidAdapter.js +1 -1
  40. package/dist/eplanningBidAdapter.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/glimpseBidAdapter.js +1 -1
  44. package/dist/gmosspBidAdapter.js +1 -1
  45. package/dist/goldbachBidAdapter.js +1 -1
  46. package/dist/gridBidAdapter.js +1 -1
  47. package/dist/gridNMBidAdapter.js +1 -1
  48. package/dist/gumgumBidAdapter.js +1 -1
  49. package/dist/h12mediaBidAdapter.js +1 -1
  50. package/dist/hadronIdSystem.js +1 -1
  51. package/dist/holidBidAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/improvedigitalBidAdapter.js +1 -1
  54. package/dist/inmarBidAdapter.js +1 -1
  55. package/dist/insticatorBidAdapter.js +1 -1
  56. package/dist/ixBidAdapter.js +1 -1
  57. package/dist/justpremiumBidAdapter.js +1 -1
  58. package/dist/kargoBidAdapter.js +1 -1
  59. package/dist/konduitAnalyticsAdapter.js +1 -1
  60. package/dist/kueezBidAdapter.js +1 -1
  61. package/dist/kueezRtbBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/lotamePanoramaIdSystem.js +1 -1
  68. package/dist/magniteAnalyticsAdapter.js +1 -1
  69. package/dist/malltvAnalyticsAdapter.js +1 -1
  70. package/dist/marsmediaBidAdapter.js +1 -1
  71. package/dist/mediafuseBidAdapter.js +1 -1
  72. package/dist/mediasquareBidAdapter.js +1 -1
  73. package/dist/mgidBidAdapter.js +1 -1
  74. package/dist/minutemediaBidAdapter.js +1 -1
  75. package/dist/nextMillenniumBidAdapter.js +1 -1
  76. package/dist/nexx360BidAdapter.js +1 -1
  77. package/dist/not-for-prod/prebid.js +140 -149
  78. package/dist/oguryBidAdapter.js +1 -1
  79. package/dist/onetagBidAdapter.js +1 -1
  80. package/dist/ooloAnalyticsAdapter.js +1 -1
  81. package/dist/openxBidAdapter.js +1 -1
  82. package/dist/ortbConverter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/permutiveRtdProvider.js +1 -1
  86. package/dist/pixfutureBidAdapter.js +1 -1
  87. package/dist/prebid-core.js +1 -1
  88. package/dist/prebidServerBidAdapter.js +1 -1
  89. package/dist/priceFloors.js +1 -1
  90. package/dist/publinkIdSystem.js +1 -1
  91. package/dist/pubmaticBidAdapter.js +1 -1
  92. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  93. package/dist/pulsepointBidAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/riseBidAdapter.js +1 -1
  100. package/dist/rubiconAnalyticsAdapter.js +1 -1
  101. package/dist/rubiconBidAdapter.js +1 -1
  102. package/dist/seedingAllianceBidAdapter.js +1 -1
  103. package/dist/seedtagBidAdapter.js +1 -1
  104. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  105. package/dist/sharethroughBidAdapter.js +1 -1
  106. package/dist/shinezBidAdapter.js +1 -1
  107. package/dist/smaatoBidAdapter.js +1 -1
  108. package/dist/smartadserverBidAdapter.js +1 -1
  109. package/dist/smartxBidAdapter.js +1 -1
  110. package/dist/smartytechBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/sublimeBidAdapter.js +1 -1
  117. package/dist/synacormediaBidAdapter.js +1 -1
  118. package/dist/taboolaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/trionBidAdapter.js +1 -1
  122. package/dist/tripleliftBidAdapter.js +1 -1
  123. package/dist/ttdBidAdapter.js +1 -1
  124. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  125. package/dist/uid2IdSystem.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/vidazooBidAdapter.js +1 -1
  129. package/dist/videobyteBidAdapter.js +1 -1
  130. package/dist/visxBidAdapter.js +1 -1
  131. package/dist/vuukleBidAdapter.js +1 -1
  132. package/dist/widespaceBidAdapter.js +1 -1
  133. package/dist/winrBidAdapter.js +1 -1
  134. package/dist/yahoosspBidAdapter.js +1 -1
  135. package/dist/yieldmoBidAdapter.js +1 -1
  136. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  137. package/dist/zeta_global_sspBidAdapter.js +1 -1
  138. package/dist/zeusPrimeRtdProvider.js +4 -14
  139. package/integrationExamples/gpt/hello_world.html +0 -0
  140. package/libraries/ortbConverter/processors/default.js +19 -1
  141. package/modules/.submodules.json +1 -0
  142. package/modules/admaticBidAdapter.js +2 -1
  143. package/modules/admixerBidAdapter.js +26 -4
  144. package/modules/adnuntiusBidAdapter.js +36 -38
  145. package/modules/adyoulikeBidAdapter.js +2 -0
  146. package/modules/arcspanRtdProvider.js +73 -0
  147. package/modules/arcspanRtdProvider.md +11 -0
  148. package/modules/bliinkBidAdapter.js +1 -1
  149. package/modules/consentManagement.js +33 -5
  150. package/modules/consumableBidAdapter.js +20 -2
  151. package/modules/criteoBidAdapter.js +1 -1
  152. package/modules/cwireBidAdapter.js +169 -242
  153. package/modules/cwireBidAdapter.md +15 -14
  154. package/modules/emx_digitalBidAdapter.js +9 -2
  155. package/modules/hadronIdSystem.js +37 -32
  156. package/modules/holidBidAdapter.js +9 -4
  157. package/modules/kargoBidAdapter.js +5 -1
  158. package/modules/lotamePanoramaIdSystem.js +9 -1
  159. package/modules/nextMillenniumBidAdapter.js +19 -9
  160. package/modules/nexx360BidAdapter.js +1 -2
  161. package/modules/onetagBidAdapter.js +12 -1
  162. package/modules/openxBidAdapter.js +5 -0
  163. package/modules/outbrainBidAdapter.js +103 -6
  164. package/modules/permutiveRtdProvider.js +17 -12
  165. package/modules/prebidServerBidAdapter/index.js +14 -1
  166. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -1
  167. package/modules/priceFloors.js +7 -8
  168. package/modules/pulsepointBidAdapter.js +2 -0
  169. package/modules/seedingAllianceBidAdapter.js +129 -116
  170. package/modules/smartadserverBidAdapter.js +39 -28
  171. package/modules/smartyadsBidAdapter.md +9 -0
  172. package/modules/smartytechBidAdapter.js +67 -10
  173. package/modules/smartytechBidAdapter.md +44 -33
  174. package/modules/sonobiBidAdapter.js +17 -10
  175. package/modules/taboolaBidAdapter.js +2 -1
  176. package/modules/tripleliftBidAdapter.js +4 -0
  177. package/modules/vidazooBidAdapter.js +56 -22
  178. package/modules/zeta_global_sspBidAdapter.js +15 -0
  179. package/modules/zeusPrimeRtdProvider.js +3 -323
  180. package/modules/zeusPrimeRtdProvider.md +3 -0
  181. package/package.json +1 -1
  182. package/src/adloader.js +2 -1
  183. package/src/auction.js +2 -11
  184. package/src/prebid.js +8 -0
  185. package/src/utils/cpm.js +17 -0
  186. package/test/spec/modules/admixerBidAdapter_spec.js +140 -60
  187. package/test/spec/modules/adnuntiusBidAdapter_spec.js +120 -120
  188. package/test/spec/modules/adyoulikeBidAdapter_spec.js +3 -0
  189. package/test/spec/modules/arcspanRtdProvider_spec.js +187 -0
  190. package/test/spec/modules/bliinkBidAdapter_spec.js +7 -7
  191. package/test/spec/modules/consentManagement_spec.js +49 -1
  192. package/test/spec/modules/consumableBidAdapter_spec.js +46 -0
  193. package/test/spec/modules/cwireBidAdapter_spec.js +249 -335
  194. package/test/spec/modules/emx_digitalBidAdapter_spec.js +30 -1
  195. package/test/spec/modules/hadronIdSystem_spec.js +4 -6
  196. package/test/spec/modules/holidBidAdapter_spec.js +29 -0
  197. package/test/spec/modules/kargoBidAdapter_spec.js +32 -0
  198. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +16 -10
  199. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +14 -2
  200. package/test/spec/modules/nexx360BidAdapter_spec.js +0 -4
  201. package/test/spec/modules/onetagBidAdapter_spec.js +43 -0
  202. package/test/spec/modules/openxBidAdapter_spec.js +41 -0
  203. package/test/spec/modules/openxOrtbBidAdapter_spec.js +41 -0
  204. package/test/spec/modules/outbrainBidAdapter_spec.js +182 -18
  205. package/test/spec/modules/prebidServerBidAdapter_spec.js +138 -0
  206. package/test/spec/modules/pulsepointBidAdapter_spec.js +11 -1
  207. package/test/spec/modules/seedingAllianceAdapter_spec.js +66 -23
  208. package/test/spec/modules/smartadserverBidAdapter_spec.js +116 -5
  209. package/test/spec/modules/smartytechBidAdapter_spec.js +172 -14
  210. package/test/spec/modules/sonobiBidAdapter_spec.js +2 -1
  211. package/test/spec/modules/taboolaBidAdapter_spec.js +12 -3
  212. package/test/spec/modules/tripleliftBidAdapter_spec.js +13 -0
  213. package/test/spec/modules/userId_spec.js +19 -14
  214. package/test/spec/modules/vidazooBidAdapter_spec.js +61 -22
  215. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +8 -0
  216. package/test/spec/ortbConverter/default_processors_spec.js +23 -0
  217. package/test/spec/unit/pbjs_api_spec.js +14 -0
  218. package/test/spec/unit/utils/cpm_spec.js +64 -0
  219. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +0 -410
@@ -1,7 +1,7 @@
1
- import {expect} from 'chai';
2
- import {spec} from 'modules/outbrainBidAdapter.js';
3
- import {config} from 'src/config.js';
4
- import {server} from 'test/mocks/xhr';
1
+ import { expect } from 'chai';
2
+ import { spec } from 'modules/outbrainBidAdapter.js';
3
+ import { config } from 'src/config.js';
4
+ import { server } from 'test/mocks/xhr';
5
5
  import { createEidsArray } from 'modules/userId/eids.js';
6
6
 
7
7
  describe('Outbrain Adapter', function () {
@@ -45,6 +45,26 @@ describe('Outbrain Adapter', function () {
45
45
  ]
46
46
  }
47
47
 
48
+ const videoBidRequestParams = {
49
+ mediaTypes: {
50
+ video: {
51
+ playerSize: [[640, 480]],
52
+ mimes: ['video/mp4'],
53
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
54
+ playbackmethod: [1],
55
+ skip: 1,
56
+ api: [2],
57
+ minbitrate: 1000,
58
+ maxbitrate: 3000,
59
+ minduration: 3,
60
+ maxduration: 10,
61
+ startdelay: 2,
62
+ placement: 4,
63
+ linearity: 1
64
+ }
65
+ }
66
+ }
67
+
48
68
  describe('isBidRequestValid', function () {
49
69
  before(() => {
50
70
  config.setConfig({
@@ -93,6 +113,34 @@ describe('Outbrain Adapter', function () {
93
113
  }
94
114
  expect(spec.isBidRequestValid(bid)).to.equal(true)
95
115
  })
116
+ it('should succeed when bid contains video', function () {
117
+ const bid = {
118
+ bidder: 'outbrain',
119
+ params: {
120
+ publisher: {
121
+ id: 'publisher-id',
122
+ }
123
+ },
124
+ ...videoBidRequestParams,
125
+ }
126
+ expect(spec.isBidRequestValid(bid)).to.equal(true)
127
+ })
128
+ it('should fail when bid contains insufficient video information', function () {
129
+ const bid = {
130
+ bidder: 'outbrain',
131
+ params: {
132
+ publisher: {
133
+ id: 'publisher-id',
134
+ }
135
+ },
136
+ mediaTypes: {
137
+ video: {
138
+ context: 'outstream'
139
+ }
140
+ },
141
+ }
142
+ expect(spec.isBidRequestValid(bid)).to.equal(false)
143
+ })
96
144
  it('should fail if publisher id is not set', function () {
97
145
  const bid = {
98
146
  bidder: 'outbrain',
@@ -298,6 +346,61 @@ describe('Outbrain Adapter', function () {
298
346
  expect(res.data).to.deep.equal(JSON.stringify(expectedData))
299
347
  })
300
348
 
349
+ it('should build video request', function () {
350
+ const bidRequest = {
351
+ ...commonBidRequest,
352
+ ...videoBidRequestParams,
353
+ }
354
+ const expectedData = {
355
+ site: {
356
+ page: 'https://example.com/',
357
+ publisher: {
358
+ id: 'publisher-id'
359
+ }
360
+ },
361
+ device: {
362
+ ua: navigator.userAgent
363
+ },
364
+ source: {
365
+ fd: 1
366
+ },
367
+ cur: [
368
+ 'USD'
369
+ ],
370
+ imp: [
371
+ {
372
+ id: '1',
373
+ video: {
374
+ w: 640,
375
+ h: 480,
376
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
377
+ playbackmethod: [1],
378
+ mimes: ['video/mp4'],
379
+ skip: 1,
380
+ api: [2],
381
+ minbitrate: 1000,
382
+ maxbitrate: 3000,
383
+ minduration: 3,
384
+ maxduration: 10,
385
+ startdelay: 2,
386
+ placement: 4,
387
+ linearity: 1
388
+ }
389
+ }
390
+ ],
391
+ ext: {
392
+ prebid: {
393
+ channel: {
394
+ name: 'pbjs', version: '$prebid.version$'
395
+ }
396
+ }
397
+ }
398
+ }
399
+ const res = spec.buildRequests([bidRequest], commonBidderRequest)
400
+ expect(res.url).to.equal('https://bidder-url.com')
401
+ expect(res.data).to.deep.equal(JSON.stringify(expectedData))
402
+ })
403
+
301
404
  it('should pass optional parameters in request', function () {
302
405
  const bidRequest = {
303
406
  ...commonBidRequest,
@@ -390,7 +493,7 @@ describe('Outbrain Adapter', function () {
390
493
  ...commonBidRequest,
391
494
  ...nativeBidRequestParams,
392
495
  }
393
- config.setConfig({coppa: true})
496
+ config.setConfig({ coppa: true })
394
497
 
395
498
  const res = spec.buildRequests([bidRequest], commonBidderRequest)
396
499
  const resData = JSON.parse(res.data)
@@ -412,7 +515,7 @@ describe('Outbrain Adapter', function () {
412
515
  let res = spec.buildRequests([bidRequest], commonBidderRequest);
413
516
  const resData = JSON.parse(res.data)
414
517
  expect(resData.user.ext.eids).to.deep.equal([
415
- {source: 'liveramp.com', uids: [{id: 'id-value', atype: 3}]}
518
+ { source: 'liveramp.com', uids: [{ id: 'id-value', atype: 3 }] }
416
519
  ]);
417
520
  });
418
521
 
@@ -421,7 +524,7 @@ describe('Outbrain Adapter', function () {
421
524
  ...commonBidRequest,
422
525
  ...nativeBidRequestParams,
423
526
  }
424
- bidRequest.getFloor = function() {
527
+ bidRequest.getFloor = function () {
425
528
  return {
426
529
  currency: 'USD',
427
530
  floor: 1.23,
@@ -619,6 +722,67 @@ describe('Outbrain Adapter', function () {
619
722
  const res = spec.interpretResponse(serverResponse, request)
620
723
  expect(res).to.deep.equal(expectedRes)
621
724
  });
725
+
726
+ it('should interpret video response', function () {
727
+ const serverResponse = {
728
+ body: {
729
+ id: '123',
730
+ seatbid: [
731
+ {
732
+ bid: [
733
+ {
734
+ id: '111',
735
+ impid: '1',
736
+ price: 1.1,
737
+ adm: '\u003cVAST version="3.0"\u003e\u003cAd\u003e\u003cInLine\u003e\u003cAdSystem\u003ezemanta\u003c/AdSystem\u003e\u003cAdTitle\u003e1\u003c/AdTitle\u003e\u003cImpression\u003ehttp://win.com\u003c/Impression\u003e\u003cImpression\u003ehttp://example.com/imptracker\u003c/Impression\u003e\u003cCreatives\u003e\u003cCreative\u003e\u003cLinear\u003e\u003cDuration\u003e00:00:25\u003c/Duration\u003e\u003cTrackingEvents\u003e\u003cTracking event="start"\u003ehttp://example.com/start\u003c/Tracking\u003e\u003cTracking event="progress" offset="00:00:03"\u003ehttp://example.com/p3s\u003c/Tracking\u003e\u003c/TrackingEvents\u003e\u003cVideoClicks\u003e\u003cClickThrough\u003ehttp://link.com\u003c/ClickThrough\u003e\u003c/VideoClicks\u003e\u003cMediaFiles\u003e\u003cMediaFile delivery="progressive" type="video/mp4" bitrate="700" width="640" height="360"\u003ehttps://example.com/123_360p.mp4\u003c/MediaFile\u003e\u003c/MediaFiles\u003e\u003c/Linear\u003e\u003c/Creative\u003e\u003c/Creatives\u003e\u003c/InLine\u003e\u003c/Ad\u003e\u003c/VAST\u003e',
738
+ adid: '100',
739
+ cid: '5',
740
+ crid: '29998660',
741
+ cat: ['cat-1'],
742
+ adomain: [
743
+ 'example.com'
744
+ ],
745
+ nurl: 'http://example.com/win/${AUCTION_PRICE}'
746
+ }
747
+ ],
748
+ seat: '100',
749
+ group: 1
750
+ }
751
+ ],
752
+ bidid: '456',
753
+ cur: 'USD'
754
+ }
755
+ }
756
+ const request = {
757
+ bids: [
758
+ {
759
+ ...commonBidRequest,
760
+ ...videoBidRequestParams
761
+ }
762
+ ]
763
+ }
764
+ const expectedRes = [
765
+ {
766
+ requestId: request.bids[0].bidId,
767
+ cpm: 1.1,
768
+ creativeId: '29998660',
769
+ ttl: 360,
770
+ netRevenue: false,
771
+ currency: 'USD',
772
+ mediaType: 'video',
773
+ nurl: 'http://example.com/win/${AUCTION_PRICE}',
774
+ vastXml: '<VAST version=\"3.0\"><Ad><InLine><AdSystem>zemanta</AdSystem><AdTitle>1</AdTitle><Impression>http://win.com</Impression><Impression>http://example.com/imptracker</Impression><Creatives><Creative><Linear><Duration>00:00:25</Duration><TrackingEvents><Tracking event=\"start\">http://example.com/start</Tracking><Tracking event=\"progress\" offset=\"00:00:03\">http://example.com/p3s</Tracking></TrackingEvents><VideoClicks><ClickThrough>http://link.com</ClickThrough></VideoClicks><MediaFiles><MediaFile delivery=\"progressive\" type=\"video/mp4\" bitrate=\"700\" width=\"640\" height=\"360\">https://example.com/123_360p.mp4</MediaFile></MediaFiles></Linear></Creative></Creatives></InLine></Ad></VAST>',
775
+ meta: {
776
+ 'advertiserDomains': [
777
+ 'example.com'
778
+ ]
779
+ },
780
+ }
781
+ ]
782
+
783
+ const res = spec.interpretResponse(serverResponse, request)
784
+ expect(res).to.deep.equal(expectedRes)
785
+ });
622
786
  })
623
787
  })
624
788
 
@@ -637,41 +801,41 @@ describe('Outbrain Adapter', function () {
637
801
  })
638
802
 
639
803
  it('should return user sync if pixel enabled with outbrain config', function () {
640
- const ret = spec.getUserSyncs({pixelEnabled: true})
641
- expect(ret).to.deep.equal([{type: 'image', url: usersyncUrl}])
804
+ const ret = spec.getUserSyncs({ pixelEnabled: true })
805
+ expect(ret).to.deep.equal([{ type: 'image', url: usersyncUrl }])
642
806
  })
643
807
 
644
808
  it('should not return user sync if pixel disabled', function () {
645
- const ret = spec.getUserSyncs({pixelEnabled: false})
809
+ const ret = spec.getUserSyncs({ pixelEnabled: false })
646
810
  expect(ret).to.be.an('array').that.is.empty
647
811
  })
648
812
 
649
813
  it('should not return user sync if url is not set', function () {
650
814
  config.resetConfig()
651
- const ret = spec.getUserSyncs({pixelEnabled: true})
815
+ const ret = spec.getUserSyncs({ pixelEnabled: true })
652
816
  expect(ret).to.be.an('array').that.is.empty
653
817
  })
654
818
 
655
- it('should pass GDPR consent', function() {
656
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: true, consentString: 'foo'}, undefined)).to.deep.equal([{
819
+ it('should pass GDPR consent', function () {
820
+ expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: 'foo' }, undefined)).to.deep.equal([{
657
821
  type: 'image', url: `${usersyncUrl}?gdpr=1&gdpr_consent=foo`
658
822
  }]);
659
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: false, consentString: 'foo'}, undefined)).to.deep.equal([{
823
+ expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: false, consentString: 'foo' }, undefined)).to.deep.equal([{
660
824
  type: 'image', url: `${usersyncUrl}?gdpr=0&gdpr_consent=foo`
661
825
  }]);
662
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: true, consentString: undefined}, undefined)).to.deep.equal([{
826
+ expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: undefined }, undefined)).to.deep.equal([{
663
827
  type: 'image', url: `${usersyncUrl}?gdpr=1&gdpr_consent=`
664
828
  }]);
665
829
  });
666
830
 
667
- it('should pass US consent', function() {
831
+ it('should pass US consent', function () {
668
832
  expect(spec.getUserSyncs({ pixelEnabled: true }, {}, undefined, '1NYN')).to.deep.equal([{
669
833
  type: 'image', url: `${usersyncUrl}?us_privacy=1NYN`
670
834
  }]);
671
835
  });
672
836
 
673
- it('should pass GDPR and US consent', function() {
674
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: true, consentString: 'foo'}, '1NYN')).to.deep.equal([{
837
+ it('should pass GDPR and US consent', function () {
838
+ expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: 'foo' }, '1NYN')).to.deep.equal([{
675
839
  type: 'image', url: `${usersyncUrl}?gdpr=1&gdpr_consent=foo&us_privacy=1NYN`
676
840
  }]);
677
841
  });
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-trailing-spaces */
1
2
  import {expect} from 'chai';
2
3
  import {
3
4
  PrebidServer as Adapter,
@@ -1505,6 +1506,28 @@ describe('S2S Adapter', function () {
1505
1506
  });
1506
1507
  });
1507
1508
 
1509
+ it('site should not be present when app is present', function () {
1510
+ const _config = {
1511
+ s2sConfig: CONFIG,
1512
+ app: { bundle: 'com.test.app' },
1513
+ site: {
1514
+ publisher: {
1515
+ id: '1234',
1516
+ domain: 'test.com'
1517
+ },
1518
+ content: {
1519
+ language: 'en'
1520
+ }
1521
+ }
1522
+ };
1523
+
1524
+ config.setConfig(_config);
1525
+ adapter.callBids(REQUEST, BID_REQUESTS, addBidResponse, done, ajax);
1526
+ const requestBid = JSON.parse(server.requests[0].requestBody);
1527
+ expect(requestBid.site).to.not.exist;
1528
+ expect(requestBid.app).to.exist.and.to.be.a('object');
1529
+ });
1530
+
1508
1531
  it('adds appnexus aliases to request', function () {
1509
1532
  config.setConfig({ s2sConfig: CONFIG });
1510
1533
 
@@ -1703,6 +1726,121 @@ describe('S2S Adapter', function () {
1703
1726
  }]);
1704
1727
  });
1705
1728
 
1729
+ describe('filterSettings', function () {
1730
+ const getRequestBid = userSync => {
1731
+ let cookieSyncConfig = utils.deepClone(CONFIG);
1732
+ const s2sBidRequest = utils.deepClone(REQUEST);
1733
+ cookieSyncConfig.syncEndpoint = { p1Consent: 'https://prebid.adnxs.com/pbs/v1/cookie_sync' };
1734
+ s2sBidRequest.s2sConfig = cookieSyncConfig;
1735
+
1736
+ config.setConfig({ userSync, s2sConfig: cookieSyncConfig });
1737
+
1738
+ let bidRequest = utils.deepClone(BID_REQUESTS);
1739
+ adapter.callBids(s2sBidRequest, bidRequest, addBidResponse, done, ajax);
1740
+ return JSON.parse(server.requests[0].requestBody);
1741
+ }
1742
+
1743
+ it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and only the all key is present in userSync.filterSettings', function () {
1744
+ const userSync = {
1745
+ filterSettings: {
1746
+ all: {
1747
+ bidders: ['appnexus', 'rubicon', 'pubmatic'],
1748
+ filter: 'exclude'
1749
+ }
1750
+ }
1751
+ };
1752
+ const requestBid = getRequestBid(userSync);
1753
+
1754
+ expect(requestBid.filterSettings).to.deep.equal({
1755
+ 'image': {
1756
+ 'bidders': ['appnexus', 'rubicon', 'pubmatic'],
1757
+ 'filter': 'exclude'
1758
+ },
1759
+ 'iframe': {
1760
+ 'bidders': ['appnexus', 'rubicon', 'pubmatic'],
1761
+ 'filter': 'exclude'
1762
+ }
1763
+ });
1764
+ });
1765
+
1766
+ it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and only the iframe key is present in userSync.filterSettings', function () {
1767
+ const userSync = {
1768
+ filterSettings: {
1769
+ iframe: {
1770
+ bidders: ['rubicon', 'pubmatic'],
1771
+ filter: 'include'
1772
+ }
1773
+ }
1774
+ };
1775
+ const requestBid = getRequestBid(userSync);
1776
+
1777
+ expect(requestBid.filterSettings).to.deep.equal({
1778
+ 'image': {
1779
+ 'bidders': '*',
1780
+ 'filter': 'include'
1781
+ },
1782
+ 'iframe': {
1783
+ 'bidders': ['rubicon', 'pubmatic'],
1784
+ 'filter': 'include'
1785
+ }
1786
+ });
1787
+ });
1788
+
1789
+ it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and the image and iframe keys are both present in userSync.filterSettings', function () {
1790
+ const userSync = {
1791
+ filterSettings: {
1792
+ image: {
1793
+ bidders: ['triplelift', 'appnexus'],
1794
+ filter: 'include'
1795
+ },
1796
+ iframe: {
1797
+ bidders: ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
1798
+ filter: 'exclude'
1799
+ }
1800
+ }
1801
+ };
1802
+ const requestBid = getRequestBid(userSync);
1803
+
1804
+ expect(requestBid.filterSettings).to.deep.equal({
1805
+ 'image': {
1806
+ 'bidders': ['triplelift', 'appnexus'],
1807
+ 'filter': 'include'
1808
+ },
1809
+ 'iframe': {
1810
+ 'bidders': ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
1811
+ 'filter': 'exclude'
1812
+ }
1813
+ });
1814
+ });
1815
+
1816
+ it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and the all and iframe keys are both present in userSync.filterSettings', function () {
1817
+ const userSync = {
1818
+ filterSettings: {
1819
+ all: {
1820
+ bidders: ['triplelift', 'appnexus'],
1821
+ filter: 'include'
1822
+ },
1823
+ iframe: {
1824
+ bidders: ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
1825
+ filter: 'exclude'
1826
+ }
1827
+ }
1828
+ };
1829
+ const requestBid = getRequestBid(userSync);
1830
+
1831
+ expect(requestBid.filterSettings).to.deep.equal({
1832
+ 'image': {
1833
+ 'bidders': ['triplelift', 'appnexus'],
1834
+ 'filter': 'include'
1835
+ },
1836
+ 'iframe': {
1837
+ 'bidders': ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
1838
+ 'filter': 'exclude'
1839
+ }
1840
+ });
1841
+ });
1842
+ });
1843
+
1706
1844
  it('adds limit to the cookie_sync request if userSyncLimit is greater than 0', function () {
1707
1845
  let cookieSyncConfig = utils.deepClone(CONFIG);
1708
1846
  cookieSyncConfig.syncEndpoint = { p1Consent: 'https://prebid.adnxs.com/pbs/v1/cookie_sync' };
@@ -2,7 +2,6 @@
2
2
  import {expect} from 'chai';
3
3
  import {spec} from 'modules/pulsepointBidAdapter.js';
4
4
  import {deepClone} from 'src/utils.js';
5
- import { config } from 'src/config.js';
6
5
 
7
6
  describe('PulsePoint Adapter Tests', function () {
8
7
  const slotConfigs = [{
@@ -225,6 +224,8 @@ describe('PulsePoint Adapter Tests', function () {
225
224
  expect(ortbRequest.imp[1].banner).to.not.equal(null);
226
225
  expect(ortbRequest.imp[1].banner.w).to.equal(728);
227
226
  expect(ortbRequest.imp[1].banner.h).to.equal(90);
227
+ // tmax
228
+ expect(ortbRequest.tmax).to.equal(500);
228
229
  });
229
230
 
230
231
  it('Verify parse response', function () {
@@ -918,4 +919,13 @@ describe('PulsePoint Adapter Tests', function () {
918
919
  }
919
920
  });
920
921
  });
922
+
923
+ it('Verify bid request timeouts', function () {
924
+ const mkRequest = (bidderRequest) => spec.buildRequests(slotConfigs, bidderRequest).data;
925
+ // assert default is used when no bidderRequest.timeout value is available
926
+ expect(mkRequest(bidderRequest).tmax).to.equal(500)
927
+
928
+ // assert bidderRequest value is used when available
929
+ expect(mkRequest(Object.assign({}, { timeout: 6000 }, bidderRequest)).tmax).to.equal(6000)
930
+ });
921
931
  });
@@ -38,7 +38,7 @@ describe('SeedingAlliance adapter', function () {
38
38
  });
39
39
 
40
40
  it('should have default request structure', function () {
41
- let keys = 'site,device,cur,imp,user,regs'.split(',');
41
+ let keys = 'site,cur,imp,regs'.split(',');
42
42
  let validBidRequests = [{
43
43
  bidId: 'bidId',
44
44
  params: {}
@@ -60,14 +60,17 @@ describe('SeedingAlliance adapter', function () {
60
60
  assert.equal(request.id, validBidRequests[0].auctionId);
61
61
  });
62
62
 
63
- it('Verify the device', function () {
63
+ it('Verify the site url', function () {
64
+ let siteUrl = 'https://www.yourdomain.tld/your-directory/';
64
65
  let validBidRequests = [{
65
66
  bidId: 'bidId',
66
- params: {}
67
+ params: {
68
+ url: siteUrl
69
+ }
67
70
  }];
68
71
  let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data);
69
72
 
70
- assert.equal(request.device.ua, navigator.userAgent);
73
+ assert.equal(request.site.page, siteUrl);
71
74
  });
72
75
 
73
76
  it('Verify native asset ids', function () {
@@ -109,7 +112,7 @@ describe('SeedingAlliance adapter', function () {
109
112
  });
110
113
 
111
114
  describe('interpretResponse', function () {
112
- const goodResponse = {
115
+ const goodNativeResponse = {
113
116
  body: {
114
117
  cur: 'EUR',
115
118
  id: '4b516b80-886e-4ec0-82ae-9209e6d625fb',
@@ -136,51 +139,91 @@ describe('SeedingAlliance adapter', function () {
136
139
  ]
137
140
  }
138
141
  };
142
+
143
+ const goodBannerResponse = {
144
+ body: {
145
+ cur: 'EUR',
146
+ id: 'b4516b80-886e-4ec0-82ae-9209e6d625fb',
147
+ seatbid: [
148
+ {
149
+ seat: 'seedingAlliance',
150
+ bid: [{
151
+ adm: '<iframe src="https://domain.tld/cds/delivery?wp=0.90"></iframe>',
152
+ impid: 1,
153
+ price: 0.90,
154
+ h: 250,
155
+ w: 300
156
+ }]
157
+ }
158
+ ]
159
+ }
160
+ };
161
+
139
162
  const badResponse = { body: {
140
163
  cur: 'EUR',
141
164
  id: '4b516b80-886e-4ec0-82ae-9209e6d625fb',
142
165
  seatbid: []
143
166
  }};
144
167
 
145
- const bidRequest = {
168
+ const bidNativeRequest = {
146
169
  data: {},
147
- bids: [{ bidId: 'bidId1' }]
170
+ bidRequests: [{bidId: 'bidId1', nativeParams: {title: {required: true, len: 800}}}]
171
+ };
172
+
173
+ const bidBannerRequest = {
174
+ data: {},
175
+ bidRequests: [{bidId: 'bidId1', sizes: [300, 250]}]
148
176
  };
149
177
 
150
178
  it('should return null if body is missing or empty', function () {
151
- const result = spec.interpretResponse(badResponse, bidRequest);
179
+ const result = spec.interpretResponse(badResponse, bidNativeRequest);
152
180
  assert.equal(result.length, 0);
153
181
 
154
182
  delete badResponse.body
155
183
 
156
- const result1 = spec.interpretResponse(badResponse, bidRequest);
184
+ const result1 = spec.interpretResponse(badResponse, bidNativeRequest);
157
185
  assert.equal(result.length, 0);
158
186
  });
159
187
 
160
188
  it('should return the correct params', function () {
161
- const result = spec.interpretResponse(goodResponse, bidRequest);
162
- const bid = goodResponse.body.seatbid[0].bid[0];
163
-
164
- assert.deepEqual(result[0].currency, goodResponse.body.cur);
165
- assert.deepEqual(result[0].requestId, bidRequest.bids[0].bidId);
166
- assert.deepEqual(result[0].cpm, bid.price);
167
- assert.deepEqual(result[0].creativeId, bid.crid);
168
- assert.deepEqual(result[0].mediaType, 'native');
169
- assert.deepEqual(result[0].bidderCode, 'seedingAlliance');
189
+ const resultNative = spec.interpretResponse(goodNativeResponse, bidNativeRequest);
190
+ const bidNative = goodNativeResponse.body.seatbid[0].bid[0];
191
+
192
+ assert.deepEqual(resultNative[0].bidderCode, 'seedingAlliance');
193
+ assert.deepEqual(resultNative[0].currency, goodNativeResponse.body.cur);
194
+ assert.deepEqual(resultNative[0].requestId, bidNativeRequest.bidRequests[0].bidId);
195
+ assert.deepEqual(resultNative[0].cpm, bidNative.price);
196
+ assert.deepEqual(resultNative[0].creativeId, bidNative.crid);
197
+ assert.deepEqual(resultNative[0].mediaType, 'native');
198
+
199
+ const resultBanner = spec.interpretResponse(goodBannerResponse, bidBannerRequest);
200
+
201
+ assert.deepEqual(resultBanner[0].bidderCode, 'seedingAlliance');
202
+ assert.deepEqual(resultBanner[0].mediaType, 'banner');
203
+ assert.deepEqual(resultBanner[0].width, bidBannerRequest.bidRequests[0].sizes[0]);
204
+ assert.deepEqual(resultBanner[0].height, bidBannerRequest.bidRequests[0].sizes[1]);
170
205
  });
171
206
 
172
- it('should return the correct tracking links', function () {
173
- const result = spec.interpretResponse(goodResponse, bidRequest);
174
- const bid = goodResponse.body.seatbid[0].bid[0];
207
+ it('should return the correct native tracking links', function () {
208
+ const result = spec.interpretResponse(goodNativeResponse, bidNativeRequest);
209
+ const bid = goodNativeResponse.body.seatbid[0].bid[0];
175
210
  const regExpPrice = new RegExp('price=' + bid.price);
176
211
 
177
212
  result[0].native.clickTrackers.forEach(function (clickTracker) {
178
- assert.ok(clickTracker.search(regExpPrice) > -1);
213
+ assert.ok(clickTracker.search(regExpPrice) > -1);
179
214
  });
180
215
 
181
216
  result[0].native.impressionTrackers.forEach(function (impTracker) {
182
- assert.ok(impTracker.search(regExpPrice) > -1);
217
+ assert.ok(impTracker.search(regExpPrice) > -1);
183
218
  });
184
219
  });
220
+
221
+ it('should return the correct banner content', function () {
222
+ const result = spec.interpretResponse(goodBannerResponse, bidBannerRequest);
223
+ const bid = goodBannerResponse.body.seatbid[0].bid[0];
224
+ const regExpContent = new RegExp('<iframe.+?' + bid.price + '.+?</iframe>');
225
+
226
+ assert.ok(result[0].ad.search(regExpContent) > -1);
227
+ });
185
228
  });
186
229
  });