prebid.js 7.20.0 → 7.22.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 (189) hide show
  1. package/dist/1plusXRtdProvider.js +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/adxcgBidAdapter.js +1 -1
  9. package/dist/adyoulikeBidAdapter.js +1 -1
  10. package/dist/ajaBidAdapter.js +1 -1
  11. package/dist/amxBidAdapter.js +1 -1
  12. package/dist/amxIdSystem.js +1 -1
  13. package/dist/appierAnalyticsAdapter.js +1 -1
  14. package/dist/appnexusBidAdapter.js +1 -1
  15. package/dist/asoBidAdapter.js +1 -1
  16. package/dist/audiencerunBidAdapter.js +1 -1
  17. package/dist/axonixBidAdapter.js +1 -1
  18. package/dist/bidglassBidAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bluebillywigBidAdapter.js +1 -1
  21. package/dist/bridgewellBidAdapter.js +1 -1
  22. package/dist/brightMountainMediaBidAdapter.js +1 -1
  23. package/dist/brightcomBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/concertBidAdapter.js +1 -1
  26. package/dist/connectadBidAdapter.js +1 -1
  27. package/dist/consumableBidAdapter.js +1 -1
  28. package/dist/conversantBidAdapter.js +1 -1
  29. package/dist/craftBidAdapter.js +1 -1
  30. package/dist/criteoBidAdapter.js +1 -1
  31. package/dist/dacIdSystem.js +1 -1
  32. package/dist/dspxBidAdapter.js +1 -1
  33. package/dist/eplanningBidAdapter.js +1 -1
  34. package/dist/finativeBidAdapter.js +1 -1
  35. package/dist/freewheel-sspBidAdapter.js +1 -1
  36. package/dist/ftrackIdSystem.js +1 -1
  37. package/dist/glimpseBidAdapter.js +1 -1
  38. package/dist/gmosspBidAdapter.js +1 -1
  39. package/dist/goldbachBidAdapter.js +1 -1
  40. package/dist/gridBidAdapter.js +1 -1
  41. package/dist/gridNMBidAdapter.js +1 -1
  42. package/dist/gumgumBidAdapter.js +1 -1
  43. package/dist/h12mediaBidAdapter.js +1 -1
  44. package/dist/iasRtdProvider.js +1 -1
  45. package/dist/id5IdSystem.js +1 -1
  46. package/dist/impactifyBidAdapter.js +1 -1
  47. package/dist/improvedigitalBidAdapter.js +1 -1
  48. package/dist/inmarBidAdapter.js +1 -1
  49. package/dist/insticatorBidAdapter.js +1 -1
  50. package/dist/ixBidAdapter.js +1 -1
  51. package/dist/jixieBidAdapter.js +1 -1
  52. package/dist/justpremiumBidAdapter.js +1 -1
  53. package/dist/konduitAnalyticsAdapter.js +1 -1
  54. package/dist/kueezBidAdapter.js +1 -1
  55. package/dist/lassoBidAdapter.js +1 -1
  56. package/dist/lifestreetBidAdapter.js +1 -1
  57. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  58. package/dist/logicadBidAdapter.js +1 -1
  59. package/dist/loglyliftBidAdapter.js +1 -1
  60. package/dist/magniteAnalyticsAdapter.js +1 -1
  61. package/dist/malltvAnalyticsAdapter.js +1 -1
  62. package/dist/marsmediaBidAdapter.js +1 -1
  63. package/dist/mediafuseBidAdapter.js +1 -1
  64. package/dist/mediakeysBidAdapter.js +1 -1
  65. package/dist/medianetAnalyticsAdapter.js +1 -1
  66. package/dist/medianetBidAdapter.js +1 -1
  67. package/dist/mediasquareBidAdapter.js +1 -1
  68. package/dist/mgidBidAdapter.js +1 -1
  69. package/dist/minutemediaBidAdapter.js +1 -1
  70. package/dist/not-for-prod/prebid.js +127 -127
  71. package/dist/oguryBidAdapter.js +1 -1
  72. package/dist/onetagBidAdapter.js +1 -1
  73. package/dist/ooloAnalyticsAdapter.js +1 -1
  74. package/dist/outbrainBidAdapter.js +1 -1
  75. package/dist/parrableIdSystem.js +1 -1
  76. package/dist/pixfutureBidAdapter.js +1 -1
  77. package/dist/prebid-core.js +1 -1
  78. package/dist/prebidServerBidAdapter.js +1 -1
  79. package/dist/publinkIdSystem.js +1 -1
  80. package/dist/pubmaticBidAdapter.js +1 -1
  81. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  82. package/dist/pubwiseBidAdapter.js +1 -1
  83. package/dist/pulsepointBidAdapter.js +1 -1
  84. package/dist/pxyzBidAdapter.js +1 -1
  85. package/dist/quantcastBidAdapter.js +1 -1
  86. package/dist/readpeakBidAdapter.js +1 -1
  87. package/dist/relaidoBidAdapter.js +1 -1
  88. package/dist/rhythmoneBidAdapter.js +1 -1
  89. package/dist/riseBidAdapter.js +1 -1
  90. package/dist/rubiconAnalyticsAdapter.js +1 -1
  91. package/dist/rubiconBidAdapter.js +1 -1
  92. package/dist/seedingAllianceBidAdapter.js +1 -1
  93. package/dist/seedtagBidAdapter.js +1 -1
  94. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  95. package/dist/sharethroughBidAdapter.js +1 -1
  96. package/dist/shinezBidAdapter.js +1 -1
  97. package/dist/smaatoBidAdapter.js +1 -1
  98. package/dist/smartadserverBidAdapter.js +1 -1
  99. package/dist/smartxBidAdapter.js +1 -1
  100. package/dist/smilewantedBidAdapter.js +1 -1
  101. package/dist/sonobiBidAdapter.js +1 -1
  102. package/dist/sovrnAnalyticsAdapter.js +1 -1
  103. package/dist/sovrnBidAdapter.js +1 -1
  104. package/dist/sspBCBidAdapter.js +1 -1
  105. package/dist/sublimeBidAdapter.js +1 -1
  106. package/dist/synacormediaBidAdapter.js +1 -1
  107. package/dist/targetVideoBidAdapter.js +1 -1
  108. package/dist/teadsBidAdapter.js +1 -1
  109. package/dist/trionBidAdapter.js +1 -1
  110. package/dist/tripleliftBidAdapter.js +1 -1
  111. package/dist/ttdBidAdapter.js +1 -1
  112. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  113. package/dist/underdogmediaBidAdapter.js +1 -1
  114. package/dist/undertoneBidAdapter.js +1 -1
  115. package/dist/userId.js +1 -1
  116. package/dist/vidazooBidAdapter.js +1 -1
  117. package/dist/videobyteBidAdapter.js +1 -1
  118. package/dist/visxBidAdapter.js +1 -1
  119. package/dist/vuukleBidAdapter.js +1 -1
  120. package/dist/weboramaRtdProvider.js +1 -1
  121. package/dist/widespaceBidAdapter.js +1 -1
  122. package/dist/winrBidAdapter.js +1 -1
  123. package/dist/yahoosspBidAdapter.js +1 -1
  124. package/dist/yieldmoBidAdapter.js +1 -1
  125. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  126. package/dist/yieldoneBidAdapter.js +1 -1
  127. package/integrationExamples/gpt/weboramaRtdProvider_example.html +10 -51
  128. package/modules/1plusXRtdProvider.js +32 -5
  129. package/modules/33acrossBidAdapter.js +18 -11
  130. package/modules/adyoulikeBidAdapter.js +12 -6
  131. package/modules/asoBidAdapter.js +11 -6
  132. package/modules/asoBidAdapter.md +5 -6
  133. package/modules/brightcomBidAdapter.js +30 -10
  134. package/modules/dacIdSystem.js +145 -27
  135. package/modules/dacIdSystem.md +7 -2
  136. package/modules/fledgeForGpt.md +101 -23
  137. package/modules/freewheel-sspBidAdapter.js +48 -7
  138. package/modules/freewheel-sspBidAdapter.md +1 -1
  139. package/modules/ftrackIdSystem.js +28 -9
  140. package/modules/gridBidAdapter.js +1 -0
  141. package/modules/iasRtdProvider.js +21 -6
  142. package/modules/iasRtdProvider.md +1 -1
  143. package/modules/ixBidAdapter.js +9 -4
  144. package/modules/medianetAnalyticsAdapter.js +26 -22
  145. package/modules/medianetBidAdapter.js +5 -1
  146. package/modules/mediasquareBidAdapter.js +42 -3
  147. package/modules/mgidBidAdapter.js +8 -1
  148. package/modules/oguryBidAdapter.js +6 -2
  149. package/modules/prebidServerBidAdapter/index.js +1 -1
  150. package/modules/pubmaticBidAdapter.js +27 -3
  151. package/modules/pubwiseBidAdapter.js +14 -12
  152. package/modules/pulsepointBidAdapter.js +11 -6
  153. package/modules/smaatoBidAdapter.js +54 -5
  154. package/modules/smaatoBidAdapter.md +78 -0
  155. package/modules/teadsBidAdapter.js +26 -8
  156. package/modules/ttdBidAdapter.js +8 -0
  157. package/modules/userId/eids.js +7 -11
  158. package/modules/weboramaRtdProvider.js +800 -643
  159. package/modules/weboramaRtdProvider.md +32 -0
  160. package/modules/yieldoneBidAdapter.js +7 -4
  161. package/package.json +3 -3
  162. package/src/adapters/bidderFactory.js +11 -9
  163. package/src/auction.js +3 -3
  164. package/test/spec/auctionmanager_spec.js +29 -20
  165. package/test/spec/modules/1plusXRtdProvider_spec.js +30 -14
  166. package/test/spec/modules/33acrossBidAdapter_spec.js +44 -1
  167. package/test/spec/modules/adyoulikeBidAdapter_spec.js +1 -1
  168. package/test/spec/modules/asoBidAdapter_spec.js +2 -2
  169. package/test/spec/modules/brightcomBidAdapter_spec.js +94 -1
  170. package/test/spec/modules/dacIdSystem_spec.js +93 -11
  171. package/test/spec/modules/eids_spec.js +11 -7
  172. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +25 -4
  173. package/test/spec/modules/ftrackIdSystem_spec.js +200 -90
  174. package/test/spec/modules/iasRtdProvider_spec.js +57 -1
  175. package/test/spec/modules/ixBidAdapter_spec.js +12 -0
  176. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +50 -8
  177. package/test/spec/modules/medianetBidAdapter_spec.js +76 -0
  178. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -2
  179. package/test/spec/modules/mgidBidAdapter_spec.js +50 -0
  180. package/test/spec/modules/oguryBidAdapter_spec.js +33 -17
  181. package/test/spec/modules/prebidServerBidAdapter_spec.js +24 -0
  182. package/test/spec/modules/pubmaticBidAdapter_spec.js +60 -5
  183. package/test/spec/modules/pubwiseBidAdapter_spec.js +6 -4
  184. package/test/spec/modules/pulsepointBidAdapter_spec.js +123 -0
  185. package/test/spec/modules/smaatoBidAdapter_spec.js +307 -36
  186. package/test/spec/modules/teadsBidAdapter_spec.js +119 -6
  187. package/test/spec/modules/weboramaRtdProvider_spec.js +382 -0
  188. package/test/spec/modules/yieldoneBidAdapter_spec.js +2 -3
  189. package/test/spec/unit/core/bidderFactory_spec.js +0 -4
@@ -418,6 +418,74 @@ describe('teadsBidAdapter', () => {
418
418
  });
419
419
  });
420
420
 
421
+ it('should add userAgentClientHints info to payload if available', function () {
422
+ const bidRequest = Object.assign({}, bidRequests[0], {
423
+ ortb2: {
424
+ device: {
425
+ sua: {
426
+ source: 2,
427
+ platform: {
428
+ brand: 'macOS',
429
+ version: [ '12', '4', '0' ]
430
+ },
431
+ browsers: [
432
+ {
433
+ brand: 'Chromium',
434
+ version: [ '106', '0', '5249', '119' ]
435
+ },
436
+ {
437
+ brand: 'Google Chrome',
438
+ version: [ '106', '0', '5249', '119' ]
439
+ },
440
+ {
441
+ brand: 'Not;A=Brand',
442
+ version: [ '99', '0', '0', '0' ]
443
+ }
444
+ ],
445
+ mobile: 0,
446
+ model: '',
447
+ bitness: '64',
448
+ architecture: 'x86'
449
+ }
450
+ }
451
+ }
452
+ });
453
+
454
+ const requestWithUserAgentClientHints = spec.buildRequests([bidRequest], bidderResquestDefault);
455
+ const payload = JSON.parse(requestWithUserAgentClientHints.data);
456
+
457
+ expect(payload.userAgentClientHints).to.exist;
458
+ expect(payload.userAgentClientHints).to.deep.equal({
459
+ source: 2,
460
+ platform: {
461
+ brand: 'macOS',
462
+ version: [ '12', '4', '0' ]
463
+ },
464
+ browsers: [
465
+ {
466
+ brand: 'Chromium',
467
+ version: [ '106', '0', '5249', '119' ]
468
+ },
469
+ {
470
+ brand: 'Google Chrome',
471
+ version: [ '106', '0', '5249', '119' ]
472
+ },
473
+ {
474
+ brand: 'Not;A=Brand',
475
+ version: [ '99', '0', '0', '0' ]
476
+ }
477
+ ],
478
+ mobile: 0,
479
+ model: '',
480
+ bitness: '64',
481
+ architecture: 'x86'
482
+ }
483
+ );
484
+
485
+ const defaultRequest = spec.buildRequests(bidRequests, bidderResquestDefault);
486
+ expect(JSON.parse(defaultRequest.data).userAgentClientHints).to.not.exist;
487
+ });
488
+
421
489
  it('should use good mediaTypes video sizes', function() {
422
490
  const mediaTypesVideoSizes = {
423
491
  'mediaTypes': {
@@ -555,34 +623,79 @@ describe('teadsBidAdapter', () => {
555
623
  })
556
624
 
557
625
  describe('First-party cookie Teads ID', function () {
558
- it('should not add firstPartyCookieTeadsId param to payload if cookies are not enabled', function () {
626
+ it('should not add firstPartyCookieTeadsId param to payload if cookies are not enabled' +
627
+ ' and teads user id not available', function () {
559
628
  cookiesAreEnabledStub.returns(false);
560
629
 
561
- const request = spec.buildRequests([baseBidRequest], bidderResquestDefault);
630
+ const bidRequest = {
631
+ ...baseBidRequest,
632
+ userId: {
633
+ pubcid: 'publisherFirstPartyViewerId-id'
634
+ }
635
+ };
636
+
637
+ const request = spec.buildRequests([bidRequest], bidderResquestDefault);
562
638
  const payload = JSON.parse(request.data);
563
639
 
564
640
  expect(payload).not.to.have.property('firstPartyCookieTeadsId');
565
641
  });
566
642
 
567
- it('should not add firstPartyCookieTeadsId param to payload if first-party cookie is not available', function () {
643
+ it('should not add firstPartyCookieTeadsId param to payload if cookies are enabled ' +
644
+ 'but first-party cookie and teads user id are not available', function () {
568
645
  cookiesAreEnabledStub.returns(true);
569
646
  getCookieStub.withArgs('_tfpvi').returns(undefined);
570
647
 
571
- const request = spec.buildRequests([baseBidRequest], bidderResquestDefault);
648
+ const bidRequest = {
649
+ ...baseBidRequest,
650
+ userId: {
651
+ pubcid: 'publisherFirstPartyViewerId-id'
652
+ }
653
+ };
654
+
655
+ const request = spec.buildRequests([bidRequest], bidderResquestDefault);
572
656
  const payload = JSON.parse(request.data);
573
657
 
574
658
  expect(payload).not.to.have.property('firstPartyCookieTeadsId');
575
659
  });
576
660
 
577
- it('should add firstPartyCookieTeadsId param to payload if first-party cookie is available', function () {
661
+ it('should add firstPartyCookieTeadsId from cookie if it\'s available ' +
662
+ 'and teads user id is not', function () {
578
663
  cookiesAreEnabledStub.returns(true);
579
664
  getCookieStub.withArgs('_tfpvi').returns('my-teads-id');
580
665
 
581
- const request = spec.buildRequests([baseBidRequest], bidderResquestDefault);
666
+ const bidRequest = {
667
+ ...baseBidRequest,
668
+ userId: {
669
+ pubcid: 'publisherFirstPartyViewerId-id'
670
+ }
671
+ };
672
+
673
+ const request = spec.buildRequests([bidRequest], bidderResquestDefault);
674
+
582
675
  const payload = JSON.parse(request.data);
583
676
 
584
677
  expect(payload.firstPartyCookieTeadsId).to.equal('my-teads-id');
585
678
  });
679
+
680
+ it('should add firstPartyCookieTeadsId from user id module if it\'s available ' +
681
+ 'even if cookie is available too', function () {
682
+ cookiesAreEnabledStub.returns(true);
683
+ getCookieStub.withArgs('_tfpvi').returns('my-teads-id');
684
+
685
+ const bidRequest = {
686
+ ...baseBidRequest,
687
+ userId: {
688
+ pubcid: 'publisherFirstPartyViewerId-id',
689
+ teadsId: 'teadsId-fake-id'
690
+ }
691
+ };
692
+
693
+ const request = spec.buildRequests([bidRequest], bidderResquestDefault);
694
+
695
+ const payload = JSON.parse(request.data);
696
+
697
+ expect(payload.firstPartyCookieTeadsId).to.equal('teadsId-fake-id');
698
+ });
586
699
  });
587
700
  });
588
701
 
@@ -153,6 +153,289 @@ describe('weboramaRtdProvider', function() {
153
153
  });
154
154
  });
155
155
 
156
+ it('should use asset id when available and set gam targeting and send to bidders by default', function() {
157
+ let onDataResponse = {};
158
+ const moduleConfig = {
159
+ params: {
160
+ weboCtxConf: {
161
+ token: 'foo',
162
+ assetID: 'datasource:docId',
163
+ targetURL: 'https://prebid.org',
164
+ onData: (data, meta) => {
165
+ onDataResponse = {
166
+ data: data,
167
+ meta: meta,
168
+ };
169
+ },
170
+ }
171
+ }
172
+ };
173
+ const data = {
174
+ webo_vctx: ['foo', 'bar'],
175
+ };
176
+ const adUnitCode = 'adunit1';
177
+ const reqBidsConfigObj = {
178
+ ortb2Fragments: {
179
+ global: {},
180
+ bidder: {}
181
+ },
182
+ adUnits: [{
183
+ code: adUnitCode,
184
+ bids: [{
185
+ bidder: 'smartadserver'
186
+ }, {
187
+ bidder: 'pubmatic'
188
+ }, {
189
+ bidder: 'appnexus'
190
+ }, {
191
+ bidder: 'rubicon'
192
+ }, {
193
+ bidder: 'other'
194
+ }]
195
+ }]
196
+ };
197
+
198
+ const onDoneSpy = sinon.spy();
199
+
200
+ expect(weboramaSubmodule.init(moduleConfig)).to.be.true;
201
+ weboramaSubmodule.getBidRequestData(reqBidsConfigObj, onDoneSpy, moduleConfig);
202
+
203
+ let request = server.requests[0];
204
+
205
+ expect(request.method).to.equal('GET');
206
+ expect(request.url).to.equal('https://ctx.weborama.com/api/document-profile?token=foo&assetId=datasource%3AdocId&url=https%3A%2F%2Fprebid.org&');
207
+ expect(request.withCredentials).to.be.false;
208
+
209
+ request.respond(200, responseHeader, JSON.stringify(data));
210
+
211
+ expect(onDoneSpy.calledOnce).to.be.true;
212
+
213
+ const targeting = weboramaSubmodule.getTargetingData([adUnitCode], moduleConfig);
214
+
215
+ expect(targeting).to.deep.equal({
216
+ 'adunit1': data,
217
+ });
218
+
219
+ expect(reqBidsConfigObj.adUnits[0].bids.length).to.equal(5);
220
+ expect(reqBidsConfigObj.adUnits[0].bids[0].params.target).to.equal('webo_vctx=foo;webo_vctx=bar');
221
+ expect(reqBidsConfigObj.adUnits[0].bids[1].params.dctr).to.equal('webo_vctx=foo,bar');
222
+ expect(reqBidsConfigObj.adUnits[0].bids[2].params.keywords).to.deep.equal(data);
223
+ expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({
224
+ inventory: data
225
+ });
226
+ expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({
227
+ site: {
228
+ ext: {
229
+ data: data
230
+ },
231
+ }
232
+ });
233
+ expect(onDataResponse).to.deep.equal({
234
+ data: data,
235
+ meta: {
236
+ user: false,
237
+ source: 'contextual',
238
+ isDefault: false,
239
+ },
240
+ });
241
+ });
242
+
243
+ it('should use asset id as callback when available and set gam targeting and send to bidders by default', function() {
244
+ let onDataResponse = {};
245
+ const moduleConfig = {
246
+ params: {
247
+ weboCtxConf: {
248
+ token: 'foo',
249
+ assetID: () => 'datasource:docId',
250
+ targetURL: 'https://prebid.org',
251
+ onData: (data, meta) => {
252
+ onDataResponse = {
253
+ data: data,
254
+ meta: meta,
255
+ };
256
+ },
257
+ }
258
+ }
259
+ };
260
+ const data = {
261
+ webo_vctx: ['foo', 'bar'],
262
+ };
263
+ const adUnitCode = 'adunit1';
264
+ const reqBidsConfigObj = {
265
+ ortb2Fragments: {
266
+ global: {},
267
+ bidder: {}
268
+ },
269
+ adUnits: [{
270
+ code: adUnitCode,
271
+ bids: [{
272
+ bidder: 'smartadserver'
273
+ }, {
274
+ bidder: 'pubmatic'
275
+ }, {
276
+ bidder: 'appnexus'
277
+ }, {
278
+ bidder: 'rubicon'
279
+ }, {
280
+ bidder: 'other'
281
+ }]
282
+ }]
283
+ };
284
+
285
+ const onDoneSpy = sinon.spy();
286
+
287
+ expect(weboramaSubmodule.init(moduleConfig)).to.be.true;
288
+ weboramaSubmodule.getBidRequestData(reqBidsConfigObj, onDoneSpy, moduleConfig);
289
+
290
+ let request = server.requests[0];
291
+
292
+ expect(request.method).to.equal('GET');
293
+ expect(request.url).to.equal('https://ctx.weborama.com/api/document-profile?token=foo&assetId=datasource%3AdocId&url=https%3A%2F%2Fprebid.org&');
294
+ expect(request.withCredentials).to.be.false;
295
+
296
+ request.respond(200, responseHeader, JSON.stringify(data));
297
+
298
+ expect(onDoneSpy.calledOnce).to.be.true;
299
+
300
+ const targeting = weboramaSubmodule.getTargetingData([adUnitCode], moduleConfig);
301
+
302
+ expect(targeting).to.deep.equal({
303
+ 'adunit1': data,
304
+ });
305
+
306
+ expect(reqBidsConfigObj.adUnits[0].bids.length).to.equal(5);
307
+ expect(reqBidsConfigObj.adUnits[0].bids[0].params.target).to.equal('webo_vctx=foo;webo_vctx=bar');
308
+ expect(reqBidsConfigObj.adUnits[0].bids[1].params.dctr).to.equal('webo_vctx=foo,bar');
309
+ expect(reqBidsConfigObj.adUnits[0].bids[2].params.keywords).to.deep.equal(data);
310
+ expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({
311
+ inventory: data
312
+ });
313
+ expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({
314
+ site: {
315
+ ext: {
316
+ data: data
317
+ },
318
+ }
319
+ });
320
+ expect(onDataResponse).to.deep.equal({
321
+ data: data,
322
+ meta: {
323
+ user: false,
324
+ source: 'contextual',
325
+ isDefault: false,
326
+ },
327
+ });
328
+ });
329
+
330
+ it('should handle exception from asset id callback', function() {
331
+ let onDataResponse = {};
332
+ const moduleConfig = {
333
+ params: {
334
+ weboCtxConf: {
335
+ token: 'foo',
336
+ assetID: () => {
337
+ throw new Error('ops');
338
+ },
339
+ targetURL: 'https://prebid.org',
340
+ onData: (data, meta) => {
341
+ onDataResponse = {
342
+ data: data,
343
+ meta: meta,
344
+ };
345
+ },
346
+ }
347
+ }
348
+ };
349
+ const adUnitCode = 'adunit1';
350
+ const reqBidsConfigObj = {
351
+ ortb2Fragments: {
352
+ global: {},
353
+ bidder: {}
354
+ },
355
+ adUnits: [{
356
+ code: adUnitCode,
357
+ bids: [{
358
+ bidder: 'smartadserver'
359
+ }, {
360
+ bidder: 'pubmatic'
361
+ }, {
362
+ bidder: 'appnexus'
363
+ }, {
364
+ bidder: 'rubicon'
365
+ }, {
366
+ bidder: 'other'
367
+ }]
368
+ }]
369
+ };
370
+
371
+ const onDoneSpy = sinon.spy();
372
+
373
+ expect(weboramaSubmodule.init(moduleConfig)).to.be.true;
374
+ weboramaSubmodule.getBidRequestData(reqBidsConfigObj, onDoneSpy, moduleConfig);
375
+
376
+ expect(server.requests.length).to.equal(0);
377
+
378
+ expect(onDoneSpy.calledOnce).to.be.true;
379
+
380
+ const targeting = weboramaSubmodule.getTargetingData([adUnitCode], moduleConfig);
381
+
382
+ expect(targeting).to.deep.equal({});
383
+ });
384
+
385
+ it('should handle case when callback return falsy value', function() {
386
+ let onDataResponse = {};
387
+ const moduleConfig = {
388
+ params: {
389
+ weboCtxConf: {
390
+ token: 'foo',
391
+ assetID: () => '',
392
+ targetURL: 'https://prebid.org',
393
+ onData: (data, meta) => {
394
+ onDataResponse = {
395
+ data: data,
396
+ meta: meta,
397
+ };
398
+ },
399
+ }
400
+ }
401
+ };
402
+
403
+ const adUnitCode = 'adunit1';
404
+ const reqBidsConfigObj = {
405
+ ortb2Fragments: {
406
+ global: {},
407
+ bidder: {}
408
+ },
409
+ adUnits: [{
410
+ code: adUnitCode,
411
+ bids: [{
412
+ bidder: 'smartadserver'
413
+ }, {
414
+ bidder: 'pubmatic'
415
+ }, {
416
+ bidder: 'appnexus'
417
+ }, {
418
+ bidder: 'rubicon'
419
+ }, {
420
+ bidder: 'other'
421
+ }]
422
+ }]
423
+ };
424
+
425
+ const onDoneSpy = sinon.spy();
426
+
427
+ expect(weboramaSubmodule.init(moduleConfig)).to.be.true;
428
+ weboramaSubmodule.getBidRequestData(reqBidsConfigObj, onDoneSpy, moduleConfig);
429
+
430
+ expect(server.requests.length).to.equal(0);
431
+
432
+ expect(onDoneSpy.calledOnce).to.be.true;
433
+
434
+ const targeting = weboramaSubmodule.getTargetingData([adUnitCode], moduleConfig);
435
+
436
+ expect(targeting).to.deep.equal({});
437
+ });
438
+
156
439
  describe('should set gam targeting and send to one specific bidder and multiple adunits', function() {
157
440
  const testcases = {
158
441
  'single string': 'appnexus',
@@ -1090,6 +1373,7 @@ describe('weboramaRtdProvider', function() {
1090
1373
  targeting: data,
1091
1374
  };
1092
1375
 
1376
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1093
1377
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1094
1378
  sandbox.stub(storage, 'getDataFromLocalStorage')
1095
1379
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1199,6 +1483,7 @@ describe('weboramaRtdProvider', function() {
1199
1483
  targeting: data,
1200
1484
  };
1201
1485
 
1486
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1202
1487
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1203
1488
  sandbox.stub(storage, 'getDataFromLocalStorage')
1204
1489
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1311,6 +1596,7 @@ describe('weboramaRtdProvider', function() {
1311
1596
  targeting: data,
1312
1597
  };
1313
1598
 
1599
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1314
1600
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1315
1601
  sandbox.stub(storage, 'getDataFromLocalStorage')
1316
1602
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1418,6 +1704,7 @@ describe('weboramaRtdProvider', function() {
1418
1704
  targeting: data,
1419
1705
  };
1420
1706
 
1707
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1421
1708
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1422
1709
  sandbox.stub(storage, 'getDataFromLocalStorage')
1423
1710
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1560,6 +1847,7 @@ describe('weboramaRtdProvider', function() {
1560
1847
  targeting: data,
1561
1848
  };
1562
1849
 
1850
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1563
1851
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1564
1852
  sandbox.stub(storage, 'getDataFromLocalStorage')
1565
1853
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1700,6 +1988,7 @@ describe('weboramaRtdProvider', function() {
1700
1988
  targeting: data,
1701
1989
  };
1702
1990
 
1991
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1703
1992
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1704
1993
  sandbox.stub(storage, 'getDataFromLocalStorage')
1705
1994
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1760,6 +2049,7 @@ describe('weboramaRtdProvider', function() {
1760
2049
  targeting: data,
1761
2050
  };
1762
2051
 
2052
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1763
2053
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1764
2054
  sandbox.stub(storage, 'getDataFromLocalStorage')
1765
2055
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -1859,6 +2149,7 @@ describe('weboramaRtdProvider', function() {
1859
2149
  }
1860
2150
  };
1861
2151
 
2152
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1862
2153
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
1863
2154
 
1864
2155
  const adUnitCode = 'adunit1';
@@ -1932,6 +2223,7 @@ describe('weboramaRtdProvider', function() {
1932
2223
  }
1933
2224
  };
1934
2225
 
2226
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
1935
2227
  sandbox.stub(storage, 'localStorageIsEnabled').returns(false);
1936
2228
 
1937
2229
  const adUnitCode = 'adunit1';
@@ -2029,6 +2321,7 @@ describe('weboramaRtdProvider', function() {
2029
2321
  targeting: data,
2030
2322
  };
2031
2323
 
2324
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2032
2325
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2033
2326
  sandbox.stub(storage, 'getDataFromLocalStorage')
2034
2327
  .withArgs(DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY)
@@ -2146,6 +2439,7 @@ describe('weboramaRtdProvider', function() {
2146
2439
  webo: data,
2147
2440
  };
2148
2441
 
2442
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2149
2443
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2150
2444
  sandbox.stub(storage, 'getDataFromLocalStorage')
2151
2445
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2254,6 +2548,7 @@ describe('weboramaRtdProvider', function() {
2254
2548
  webo: data,
2255
2549
  };
2256
2550
 
2551
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2257
2552
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2258
2553
  sandbox.stub(storage, 'getDataFromLocalStorage')
2259
2554
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2365,6 +2660,7 @@ describe('weboramaRtdProvider', function() {
2365
2660
  webo: data,
2366
2661
  };
2367
2662
 
2663
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2368
2664
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2369
2665
  sandbox.stub(storage, 'getDataFromLocalStorage')
2370
2666
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2471,6 +2767,7 @@ describe('weboramaRtdProvider', function() {
2471
2767
  webo: data,
2472
2768
  };
2473
2769
 
2770
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2474
2771
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2475
2772
  sandbox.stub(storage, 'getDataFromLocalStorage')
2476
2773
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2612,6 +2909,7 @@ describe('weboramaRtdProvider', function() {
2612
2909
  webo: data,
2613
2910
  };
2614
2911
 
2912
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2615
2913
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2616
2914
  sandbox.stub(storage, 'getDataFromLocalStorage')
2617
2915
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2751,6 +3049,7 @@ describe('weboramaRtdProvider', function() {
2751
3049
  webo: data,
2752
3050
  };
2753
3051
 
3052
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2754
3053
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2755
3054
  sandbox.stub(storage, 'getDataFromLocalStorage')
2756
3055
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2814,6 +3113,7 @@ describe('weboramaRtdProvider', function() {
2814
3113
  webo: data,
2815
3114
  };
2816
3115
 
3116
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2817
3117
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2818
3118
  sandbox.stub(storage, 'getDataFromLocalStorage')
2819
3119
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)
@@ -2912,6 +3212,7 @@ describe('weboramaRtdProvider', function() {
2912
3212
  }
2913
3213
  };
2914
3214
 
3215
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2915
3216
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
2916
3217
 
2917
3218
  const adUnitCode = 'adunit1';
@@ -2984,6 +3285,7 @@ describe('weboramaRtdProvider', function() {
2984
3285
  }
2985
3286
  };
2986
3287
 
3288
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
2987
3289
  sandbox.stub(storage, 'localStorageIsEnabled').returns(false);
2988
3290
 
2989
3291
  const adUnitCode = 'adunit1';
@@ -3044,6 +3346,85 @@ describe('weboramaRtdProvider', function() {
3044
3346
  });
3045
3347
  });
3046
3348
 
3349
+ it('should use default profile if has no local storage', function() {
3350
+ const defaultProfile = {
3351
+ lite_hobbies: ['sport', 'cinéma'],
3352
+ };
3353
+ let onDataResponse = {};
3354
+ const moduleConfig = {
3355
+ params: {
3356
+ sfbxLiteDataConf: {
3357
+ setPrebidTargeting: true,
3358
+ defaultProfile: defaultProfile,
3359
+ onData: (data, meta) => {
3360
+ onDataResponse = {
3361
+ data: data,
3362
+ meta: meta,
3363
+ };
3364
+ },
3365
+ }
3366
+ }
3367
+ };
3368
+
3369
+ sandbox.stub(storage, 'hasLocalStorage').returns(false);
3370
+
3371
+ const adUnitCode = 'adunit1';
3372
+ const reqBidsConfigObj = {
3373
+ ortb2Fragments: {
3374
+ global: {},
3375
+ bidder: {},
3376
+ },
3377
+ adUnits: [{
3378
+ code: adUnitCode,
3379
+ bids: [{
3380
+ bidder: 'smartadserver'
3381
+ }, {
3382
+ bidder: 'pubmatic'
3383
+ }, {
3384
+ bidder: 'appnexus'
3385
+ }, {
3386
+ bidder: 'rubicon'
3387
+ }, {
3388
+ bidder: 'other'
3389
+ }]
3390
+ }]
3391
+ };
3392
+ const onDoneSpy = sinon.spy();
3393
+
3394
+ expect(weboramaSubmodule.init(moduleConfig)).to.be.true;
3395
+ weboramaSubmodule.getBidRequestData(reqBidsConfigObj, onDoneSpy, moduleConfig);
3396
+
3397
+ expect(onDoneSpy.calledOnce).to.be.true;
3398
+
3399
+ const targeting = weboramaSubmodule.getTargetingData([adUnitCode], moduleConfig);
3400
+
3401
+ expect(targeting).to.deep.equal({
3402
+ 'adunit1': defaultProfile,
3403
+ });
3404
+
3405
+ expect(reqBidsConfigObj.adUnits[0].bids.length).to.equal(5);
3406
+ expect(reqBidsConfigObj.adUnits[0].bids[0].params.target).to.equal('lite_hobbies=sport;lite_hobbies=cinéma');
3407
+ expect(reqBidsConfigObj.adUnits[0].bids[1].params.dctr).to.equal('lite_hobbies=sport,cinéma');
3408
+ expect(reqBidsConfigObj.adUnits[0].bids[2].params.keywords).to.deep.equal(defaultProfile);
3409
+ expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({
3410
+ inventory: defaultProfile,
3411
+ });
3412
+ expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({
3413
+ site: {
3414
+ ext: {
3415
+ data: defaultProfile,
3416
+ },
3417
+ },
3418
+ });
3419
+ expect(onDataResponse).to.deep.equal({
3420
+ data: defaultProfile,
3421
+ meta: {
3422
+ user: false,
3423
+ source: 'lite',
3424
+ isDefault: true,
3425
+ },
3426
+ });
3427
+ });
3047
3428
  it('should be possible update profile from callbacks for a given bidder/adUnitCode', function() {
3048
3429
  let onDataResponse = {};
3049
3430
  const moduleConfig = {
@@ -3080,6 +3461,7 @@ describe('weboramaRtdProvider', function() {
3080
3461
  webo: data,
3081
3462
  };
3082
3463
 
3464
+ sandbox.stub(storage, 'hasLocalStorage').returns(true);
3083
3465
  sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3084
3466
  sandbox.stub(storage, 'getDataFromLocalStorage')
3085
3467
  .withArgs(DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY)