prebid.js 7.18.0 → 7.19.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 (197) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adfBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adqueryIdSystem.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adtrgtmeBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.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/axonixBidAdapter.js +1 -1
  17. package/dist/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +1 -1
  18. package/dist/bidglassBidAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bridgewellBidAdapter.js +1 -1
  21. package/dist/brightMountainMediaBidAdapter.js +1 -1
  22. package/dist/carodaBidAdapter.js +1 -1
  23. package/dist/cleanioRtdProvider.js +1 -1
  24. package/dist/colossussspBidAdapter.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/conversantAnalyticsAdapter.js +1 -0
  29. package/dist/conversantBidAdapter.js +1 -1
  30. package/dist/craftBidAdapter.js +1 -1
  31. package/dist/criteoBidAdapter.js +1 -1
  32. package/dist/debugging-standalone.js +1 -1
  33. package/dist/debugging.js +1 -1
  34. package/dist/dependencies.json +6 -0
  35. package/dist/dgkeywordRtdProvider.js +1 -1
  36. package/dist/dianomiBidAdapter.js +1 -1
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/enrichmentFpdModule.js +1 -1
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/finativeBidAdapter.js +1 -1
  41. package/dist/fpd.js +1 -0
  42. package/dist/glimpseBidAdapter.js +1 -1
  43. package/dist/gmosspBidAdapter.js +1 -1
  44. package/dist/goldbachBidAdapter.js +1 -1
  45. package/dist/gridBidAdapter.js +1 -1
  46. package/dist/gridNMBidAdapter.js +1 -1
  47. package/dist/gumgumBidAdapter.js +1 -1
  48. package/dist/h12mediaBidAdapter.js +1 -1
  49. package/dist/id5IdSystem.js +1 -1
  50. package/dist/improvedigitalBidAdapter.js +1 -1
  51. package/dist/inmarBidAdapter.js +1 -1
  52. package/dist/insticatorBidAdapter.js +1 -1
  53. package/dist/ixBidAdapter.js +1 -1
  54. package/dist/justpremiumBidAdapter.js +1 -1
  55. package/dist/konduitAnalyticsAdapter.js +1 -1
  56. package/dist/kueezBidAdapter.js +1 -1
  57. package/dist/lassoBidAdapter.js +1 -1
  58. package/dist/lifestreetBidAdapter.js +1 -1
  59. package/dist/liveIntentIdSystem.js +1 -1
  60. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  61. package/dist/logicadBidAdapter.js +1 -1
  62. package/dist/loglyliftBidAdapter.js +1 -1
  63. package/dist/malltvAnalyticsAdapter.js +1 -1
  64. package/dist/marsmediaBidAdapter.js +1 -1
  65. package/dist/mediafuseBidAdapter.js +1 -1
  66. package/dist/mediakeysBidAdapter.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/nativoBidAdapter.js +1 -1
  71. package/dist/not-for-prod/prebid.js +123 -121
  72. package/dist/oguryBidAdapter.js +1 -1
  73. package/dist/onetagBidAdapter.js +1 -1
  74. package/dist/ooloAnalyticsAdapter.js +1 -1
  75. package/dist/outbrainBidAdapter.js +1 -1
  76. package/dist/parrableIdSystem.js +1 -1
  77. package/dist/pixfutureBidAdapter.js +1 -1
  78. package/dist/prebid-core.js +1 -1
  79. package/dist/prebidServerBidAdapter.js +1 -1
  80. package/dist/publinkIdSystem.js +1 -1
  81. package/dist/pubmaticBidAdapter.js +1 -1
  82. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  83. package/dist/pxyzBidAdapter.js +1 -1
  84. package/dist/quantcastBidAdapter.js +1 -1
  85. package/dist/readpeakBidAdapter.js +1 -1
  86. package/dist/relaidoBidAdapter.js +1 -1
  87. package/dist/rhythmoneBidAdapter.js +1 -1
  88. package/dist/riseBidAdapter.js +1 -1
  89. package/dist/rubiconAnalyticsAdapter.js +1 -1
  90. package/dist/rubiconBidAdapter.js +1 -1
  91. package/dist/seedingAllianceBidAdapter.js +1 -1
  92. package/dist/seedtagBidAdapter.js +1 -1
  93. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  94. package/dist/sharethroughBidAdapter.js +1 -1
  95. package/dist/shinezBidAdapter.js +1 -1
  96. package/dist/smaatoBidAdapter.js +1 -1
  97. package/dist/smartadserverBidAdapter.js +1 -1
  98. package/dist/smartxBidAdapter.js +1 -1
  99. package/dist/smilewantedBidAdapter.js +1 -1
  100. package/dist/sonobiBidAdapter.js +1 -1
  101. package/dist/sovrnAnalyticsAdapter.js +1 -1
  102. package/dist/sovrnBidAdapter.js +1 -1
  103. package/dist/sspBCBidAdapter.js +1 -1
  104. package/dist/sublimeBidAdapter.js +1 -1
  105. package/dist/synacormediaBidAdapter.js +1 -1
  106. package/dist/taboolaBidAdapter.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/vidazooBidAdapter.js +1 -1
  116. package/dist/videobyteBidAdapter.js +1 -1
  117. package/dist/visxBidAdapter.js +1 -1
  118. package/dist/vuukleBidAdapter.js +1 -1
  119. package/dist/widespaceBidAdapter.js +1 -1
  120. package/dist/winrBidAdapter.js +1 -1
  121. package/dist/yahoosspBidAdapter.js +1 -1
  122. package/dist/yandexBidAdapter.js +1 -1
  123. package/dist/yieldmoBidAdapter.js +1 -1
  124. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  125. package/libraries/fpd/sua.js +98 -0
  126. package/modules/adfBidAdapter.js +1 -1
  127. package/modules/adkernelAdnBidAdapter.js +1 -0
  128. package/modules/adqueryIdSystem.js +8 -8
  129. package/modules/adxcgBidAdapter.js +1 -1
  130. package/modules/amxBidAdapter.js +1 -1
  131. package/modules/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +0 -0
  132. package/modules/{andBeyondMediaBidAdapter.md → beyondmediaBidAdapter.md} +1 -1
  133. package/modules/cleanioRtdProvider.js +3 -4
  134. package/modules/colossussspBidAdapter.js +2 -1
  135. package/modules/conversantAnalyticsAdapter.js +560 -0
  136. package/modules/conversantAnalyticsAdapter.md +47 -0
  137. package/modules/criteoBidAdapter.js +1 -1
  138. package/modules/debugging/bidInterceptor.js +2 -2
  139. package/modules/debugging/debugging.js +10 -2
  140. package/modules/dgkeywordRtdProvider.js +21 -3
  141. package/modules/dianomiBidAdapter.js +1 -1
  142. package/modules/enrichmentFpdModule.js +33 -14
  143. package/modules/finativeBidAdapter.js +1 -1
  144. package/modules/gridBidAdapter.js +187 -117
  145. package/modules/improvedigitalBidAdapter.js +2 -2
  146. package/modules/ixBidAdapter.js +94 -23
  147. package/modules/liveIntentIdSystem.js +39 -5
  148. package/modules/mediakeysBidAdapter.js +6 -1
  149. package/modules/mediakeysBidAdapter.md +50 -40
  150. package/modules/nativoBidAdapter.js +1 -1
  151. package/modules/prebidServerBidAdapter/index.js +44 -13
  152. package/modules/readpeakBidAdapter.js +1 -1
  153. package/modules/rubiconBidAdapter.js +2 -3
  154. package/modules/seedingAllianceBidAdapter.js +1 -1
  155. package/modules/sharethroughBidAdapter.js +1 -1
  156. package/modules/taboolaBidAdapter.js +1 -1
  157. package/modules/talkadsBidAdapter.js +1 -0
  158. package/modules/truereachBidAdapter.js +1 -0
  159. package/modules/ttdBidAdapter.js +1 -1
  160. package/modules/vuukleBidAdapter.js +34 -3
  161. package/modules/yahoosspBidAdapter.js +3 -1
  162. package/modules/yandexBidAdapter.js +31 -8
  163. package/package.json +2 -2
  164. package/src/adapterManager.js +2 -4
  165. package/src/cpmBucketManager.js +22 -3
  166. package/src/native.js +1 -5
  167. package/src/prebid.js +3 -3
  168. package/test/spec/cpmBucketManager_spec.js +239 -177
  169. package/test/spec/fpd/sua_spec.js +244 -0
  170. package/test/spec/modules/adfBidAdapter_spec.js +2 -3
  171. package/test/spec/modules/adqueryIdSystem_spec.js +0 -2
  172. package/test/spec/modules/adxcgBidAdapter_spec.js +2 -3
  173. package/test/spec/modules/amxBidAdapter_spec.js +3 -2
  174. package/test/spec/modules/{andBeyondMediaBidAdapter_spec.js → beyondmediaBidAdapter_spec.js} +1 -1
  175. package/test/spec/modules/colossussspBidAdapter_spec.js +4 -2
  176. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +963 -0
  177. package/test/spec/modules/debugging_mod_spec.js +9 -0
  178. package/test/spec/modules/dgkeywordRtdProvider_spec.js +83 -1
  179. package/test/spec/modules/dianomiBidAdapter_spec.js +2 -3
  180. package/test/spec/modules/enrichmentFpdModule_spec.js +50 -7
  181. package/test/spec/modules/fpdModule_spec.js +9 -0
  182. package/test/spec/modules/gridBidAdapter_spec.js +87 -31
  183. package/test/spec/modules/ixBidAdapter_spec.js +221 -2
  184. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +62 -8
  185. package/test/spec/modules/liveIntentIdSystem_spec.js +62 -8
  186. package/test/spec/modules/mediakeysBidAdapter_spec.js +20 -3
  187. package/test/spec/modules/nativoBidAdapter_spec.js +13 -2
  188. package/test/spec/modules/prebidServerBidAdapter_spec.js +159 -4
  189. package/test/spec/modules/seedtagBidAdapter_spec.js +15 -18
  190. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  191. package/test/spec/modules/taboolaBidAdapter_spec.js +2 -2
  192. package/test/spec/modules/ttdBidAdapter_spec.js +3 -3
  193. package/test/spec/modules/vuukleBidAdapter_spec.js +87 -0
  194. package/test/spec/modules/yahoosspBidAdapter_spec.js +3 -1
  195. package/test/spec/modules/yandexBidAdapter_spec.js +8 -5
  196. package/test/spec/native_spec.js +5 -0
  197. package/test/spec/unit/pbjs_api_spec.js +44 -0
@@ -2,7 +2,7 @@ import * as utils from 'src/utils.js';
2
2
  import { config } from 'src/config.js';
3
3
  import { expect } from 'chai';
4
4
  import { newBidder } from 'src/adapters/bidderFactory.js';
5
- import { spec, storage, ERROR_CODES } from '../../../modules/ixBidAdapter.js';
5
+ import { spec, storage, ERROR_CODES, FEATURE_TOGGLES, LOCAL_STORAGE_FEATURE_TOGGLES_KEY } from '../../../modules/ixBidAdapter.js';
6
6
  import { createEidsArray } from 'modules/userId/eids.js';
7
7
  import { deepAccess, deepClone } from '../../../src/utils.js';
8
8
 
@@ -1739,6 +1739,7 @@ describe('IndexexchangeAdapter', function () {
1739
1739
  expect(payload.source.ext.schain).to.deep.equal(SAMPLE_SCHAIN);
1740
1740
  expect(payload.imp).to.be.an('array');
1741
1741
  expect(payload.imp).to.have.lengthOf(1);
1742
+ expect(payload.source.tid).to.equal(DEFAULT_BANNER_VALID_BID[0].auctionId);
1742
1743
  });
1743
1744
 
1744
1745
  it('payload should have correct format and value for r.id when bidderRequestId is a number ', function () {
@@ -1767,7 +1768,7 @@ describe('IndexexchangeAdapter', function () {
1767
1768
 
1768
1769
  it('payload should not include schain when not provided', function () {
1769
1770
  const payload = JSON.parse(queryWithoutSchain.r);
1770
- expect(payload.source).to.not.exist; // source object currently only written for schain
1771
+ expect(payload.source.schain).to.not.exist; // source object currently only written for schain
1771
1772
  });
1772
1773
 
1773
1774
  it('impression should have correct format and value', function () {
@@ -3294,6 +3295,224 @@ describe('IndexexchangeAdapter', function () {
3294
3295
  });
3295
3296
  });
3296
3297
 
3298
+ describe('Features', () => {
3299
+ let localStorageValues = {};
3300
+ let sandbox = sinon.sandbox.create();
3301
+ let setDataInLocalStorageStub;
3302
+ let getDataFromLocalStorageStub;
3303
+ let removeDataFromLocalStorageStub;
3304
+ const serverResponse = {
3305
+ body: {
3306
+ ext: {
3307
+ features: {
3308
+ test: {
3309
+ activated: false
3310
+ }
3311
+ }
3312
+ }
3313
+ }
3314
+ };
3315
+
3316
+ beforeEach(() => {
3317
+ localStorageValues = {};
3318
+ sandbox = sinon.sandbox.create();
3319
+ setDataInLocalStorageStub = sandbox.stub(storage, 'setDataInLocalStorage').callsFake((key, value) => localStorageValues[key] = value);
3320
+ getDataFromLocalStorageStub = sandbox.stub(storage, 'getDataFromLocalStorage').callsFake((key) => localStorageValues[key]);
3321
+ removeDataFromLocalStorageStub = sandbox.stub(storage, 'removeDataFromLocalStorage').callsFake((key) => delete localStorageValues[key]);
3322
+ });
3323
+
3324
+ afterEach(() => {
3325
+ setDataInLocalStorageStub.restore();
3326
+ getDataFromLocalStorageStub.restore();
3327
+ removeDataFromLocalStorageStub.restore();
3328
+ serverResponse.body.ext.features = {
3329
+ test: {
3330
+ activated: false
3331
+ }
3332
+ };
3333
+ localStorageValues = {};
3334
+ sandbox.restore();
3335
+ });
3336
+
3337
+ it('should store features in internal cache', () => {
3338
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3339
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.false;
3340
+ });
3341
+
3342
+ it('should retrieve features from internal cache', () => {
3343
+ const feature = {
3344
+ ext: {
3345
+ features: {
3346
+ test: {
3347
+ activated: true
3348
+ }
3349
+ }
3350
+ }
3351
+ }
3352
+ FEATURE_TOGGLES.setFeatureToggles(feature);
3353
+ feature.ext.features.test.activated = false;
3354
+ FEATURE_TOGGLES.featureToggles = {
3355
+ features: feature.ext.features
3356
+ };
3357
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.false;
3358
+ });
3359
+
3360
+ it('should store features in localstorage when enabled', () => {
3361
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3362
+ serverResponse.body.ext.features.test.activated = true;
3363
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3364
+
3365
+ const lsData = JSON.parse(storage.getDataFromLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY));
3366
+ expect(lsData.features.test.activated).to.be.true;
3367
+ });
3368
+
3369
+ it('should retrive features from localstorage when enabled', () => {
3370
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3371
+ serverResponse.body.ext.features.test.activated = true;
3372
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3373
+ FEATURE_TOGGLES.featureToggles = {};
3374
+ FEATURE_TOGGLES.getFeatureToggles(LOCAL_STORAGE_FEATURE_TOGGLES_KEY);
3375
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.true;
3376
+ });
3377
+
3378
+ it('should remove features from after expiry', () => {
3379
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3380
+ const expiryTime = new Date();
3381
+ localStorageValues = {
3382
+ expiry: expiryTime.setHours(expiryTime.getHours() - 2),
3383
+ features: {
3384
+ test: {
3385
+ activated: true
3386
+ }
3387
+ }
3388
+ }
3389
+ FEATURE_TOGGLES.getFeatureToggles(LOCAL_STORAGE_FEATURE_TOGGLES_KEY);
3390
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.undefined;
3391
+ expect(FEATURE_TOGGLES.featureToggles).to.deep.equal({});
3392
+ });
3393
+
3394
+ it('should create POST request when pbjs_enable_post feature is active', () => {
3395
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3396
+ serverResponse.body.ext.features.pbjs_enable_post = {
3397
+ activated: true
3398
+ };
3399
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3400
+ const builtRequests = {
3401
+ banner: {
3402
+ request: spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0],
3403
+ siteId: DEFAULT_BANNER_VALID_BID[0].params.siteId
3404
+ },
3405
+ video: {
3406
+ request: spec.buildRequests(DEFAULT_VIDEO_VALID_BID, DEFAULT_OPTION)[0],
3407
+ siteId: DEFAULT_VIDEO_VALID_BID[0].params.siteId
3408
+ },
3409
+ native: {
3410
+ request: spec.buildRequests(DEFAULT_NATIVE_VALID_BID, DEFAULT_OPTION)[0],
3411
+ siteId: DEFAULT_NATIVE_VALID_BID[0].params.siteId
3412
+ }
3413
+ };
3414
+
3415
+ Object.keys(builtRequests).forEach((reqType) => {
3416
+ const request = builtRequests[reqType].request;
3417
+ const siteId = builtRequests[reqType].siteId;
3418
+ expect(request.method).to.equal('POST');
3419
+ expect(request.option.contentType).to.equal('text/plain');
3420
+ expect(request.url).to.be.equal(`${IX_SECURE_ENDPOINT}?s=${siteId}`);
3421
+ expect(request.data.r).to.be.undefined;
3422
+ expect(request.data.ac).to.be.undefined;
3423
+ expect(request.data.sd).to.be.undefined;
3424
+ expect(request.data.v).to.be.undefined;
3425
+ expect(request.data.nf).to.be.undefined;
3426
+ });
3427
+ });
3428
+
3429
+ it('should create GET request when pbjs_enable_post feature is disabled', () => {
3430
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3431
+ serverResponse.body.ext.features.pbjs_enable_post = {
3432
+ activated: false
3433
+ };
3434
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3435
+ const builtRequests = {
3436
+ banner: {
3437
+ request: spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0],
3438
+ siteId: DEFAULT_BANNER_VALID_BID[0].params.siteId
3439
+ },
3440
+ video: {
3441
+ request: spec.buildRequests(DEFAULT_VIDEO_VALID_BID, DEFAULT_OPTION)[0],
3442
+ siteId: DEFAULT_VIDEO_VALID_BID[0].params.siteId
3443
+ },
3444
+ native: {
3445
+ request: spec.buildRequests(DEFAULT_NATIVE_VALID_BID, DEFAULT_OPTION)[0],
3446
+ siteId: DEFAULT_NATIVE_VALID_BID[0].params.siteId
3447
+ }
3448
+ };
3449
+
3450
+ Object.keys(builtRequests).forEach((reqType) => {
3451
+ const request = builtRequests[reqType].request;
3452
+ const siteId = builtRequests[reqType].siteId;
3453
+ expect(request.method).to.equal('GET');
3454
+ expect(request.url).to.equal(IX_SECURE_ENDPOINT);
3455
+ expect(request.data.r).to.exist;
3456
+ expect(request.data.ac).to.equal('j');
3457
+ expect(request.data.sd).to.equal(1);
3458
+ expect(request.data.s).to.equal(siteId);
3459
+ if (reqType == 'video') {
3460
+ expect(request.data.nf).to.equal(1);
3461
+ }
3462
+
3463
+ if (reqType === 'native') {
3464
+ expect(request.data.v).to.be.undefined;
3465
+ }
3466
+ });
3467
+ });
3468
+
3469
+ it('should interpertResponse correctly when pbjs_enable_post feature is active', function () {
3470
+ serverResponse.body.ext.features.pbjs_enable_post = {
3471
+ activated: true
3472
+ };
3473
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3474
+ const postBiddderRequestData = {
3475
+ id: '345',
3476
+ imp: [
3477
+ {
3478
+ id: '1a2b3c4e',
3479
+ banner: {
3480
+ w: 300,
3481
+ h: 250,
3482
+ placement: 1
3483
+ }
3484
+ }
3485
+ ],
3486
+ site: {
3487
+ ref: 'https://ref.com/ref.html',
3488
+ page: 'https://page.com'
3489
+ },
3490
+ };
3491
+ const expectedParse = [
3492
+ {
3493
+ requestId: '1a2b3c4d',
3494
+ cpm: 1,
3495
+ creativeId: '12345',
3496
+ width: 300,
3497
+ height: 250,
3498
+ mediaType: 'banner',
3499
+ ad: '<a target="_blank" href="https://www.indexexchange.com"></a>',
3500
+ currency: 'USD',
3501
+ ttl: 300,
3502
+ netRevenue: true,
3503
+ meta: {
3504
+ networkId: 50,
3505
+ brandId: 303325,
3506
+ brandName: 'OECTA',
3507
+ advertiserDomains: ['www.abc.com']
3508
+ }
3509
+ }
3510
+ ];
3511
+ const result = spec.interpretResponse({ body: DEFAULT_BANNER_BID_RESPONSE }, { data: postBiddderRequestData, validBidRequests: [] });
3512
+ expect(result[0]).to.deep.equal(expectedParse[0]);
3513
+ });
3514
+ });
3515
+
3297
3516
  describe('LocalStorage error codes', () => {
3298
3517
  let TODAY = new Date().toISOString().slice(0, 10);
3299
3518
  const key = 'ixdiag';
@@ -47,7 +47,7 @@ describe('LiveIntentMinimalId', function() {
47
47
 
48
48
  it('should not return a decoded identifier when the unifiedId is not present in the value', function() {
49
49
  const result = liveIntentIdSubmodule.decode({ additionalData: 'data' });
50
- expect(result).to.be.undefined;
50
+ expect(result).to.be.eql({});
51
51
  });
52
52
 
53
53
  it('should initialize LiveConnect and send no data', function() {
@@ -64,7 +64,7 @@ describe('LiveIntentMinimalId', function() {
64
64
  let submoduleCallback = liveIntentIdSubmodule.getId({ params: {...defaultConfigParams.params, ...{'url': 'https://dummy.liveintent.com/idex'}} }).callback;
65
65
  submoduleCallback(callBackSpy);
66
66
  let request = server.requests[0];
67
- expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/prebid/89899');
67
+ expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/prebid/89899?resolve=nonId');
68
68
  request.respond(
69
69
  200,
70
70
  responseHeader,
@@ -85,7 +85,7 @@ describe('LiveIntentMinimalId', function() {
85
85
  } }).callback;
86
86
  submoduleCallback(callBackSpy);
87
87
  let request = server.requests[0];
88
- expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/rubicon/89899');
88
+ expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/rubicon/89899?resolve=nonId');
89
89
  request.respond(
90
90
  200,
91
91
  responseHeader,
@@ -100,7 +100,7 @@ describe('LiveIntentMinimalId', function() {
100
100
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
101
101
  submoduleCallback(callBackSpy);
102
102
  let request = server.requests[0];
103
- expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899');
103
+ expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?resolve=nonId');
104
104
  request.respond(
105
105
  200,
106
106
  responseHeader,
@@ -115,7 +115,7 @@ describe('LiveIntentMinimalId', function() {
115
115
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
116
116
  submoduleCallback(callBackSpy);
117
117
  let request = server.requests[0];
118
- expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899');
118
+ expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?resolve=nonId');
119
119
  request.respond(
120
120
  503,
121
121
  responseHeader,
@@ -132,7 +132,7 @@ describe('LiveIntentMinimalId', function() {
132
132
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
133
133
  submoduleCallback(callBackSpy);
134
134
  let request = server.requests[0];
135
- expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}`);
135
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}&resolve=nonId`);
136
136
  request.respond(
137
137
  200,
138
138
  responseHeader,
@@ -155,7 +155,7 @@ describe('LiveIntentMinimalId', function() {
155
155
  let submoduleCallback = liveIntentIdSubmodule.getId(configParams).callback;
156
156
  submoduleCallback(callBackSpy);
157
157
  let request = server.requests[0];
158
- expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}&_thirdPC=third-pc`);
158
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}&_thirdPC=third-pc&resolve=nonId`);
159
159
  request.respond(
160
160
  200,
161
161
  responseHeader,
@@ -177,7 +177,61 @@ describe('LiveIntentMinimalId', function() {
177
177
  let submoduleCallback = liveIntentIdSubmodule.getId(configParams).callback;
178
178
  submoduleCallback(callBackSpy);
179
179
  let request = server.requests[0];
180
- expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?_thirdPC=%7B%22key%22%3A%22value%22%7D');
180
+ expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?_thirdPC=%7B%22key%22%3A%22value%22%7D&resolve=nonId');
181
+ request.respond(
182
+ 200,
183
+ responseHeader,
184
+ JSON.stringify({})
185
+ );
186
+ expect(callBackSpy.calledOnce).to.be.true;
187
+ });
188
+
189
+ it('should decode a unifiedId to lipbId and remove it', function() {
190
+ const result = liveIntentIdSubmodule.decode({ unifiedId: 'data' });
191
+ expect(result).to.eql({'lipb': {'lipbid': 'data'}});
192
+ });
193
+
194
+ it('should decode a nonId to lipbId', function() {
195
+ const result = liveIntentIdSubmodule.decode({ nonId: 'data' });
196
+ expect(result).to.eql({'lipb': {'lipbid': 'data', 'nonId': 'data'}});
197
+ });
198
+
199
+ it('should resolve extra attributes', function() {
200
+ let callBackSpy = sinon.spy();
201
+ let submoduleCallback = liveIntentIdSubmodule.getId({ params: {
202
+ ...defaultConfigParams.params,
203
+ ...{ requestedAttributesOverrides: { 'foo': true, 'bar': false } }
204
+ } }).callback;
205
+ submoduleCallback(callBackSpy);
206
+ let request = server.requests[0];
207
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?resolve=nonId&resolve=foo`);
208
+ request.respond(
209
+ 200,
210
+ responseHeader,
211
+ JSON.stringify({})
212
+ );
213
+ expect(callBackSpy.calledOnce).to.be.true;
214
+ });
215
+
216
+ it('should decode a uid2 to a seperate object when present', function() {
217
+ const result = liveIntentIdSubmodule.decode({ nonId: 'foo', uid2: 'bar' });
218
+ expect(result).to.eql({'lipb': {'lipbid': 'foo', 'nonId': 'foo', 'uid2': 'bar'}, 'uid2': {'id': 'bar'}});
219
+ });
220
+
221
+ it('should decode values with uid2 but no nonId', function() {
222
+ const result = liveIntentIdSubmodule.decode({ uid2: 'bar' });
223
+ expect(result).to.eql({'uid2': {'id': 'bar'}});
224
+ });
225
+
226
+ it('should allow disabling nonId resolution', function() {
227
+ let callBackSpy = sinon.spy();
228
+ let submoduleCallback = liveIntentIdSubmodule.getId({ params: {
229
+ ...defaultConfigParams.params,
230
+ ...{ requestedAttributesOverrides: { 'nonId': false, 'uid2': true } }
231
+ } }).callback;
232
+ submoduleCallback(callBackSpy);
233
+ let request = server.requests[0];
234
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?resolve=uid2`);
181
235
  request.respond(
182
236
  200,
183
237
  responseHeader,
@@ -111,7 +111,7 @@ describe('LiveIntentId', function() {
111
111
 
112
112
  it('should not return a decoded identifier when the unifiedId is not present in the value', function() {
113
113
  const result = liveIntentIdSubmodule.decode({ additionalData: 'data' });
114
- expect(result).to.be.undefined;
114
+ expect(result).to.be.eql({});
115
115
  });
116
116
 
117
117
  it('should fire an event when decode', function() {
@@ -133,7 +133,7 @@ describe('LiveIntentId', function() {
133
133
  let submoduleCallback = liveIntentIdSubmodule.getId({ params: {...defaultConfigParams.params, ...{'url': 'https://dummy.liveintent.com/idex'}} }).callback;
134
134
  submoduleCallback(callBackSpy);
135
135
  let request = server.requests[1];
136
- expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/prebid/89899');
136
+ expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/prebid/89899?resolve=nonId');
137
137
  request.respond(
138
138
  204,
139
139
  responseHeader
@@ -153,7 +153,7 @@ describe('LiveIntentId', function() {
153
153
  } }).callback;
154
154
  submoduleCallback(callBackSpy);
155
155
  let request = server.requests[1];
156
- expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/rubicon/89899');
156
+ expect(request.url).to.be.eq('https://dummy.liveintent.com/idex/rubicon/89899?resolve=nonId');
157
157
  request.respond(
158
158
  200,
159
159
  responseHeader,
@@ -168,7 +168,7 @@ describe('LiveIntentId', function() {
168
168
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
169
169
  submoduleCallback(callBackSpy);
170
170
  let request = server.requests[1];
171
- expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899');
171
+ expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?resolve=nonId');
172
172
  request.respond(
173
173
  200,
174
174
  responseHeader,
@@ -183,7 +183,7 @@ describe('LiveIntentId', function() {
183
183
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
184
184
  submoduleCallback(callBackSpy);
185
185
  let request = server.requests[1];
186
- expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899');
186
+ expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?resolve=nonId');
187
187
  request.respond(
188
188
  503,
189
189
  responseHeader,
@@ -200,7 +200,7 @@ describe('LiveIntentId', function() {
200
200
  let submoduleCallback = liveIntentIdSubmodule.getId(defaultConfigParams).callback;
201
201
  submoduleCallback(callBackSpy);
202
202
  let request = server.requests[1];
203
- expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}`);
203
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}&resolve=nonId`);
204
204
  request.respond(
205
205
  200,
206
206
  responseHeader,
@@ -223,7 +223,7 @@ describe('LiveIntentId', function() {
223
223
  let submoduleCallback = liveIntentIdSubmodule.getId(configParams).callback;
224
224
  submoduleCallback(callBackSpy);
225
225
  let request = server.requests[1];
226
- expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}&_thirdPC=third-pc`);
226
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?duid=${oldCookie}&_thirdPC=third-pc&resolve=nonId`);
227
227
  request.respond(
228
228
  200,
229
229
  responseHeader,
@@ -245,7 +245,7 @@ describe('LiveIntentId', function() {
245
245
  let submoduleCallback = liveIntentIdSubmodule.getId(configParams).callback;
246
246
  submoduleCallback(callBackSpy);
247
247
  let request = server.requests[1];
248
- expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?_thirdPC=%7B%22key%22%3A%22value%22%7D');
248
+ expect(request.url).to.be.eq('https://idx.liadm.com/idex/prebid/89899?_thirdPC=%7B%22key%22%3A%22value%22%7D&resolve=nonId');
249
249
  request.respond(
250
250
  200,
251
251
  responseHeader,
@@ -259,4 +259,58 @@ describe('LiveIntentId', function() {
259
259
  liveIntentIdSubmodule.getId(defaultConfigParams);
260
260
  expect(imgStub.getCall(0).args[0]).to.match(/.*ae=.+/);
261
261
  });
262
+
263
+ it('should decode a unifiedId to lipbId and remove it', function() {
264
+ const result = liveIntentIdSubmodule.decode({ unifiedId: 'data' });
265
+ expect(result).to.eql({'lipb': {'lipbid': 'data'}});
266
+ });
267
+
268
+ it('should decode a nonId to lipbId', function() {
269
+ const result = liveIntentIdSubmodule.decode({ nonId: 'data' });
270
+ expect(result).to.eql({'lipb': {'lipbid': 'data', 'nonId': 'data'}});
271
+ });
272
+
273
+ it('should resolve extra attributes', function() {
274
+ let callBackSpy = sinon.spy();
275
+ let submoduleCallback = liveIntentIdSubmodule.getId({ params: {
276
+ ...defaultConfigParams.params,
277
+ ...{ requestedAttributesOverrides: { 'foo': true, 'bar': false } }
278
+ } }).callback;
279
+ submoduleCallback(callBackSpy);
280
+ let request = server.requests[1];
281
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?resolve=nonId&resolve=foo`);
282
+ request.respond(
283
+ 200,
284
+ responseHeader,
285
+ JSON.stringify({})
286
+ );
287
+ expect(callBackSpy.calledOnce).to.be.true;
288
+ });
289
+
290
+ it('should decode a uid2 to a seperate object when present', function() {
291
+ const result = liveIntentIdSubmodule.decode({ nonId: 'foo', uid2: 'bar' });
292
+ expect(result).to.eql({'lipb': {'lipbid': 'foo', 'nonId': 'foo', 'uid2': 'bar'}, 'uid2': {'id': 'bar'}});
293
+ });
294
+
295
+ it('should decode values with uid2 but no nonId', function() {
296
+ const result = liveIntentIdSubmodule.decode({ uid2: 'bar' });
297
+ expect(result).to.eql({'uid2': {'id': 'bar'}});
298
+ });
299
+
300
+ it('should allow disabling nonId resolution', function() {
301
+ let callBackSpy = sinon.spy();
302
+ let submoduleCallback = liveIntentIdSubmodule.getId({ params: {
303
+ ...defaultConfigParams.params,
304
+ ...{ requestedAttributesOverrides: { 'nonId': false, 'uid2': true } }
305
+ } }).callback;
306
+ submoduleCallback(callBackSpy);
307
+ let request = server.requests[1];
308
+ expect(request.url).to.be.eq(`https://idx.liadm.com/idex/prebid/89899?resolve=uid2`);
309
+ request.respond(
310
+ 200,
311
+ responseHeader,
312
+ JSON.stringify({})
313
+ );
314
+ expect(callBackSpy.calledOnce).to.be.true;
315
+ });
262
316
  });
@@ -808,8 +808,8 @@ describe('mediakeysBidAdapter', function () {
808
808
  ]
809
809
  },
810
810
  eventtrackers: [
811
- { event: 1, method: 1, url: 'https://click.me' },
812
- { event: 1, method: 2, url: 'https://click-script.me' }
811
+ { event: 1, method: 1, url: 'https://eventrack.me/impression' },
812
+ { event: 1, method: 2, url: 'https://eventrack-js.me/impression-1' }
813
813
  ]
814
814
  };
815
815
 
@@ -845,9 +845,11 @@ describe('mediakeysBidAdapter', function () {
845
845
  expect(response[0].native.clickUrl).to.exist;
846
846
  expect(response[0].native.clickTrackers).to.exist;
847
847
  expect(response[0].native.clickTrackers.length).to.equal(1);
848
- expect(response[0].native.javascriptTrackers).to.equal('<script src="https://click-script.me"></script>');
849
848
  expect(response[0].native.impressionTrackers).to.exist;
850
849
  expect(response[0].native.impressionTrackers.length).to.equal(1);
850
+ expect(response[0].native.impressionTrackers[0]).to.equal('https://eventrack.me/impression');
851
+ expect(response[0].native.javascriptTrackers).to.exist;
852
+ expect(response[0].native.javascriptTrackers).to.equal('<script async src="https://eventrack-js.me/impression-1"></script>');
851
853
  });
852
854
 
853
855
  it('should ignore eventtrackers with a unsupported type', function() {
@@ -859,6 +861,21 @@ describe('mediakeysBidAdapter', function () {
859
861
  expect(response[0].native.impressionTrackers).to.exist;
860
862
  expect(response[0].native.impressionTrackers.length).to.equal(0);
861
863
  })
864
+
865
+ it('Should handle multiple javascriptTrackers in one single string', () => {
866
+ const rawServerResponseNativeCopy = utils.deepClone(rawServerResponseNative);
867
+ const nativeObjectCopy = utils.deepClone(nativeObject);
868
+ nativeObjectCopy.eventtrackers.push(
869
+ {
870
+ event: 1,
871
+ method: 2,
872
+ url: 'https://eventrack-js.me/impression-2'
873
+ },)
874
+ rawServerResponseNativeCopy.body.seatbid[0].bid[0].adm = JSON.stringify(nativeObjectCopy);
875
+ const response = spec.interpretResponse(rawServerResponseNativeCopy, request);
876
+ const expected = '<script async src=\"https://eventrack-js.me/impression-1\"></script>\n<script async src=\"https://eventrack-js.me/impression-2\"></script>';
877
+ expect(response[0].native.javascriptTrackers).to.equal(expected);
878
+ });
862
879
  });
863
880
  });
864
881
 
@@ -125,12 +125,23 @@ describe('nativoBidAdapterTests', function () {
125
125
  expect(request.url).to.include('ntv_pas')
126
126
  })
127
127
 
128
+ it('ntv_url should contain query params', function () {
129
+ const request = spec.buildRequests(bidRequests, {
130
+ bidderRequestId: 123456,
131
+ refererInfo: {
132
+ location: 'https://www.test.com?queryTest=true',
133
+ },
134
+ })
135
+ console.log(request.url) // eslint-disable-line no-console
136
+ expect(request.url).to.include(encodeURIComponent('?queryTest=true'))
137
+ })
138
+
128
139
  it('ntv_url parameter should NOT be empty even if the utl parameter was set as an empty value', function () {
129
140
  bidRequests[0].params.url = ''
130
141
  const request = spec.buildRequests(bidRequests, {
131
142
  bidderRequestId: 123456,
132
143
  refererInfo: {
133
- referer: 'https://www.test.com',
144
+ location: 'https://www.test.com',
134
145
  },
135
146
  })
136
147
 
@@ -144,7 +155,7 @@ describe('nativoBidAdapterTests', function () {
144
155
  const request = spec.buildRequests(bidRequests, {
145
156
  bidderRequestId: 123456,
146
157
  refererInfo: {
147
- referer: 'https://www.test.com',
158
+ location: 'https://www.test.com',
148
159
  },
149
160
  })
150
161