prebid.js 7.54.0 → 7.54.2

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 (140) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.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/adqueryBidAdapter.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/adyoulikeBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/amxBidAdapter.js +1 -1
  13. package/dist/amxIdSystem.js +1 -1
  14. package/dist/appierAnalyticsAdapter.js +1 -1
  15. package/dist/appnexusBidAdapter.js +1 -1
  16. package/dist/asoBidAdapter.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/bridgewellBidAdapter.js +1 -1
  21. package/dist/brightMountainMediaBidAdapter.js +1 -1
  22. package/dist/carodaBidAdapter.js +1 -1
  23. package/dist/chtnwBidAdapter.js +1 -1
  24. package/dist/concertBidAdapter.js +1 -1
  25. package/dist/connectadBidAdapter.js +1 -1
  26. package/dist/consumableBidAdapter.js +1 -1
  27. package/dist/conversantAnalyticsAdapter.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/cwireBidAdapter.js +1 -1
  32. package/dist/dspxBidAdapter.js +1 -1
  33. package/dist/eplanningBidAdapter.js +1 -1
  34. package/dist/euidIdSystem.js +1 -1
  35. package/dist/feedadBidAdapter.js +1 -1
  36. package/dist/finativeBidAdapter.js +1 -1
  37. package/dist/freewheel-sspBidAdapter.js +1 -1
  38. package/dist/glimpseBidAdapter.js +1 -1
  39. package/dist/gmosspBidAdapter.js +1 -1
  40. package/dist/goldbachBidAdapter.js +1 -1
  41. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  42. package/dist/greenbidsRtdProvider.js +1 -1
  43. package/dist/gridBidAdapter.js +1 -1
  44. package/dist/gumgumBidAdapter.js +1 -1
  45. package/dist/h12mediaBidAdapter.js +1 -1
  46. package/dist/hypelabBidAdapter.js +1 -1
  47. package/dist/id5IdSystem.js +1 -1
  48. package/dist/improvedigitalBidAdapter.js +1 -1
  49. package/dist/inmarBidAdapter.js +1 -1
  50. package/dist/insticatorBidAdapter.js +1 -1
  51. package/dist/ixBidAdapter.js +1 -1
  52. package/dist/justpremiumBidAdapter.js +1 -1
  53. package/dist/kargoBidAdapter.js +1 -1
  54. package/dist/konduitAnalyticsAdapter.js +1 -1
  55. package/dist/kueezBidAdapter.js +1 -1
  56. package/dist/kueezRtbBidAdapter.js +1 -1
  57. package/dist/kulturemediaBidAdapter.js +1 -1
  58. package/dist/lassoBidAdapter.js +1 -1
  59. package/dist/lifestreetBidAdapter.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/magniteAnalyticsAdapter.js +1 -1
  64. package/dist/malltvAnalyticsAdapter.js +1 -1
  65. package/dist/marsmediaBidAdapter.js +1 -1
  66. package/dist/mediafuseBidAdapter.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/minutemediaplusBidAdapter.js +1 -1
  71. package/dist/nexx360BidAdapter.js +1 -1
  72. package/dist/not-for-prod/prebid.js +128 -128
  73. package/dist/oguryBidAdapter.js +1 -1
  74. package/dist/onetagBidAdapter.js +1 -1
  75. package/dist/ooloAnalyticsAdapter.js +1 -1
  76. package/dist/optidigitalBidAdapter.js +1 -1
  77. package/dist/outbrainBidAdapter.js +1 -1
  78. package/dist/oxxionRtdProvider.js +1 -1
  79. package/dist/parrableIdSystem.js +1 -1
  80. package/dist/pixfutureBidAdapter.js +1 -1
  81. package/dist/prebid-core.js +1 -1
  82. package/dist/publinkIdSystem.js +1 -1
  83. package/dist/pubmaticBidAdapter.js +1 -1
  84. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  85. package/dist/pxyzBidAdapter.js +1 -1
  86. package/dist/quantcastBidAdapter.js +1 -1
  87. package/dist/readpeakBidAdapter.js +1 -1
  88. package/dist/relaidoBidAdapter.js +1 -1
  89. package/dist/retailspotBidAdapter.js +1 -1
  90. package/dist/rhythmoneBidAdapter.js +1 -1
  91. package/dist/riseBidAdapter.js +1 -1
  92. package/dist/rubiconAnalyticsAdapter.js +1 -1
  93. package/dist/rubiconBidAdapter.js +1 -1
  94. package/dist/seedingAllianceBidAdapter.js +1 -1
  95. package/dist/seedtagBidAdapter.js +1 -1
  96. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  97. package/dist/sharethroughBidAdapter.js +1 -1
  98. package/dist/shinezBidAdapter.js +1 -1
  99. package/dist/smaatoBidAdapter.js +1 -1
  100. package/dist/smartadserverBidAdapter.js +1 -1
  101. package/dist/smartxBidAdapter.js +1 -1
  102. package/dist/smilewantedBidAdapter.js +1 -1
  103. package/dist/sonobiBidAdapter.js +1 -1
  104. package/dist/sovrnAnalyticsAdapter.js +1 -1
  105. package/dist/sovrnBidAdapter.js +1 -1
  106. package/dist/sspBCBidAdapter.js +1 -1
  107. package/dist/stvBidAdapter.js +1 -1
  108. package/dist/sublimeBidAdapter.js +1 -1
  109. package/dist/synacormediaBidAdapter.js +1 -1
  110. package/dist/targetVideoBidAdapter.js +1 -1
  111. package/dist/teadsBidAdapter.js +1 -1
  112. package/dist/trionBidAdapter.js +1 -1
  113. package/dist/tripleliftBidAdapter.js +1 -1
  114. package/dist/ttdBidAdapter.js +1 -1
  115. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  116. package/dist/uid2IdSystem.js +1 -1
  117. package/dist/underdogmediaBidAdapter.js +1 -1
  118. package/dist/undertoneBidAdapter.js +1 -1
  119. package/dist/vidazooBidAdapter.js +1 -1
  120. package/dist/videobyteBidAdapter.js +1 -1
  121. package/dist/visxBidAdapter.js +1 -1
  122. package/dist/vuukleBidAdapter.js +1 -1
  123. package/dist/widespaceBidAdapter.js +1 -1
  124. package/dist/winrBidAdapter.js +1 -1
  125. package/dist/yahoosspBidAdapter.js +1 -1
  126. package/dist/yieldmoBidAdapter.js +1 -1
  127. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  128. package/modules/adqueryBidAdapter.js +21 -18
  129. package/modules/ixBidAdapter.js +285 -53
  130. package/modules/kargoBidAdapter.js +4 -0
  131. package/modules/mediasquareBidAdapter.js +19 -23
  132. package/modules/oxxionRtdProvider.js +124 -11
  133. package/modules/rubiconBidAdapter.js +13 -1
  134. package/modules/yahoosspBidAdapter.js +8 -7
  135. package/package.json +1 -1
  136. package/test/spec/modules/ixBidAdapter_spec.js +745 -3
  137. package/test/spec/modules/mediasquareBidAdapter_spec.js +3 -0
  138. package/test/spec/modules/oxxionRtdProvider_spec.js +113 -1
  139. package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
  140. package/test/spec/modules/yahoosspBidAdapter_spec.js +54 -24
@@ -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, FEATURE_TOGGLES, LOCAL_STORAGE_FEATURE_TOGGLES_KEY, REQUESTED_FEATURE_TOGGLES } from '../../../modules/ixBidAdapter.js';
5
+ import { spec, storage, ERROR_CODES, FEATURE_TOGGLES, LOCAL_STORAGE_FEATURE_TOGGLES_KEY, REQUESTED_FEATURE_TOGGLES, combineImps, bidToVideoImp, bidToNativeImp, deduplicateImpExtFields, removeSiteIDs } from '../../../modules/ixBidAdapter.js';
6
6
  import { createEidsArray } from 'modules/userId/eids.js';
7
7
  import { deepAccess, deepClone } from '../../../src/utils.js';
8
8
 
@@ -387,7 +387,7 @@ describe('IndexexchangeAdapter', function () {
387
387
  },
388
388
  ortb2Imp: {
389
389
  ext: {
390
- tid: '173f49a8-7549-4218-a23c-e7ba59b47230',
390
+ tid: '273f49a8-7549-4218-a23c-e7ba59b47230',
391
391
  data: {
392
392
  pbadslot: 'div-gpt-ad-1460505748562-0'
393
393
  }
@@ -456,7 +456,7 @@ describe('IndexexchangeAdapter', function () {
456
456
  },
457
457
  ortb2Imp: {
458
458
  ext: {
459
- tid: '173f49a8-7549-4218-a23c-e7ba59b47230',
459
+ tid: '273f49a8-7549-4218-a23c-e7ba59b47230',
460
460
  data: {
461
461
  pbadslot: 'div-gpt-ad-1460505748562-0'
462
462
  }
@@ -3880,6 +3880,224 @@ describe('IndexexchangeAdapter', function () {
3880
3880
  [FEATURE_TOGGLES.REQUESTED_FEATURE_TOGGLES[0]]: { activated: false }
3881
3881
  });
3882
3882
  });
3883
+
3884
+ describe('multiformat tests with enable multiformat ft enabled', () => {
3885
+ let ftStub;
3886
+ let validBids;
3887
+ beforeEach(() => {
3888
+ ftStub = sinon.stub(FEATURE_TOGGLES, 'isFeatureEnabled').callsFake((ftName) => {
3889
+ if (ftName == 'pbjs_enable_multiformat') {
3890
+ return true;
3891
+ }
3892
+ return false;
3893
+ });
3894
+ validBids = DEFAULT_MULTIFORMAT_VALID_BID;
3895
+ });
3896
+
3897
+ afterEach(() => {
3898
+ ftStub.restore();
3899
+ validBids = DEFAULT_MULTIFORMAT_VALID_BID;
3900
+ });
3901
+
3902
+ it('banner multiformat request, should generate banner imp', () => {
3903
+ const request = spec.buildRequests(DEFAULT_MULTIFORMAT_BANNER_VALID_BID, {})
3904
+ const imp = extractPayload(request[0]).imp[0];
3905
+ const bannerImpression = imp.banner
3906
+ expect(request).to.have.lengthOf(1);
3907
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(1);
3908
+ expect(imp.id).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].bidId);
3909
+ expect(bannerImpression.format[0].w).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[0]);
3910
+ expect(bannerImpression.format[0].h).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[1]);
3911
+ });
3912
+ it('should generate video impression', () => {
3913
+ const request = spec.buildRequests(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID, {});
3914
+ const imp = extractPayload(request[0]).imp[0];
3915
+ const videoImp = imp.video
3916
+ expect(request).to.have.lengthOf(1);
3917
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(1);
3918
+ expect(imp.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
3919
+ expect(videoImp.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[0]);
3920
+ expect(videoImp.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[1]);
3921
+ });
3922
+ it('different ad units, should only have 1 request', () => {
3923
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]];
3924
+ const request = spec.buildRequests(bids, {});
3925
+ expect(request).to.have.lengthOf(1);
3926
+ });
3927
+ it('should return valid banner requests', function () {
3928
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]];
3929
+ const request = spec.buildRequests(bids, {});
3930
+ const impressions = extractPayload(request[0]).imp;
3931
+ expect(impressions).to.have.lengthOf(2);
3932
+
3933
+ expect(impressions[0].id).to.equal(bids[0].bidId);
3934
+ expect(impressions[0].banner.format).to.be.length(bids[0].mediaTypes.banner.sizes.length);
3935
+ expect(impressions[0].banner.topframe).to.be.oneOf([0, 1]);
3936
+ expect(impressions[0].ext.siteID).to.equal('123');
3937
+ expect(impressions[1].ext.siteID).to.equal('456');
3938
+ impressions[0].banner.format.map(({ w, h, ext }, index) => {
3939
+ const size = bids[0].mediaTypes.banner.sizes[index];
3940
+
3941
+ expect(w).to.equal(size[0]);
3942
+ expect(h).to.equal(size[1]);
3943
+ expect(ext.siteID).to.be.undefined;
3944
+ });
3945
+
3946
+ impressions[1].banner.format.map(({ w, h, ext }, index) => {
3947
+ const size = bids[1].mediaTypes.banner.sizes[index];
3948
+
3949
+ expect(w).to.equal(size[0]);
3950
+ expect(h).to.equal(size[1]);
3951
+ expect(ext.siteID).to.be.undefined;
3952
+ });
3953
+ });
3954
+ it('banner / native multiformat request, only 1 request expect 1 imp', () => {
3955
+ const request = spec.buildRequests(DEFAULT_MULTIFORMAT_NATIVE_VALID_BID, {});
3956
+ expect(request).to.have.lengthOf(1);
3957
+ const imp = extractPayload(request[0]).imp[0];
3958
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(1);
3959
+ expect(imp.banner).to.exist;
3960
+ expect(imp.native).to.exist;
3961
+ });
3962
+
3963
+ it('should return valid banner and video requests', function () {
3964
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]];
3965
+ const request = spec.buildRequests(bids, {});
3966
+ const videoImpression = extractPayload(request[0]).imp[1];
3967
+
3968
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(2);
3969
+ expect(videoImpression.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
3970
+ expect(videoImpression.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[0][0]);
3971
+ expect(videoImpression.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[0][1]);
3972
+ });
3973
+
3974
+ it('multiformat banner / video - bid floors', function () {
3975
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]];
3976
+ bids[0].params.bidFloor = 2.35;
3977
+ bids[0].params.bidFloorCur = 'USD';
3978
+ let tid = bids[1].transactionId;
3979
+ bids[1].transactionId = bids[0].transactionId;
3980
+ bids[1].params.bidFloor = 2.05;
3981
+ bids[1].params.bidFloorCur = 'USD';
3982
+ const request = spec.buildRequests(bids, {});
3983
+
3984
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(1);
3985
+ expect(extractPayload(request[0]).imp[0].bidfloor).to.equal(2.05);
3986
+ expect(extractPayload(request[0]).imp[0].bidfloorcur).to.equal('USD');
3987
+ expect(extractPayload(request[0]).imp[0].video.ext.bidfloor).to.equal(2.05);
3988
+ expect(extractPayload(request[0]).imp[0].banner.format[0].ext.bidfloor).to.equal(2.35);
3989
+ bids[1].transactionId = tid;
3990
+ });
3991
+
3992
+ it('multiformat banner / native - bid floors', function () {
3993
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_NATIVE_VALID_BID[0]];
3994
+ bids[0].params.bidFloor = 2.35;
3995
+ bids[0].params.bidFloorCur = 'USD';
3996
+ let tid = bids[1].transactionId;
3997
+ bids[1].transactionId = bids[0].transactionId;
3998
+ bids[1].params.bidFloor = 2.05;
3999
+ bids[1].params.bidFloorCur = 'USD';
4000
+ const request = spec.buildRequests(bids, {});
4001
+
4002
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(1);
4003
+ expect(extractPayload(request[0]).imp[0].bidfloor).to.equal(2.05);
4004
+ expect(extractPayload(request[0]).imp[0].bidfloorcur).to.equal('USD');
4005
+ expect(extractPayload(request[0]).imp[0].native.ext.bidfloor).to.equal(2.05);
4006
+ bids[1].adUnitCode = tid;
4007
+ });
4008
+
4009
+ it('multiformat banner / native - bid floors, banner imp less', function () {
4010
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_NATIVE_VALID_BID[0]];
4011
+ bids[0].params.bidFloor = 2.05;
4012
+ bids[0].params.bidFloorCur = 'USD';
4013
+ let tid = bids[1].transactionId;
4014
+ bids[1].transactionId = bids[0].transactionId;
4015
+ bids[1].params.bidFloor = 2.35;
4016
+ bids[1].params.bidFloorCur = 'USD';
4017
+ const request = spec.buildRequests(bids, {});
4018
+
4019
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(1);
4020
+ expect(extractPayload(request[0]).imp[0].bidfloor).to.equal(2.05);
4021
+ expect(extractPayload(request[0]).imp[0].bidfloorcur).to.equal('USD');
4022
+ expect(extractPayload(request[0]).imp[0].native.ext.bidfloor).to.equal(2.35);
4023
+ bids[1].transactionId = tid;
4024
+ });
4025
+
4026
+ it('should return valid banner and video requests, different adunit, creates multiimp request', function () {
4027
+ let bid = DEFAULT_MULTIFORMAT_VALID_BID[0]
4028
+ bid.bidId = '1abcdef'
4029
+ const bids = [DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0], bid];
4030
+ const request = spec.buildRequests(bids, {});
4031
+ expect(request).to.have.lengthOf(1);
4032
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(2);
4033
+ });
4034
+
4035
+ it('should return valid video requests, different adunit, creates multiimp request', function () {
4036
+ let bid = DEFAULT_BANNER_VALID_BID[0]
4037
+ bid.bidId = '1abcdef'
4038
+ const bids = [DEFAULT_VIDEO_VALID_BID[0], bid];
4039
+ const request = spec.buildRequests(bids, {});
4040
+ expect(request).to.have.lengthOf(1);
4041
+ expect(extractPayload(request[0]).imp).to.have.lengthOf(2);
4042
+ });
4043
+
4044
+ it('should contain all correct IXdiag properties', function () {
4045
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]];
4046
+ const request = spec.buildRequests(bids, {});
4047
+ const diagObj = extractPayload(request[0]).ext.ixdiag;
4048
+ expect(diagObj.iu).to.equal(0);
4049
+ expect(diagObj.nu).to.equal(0);
4050
+ expect(diagObj.ou).to.equal(2);
4051
+ expect(diagObj.ren).to.equal(true);
4052
+ expect(diagObj.mfu).to.equal(2);
4053
+ expect(diagObj.allu).to.equal(2);
4054
+ expect(diagObj.version).to.equal('$prebid.version$');
4055
+ expect(diagObj.url).to.equal('http://localhost:9876/context.html')
4056
+ expect(diagObj.pbadslot).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].ortb2Imp.ext.data.pbadslot)
4057
+ expect(diagObj.tagid).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.tagId)
4058
+ expect(diagObj.adunitcode).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].adUnitCode)
4059
+ });
4060
+
4061
+ it('should use siteId override for multiformat', function () {
4062
+ validBids[0].params = {
4063
+ tagId: '123',
4064
+ siteId: '456',
4065
+ size: [300, 250],
4066
+ video: {
4067
+ siteId: '1111'
4068
+ },
4069
+ banner: {
4070
+ siteId: '2222'
4071
+ },
4072
+ native: {
4073
+ siteId: '3333'
4074
+ }
4075
+ }
4076
+ const request = spec.buildRequests(validBids, {});
4077
+ const imp = request[0].data.imp[0];
4078
+ expect(imp.ext.siteID).to.equal('2222');
4079
+ expect(imp.video.ext.siteID).to.be.undefined;
4080
+ imp.banner.format.map(({ ext }) => {
4081
+ expect(ext.siteID).to.be.undefined;
4082
+ });
4083
+ expect(imp.native.ext.siteID).to.be.undefined;
4084
+ });
4085
+
4086
+ it('should use default siteId if overrides are not provided for multiformat', function () {
4087
+ const bids = validBids;
4088
+ delete bids[0].params.banner;
4089
+ delete bids[0].params.video;
4090
+ delete bids[0].params.native;
4091
+ const request = spec.buildRequests(bids, {});
4092
+ const imp = request[0].data.imp[0]
4093
+ expect(imp.video.ext.siteID).to.be.undefined;
4094
+ imp.banner.format.map(({ ext }) => {
4095
+ expect(ext.siteID).to.be.undefined;
4096
+ });
4097
+ expect(imp.native.ext.siteID).to.be.undefined;
4098
+ expect(imp.ext.siteID).to.equal('456');
4099
+ });
4100
+ });
3883
4101
  });
3884
4102
 
3885
4103
  describe('LocalStorage error codes', () => {
@@ -4054,4 +4272,528 @@ describe('IndexexchangeAdapter', function () {
4054
4272
  expect(localStorageValues[key]).to.be.undefined;
4055
4273
  });
4056
4274
  });
4275
+ describe('combine imps test', function () {
4276
+ it('base test', function () {
4277
+ const imps = [
4278
+ {
4279
+ 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7': {
4280
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7',
4281
+ 'adUnitCode': 'div-gpt-v1',
4282
+ 'missingImps': [
4283
+ {
4284
+ 'id': '2e46cbd7d4e046',
4285
+ 'ext': {
4286
+ 'siteID': '12345'
4287
+ },
4288
+ 'banner': {
4289
+ 'w': 300,
4290
+ 'h': 250,
4291
+ 'topframe': 1
4292
+ }
4293
+ }
4294
+ ],
4295
+ 'missingCount': 1
4296
+ }
4297
+ },
4298
+ {
4299
+ 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7': {
4300
+ 'ixImps': [
4301
+ {
4302
+ 'id': '2e46cbd7d4e046',
4303
+ 'ext': {
4304
+ 'siteID': '12345',
4305
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'
4306
+ },
4307
+ 'video': {
4308
+ 'skipppable': false,
4309
+ 'playback_methods': [
4310
+ 'auto_play_sound_off'
4311
+ ],
4312
+ 'minduration': 0,
4313
+ 'maxduration': 30,
4314
+ 'mimes': [
4315
+ 'video/mp4',
4316
+ 'video/x-flv'
4317
+ ],
4318
+ 'placement': 1,
4319
+ 'playerSize': [
4320
+ [
4321
+ 640,
4322
+ 480
4323
+ ]
4324
+ ],
4325
+ 'protocols': [
4326
+ 6
4327
+ ],
4328
+ 'w': 640,
4329
+ 'h': 480,
4330
+ 'ext': {
4331
+ 'siteID': '12345',
4332
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'
4333
+ }
4334
+ }
4335
+ },
4336
+ ],
4337
+ 'adUnitCode': 'div-gpt-v1'
4338
+ }
4339
+ },
4340
+ {
4341
+ 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7': {
4342
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7',
4343
+ 'adUnitCode': 'div-gpt-v1',
4344
+ 'missingImps': [
4345
+ {
4346
+ 'id': '2e46cbd7d4e046',
4347
+ 'ext': {
4348
+ 'siteID': '12345'
4349
+ },
4350
+ 'banner': {
4351
+ 'w': 300,
4352
+ 'h': 250,
4353
+ 'topframe': 1
4354
+ }
4355
+ }
4356
+ ],
4357
+ 'missingCount': 1
4358
+ }
4359
+ }
4360
+ ]
4361
+ const result = combineImps(imps);
4362
+ expect(result['b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'].ixImps.length).to.equal(1)
4363
+ expect(result['b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'].missingImps.length).to.equal(2);
4364
+ });
4365
+ it('switch order', function () {
4366
+ const imps = [
4367
+ {
4368
+ 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7': {
4369
+ 'ixImps': [
4370
+ {
4371
+ 'id': '2e46cbd7d4e046',
4372
+ 'ext': {
4373
+ 'siteID': '12345',
4374
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'
4375
+ },
4376
+ 'video': {
4377
+ 'skipppable': false,
4378
+ 'playback_methods': [
4379
+ 'auto_play_sound_off'
4380
+ ],
4381
+ 'minduration': 0,
4382
+ 'maxduration': 30,
4383
+ 'mimes': [
4384
+ 'video/mp4',
4385
+ 'video/x-flv'
4386
+ ],
4387
+ 'placement': 1,
4388
+ 'playerSize': [
4389
+ [
4390
+ 640,
4391
+ 480
4392
+ ]
4393
+ ],
4394
+ 'protocols': [
4395
+ 6
4396
+ ],
4397
+ 'w': 640,
4398
+ 'h': 480,
4399
+ 'ext': {
4400
+ 'siteID': '12345',
4401
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'
4402
+ }
4403
+ }
4404
+ },
4405
+ ],
4406
+ 'adUnitCode': 'div-gpt-v1'
4407
+ }
4408
+ },
4409
+ {
4410
+ 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7': {
4411
+ 'tid': 'b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7',
4412
+ 'adUnitCode': 'div-gpt-v1',
4413
+ 'missingImps': [
4414
+ {
4415
+ 'id': '2e46cbd7d4e046',
4416
+ 'ext': {
4417
+ 'siteID': '12345'
4418
+ },
4419
+ 'banner': {
4420
+ 'w': 300,
4421
+ 'h': 250,
4422
+ 'topframe': 1
4423
+ }
4424
+ }
4425
+ ],
4426
+ 'missingCount': 1
4427
+ }
4428
+ }
4429
+ ]
4430
+ const result = combineImps(imps)
4431
+ expect(result['b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'].missingImps.length).to.equal(1);
4432
+ expect(result['b8c6b5d5-76a1-4a90-b635-0c7eae1bfaa7'].ixImps.length).to.equal(1);
4433
+ });
4434
+ });
4435
+ describe('apply floors test', function () {
4436
+ it('video test', function() {
4437
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
4438
+ bid.params.bidFloor = 50;
4439
+ bid.params.bidFloorCur = 'USD';
4440
+ const imp = bidToVideoImp(bid);
4441
+ expect(imp.video.ext.bidfloor).to.equal(50);
4442
+ expect(imp.bidfloor).to.equal(50);
4443
+ expect(imp.bidfloorcur).to.equal('USD');
4444
+ expect(imp.video.ext.fl).to.equal('x');
4445
+ });
4446
+ it('native test', function() {
4447
+ const bid = utils.deepClone(DEFAULT_NATIVE_VALID_BID[0]);
4448
+ bid.params.bidFloor = 50;
4449
+ bid.params.bidFloorCur = 'USD';
4450
+ const imp = bidToNativeImp(bid);
4451
+ expect(imp.native.ext.bidfloor).to.equal(50);
4452
+ expect(imp.bidfloor).to.equal(50);
4453
+ expect(imp.bidfloorcur).to.equal('USD');
4454
+ expect(imp.native.ext.fl).to.equal('x');
4455
+ });
4456
+ });
4457
+
4458
+ describe('deduplicateImpExtFields', () => {
4459
+ it('should remove duplicate keys from banner.ext', () => {
4460
+ const input = {
4461
+ imp: [
4462
+ {
4463
+ banner: {
4464
+ ext: {
4465
+ key1: 'value1',
4466
+ key2: 'value2',
4467
+ key3: 'value3',
4468
+ key4: 'value4', // duplicate value
4469
+ },
4470
+ },
4471
+ video: {
4472
+ ext: {
4473
+ key4: 'value4', // duplicate value
4474
+ }
4475
+ },
4476
+ ext: {
4477
+ key4: 'value4'
4478
+ }
4479
+ },
4480
+ ],
4481
+ };
4482
+
4483
+ const expectedOutput = {
4484
+ imp: [
4485
+ {
4486
+ banner: {
4487
+ ext: {
4488
+ key1: 'value1',
4489
+ key2: 'value2',
4490
+ key3: 'value3',
4491
+ },
4492
+ },
4493
+ ext: {
4494
+ key4: 'value4'
4495
+ },
4496
+ video: {
4497
+ ext: {}
4498
+ },
4499
+ },
4500
+ ],
4501
+ };
4502
+
4503
+ const result = deduplicateImpExtFields(input);
4504
+ expect(result).to.deep.equal(expectedOutput);
4505
+ });
4506
+
4507
+ it('should remove duplicate keys from banner.format[].ext', () => {
4508
+ const input = {
4509
+ imp: [
4510
+ {
4511
+ banner: {
4512
+ format: [
4513
+ {
4514
+ ext: {
4515
+ key1: 'value1',
4516
+ key2: 'value2',
4517
+ key3: 'value3',
4518
+ key4: 'value4', // duplicate value
4519
+ },
4520
+ },
4521
+ ],
4522
+ },
4523
+ video: {
4524
+ ext: {
4525
+ key4: 'value4', // duplicate value
4526
+ }
4527
+ },
4528
+ ext: {
4529
+ key4: 'value4'
4530
+ }
4531
+ },
4532
+ ],
4533
+ };
4534
+
4535
+ const expectedOutput = {
4536
+ imp: [
4537
+ {
4538
+ banner: {
4539
+ format: [
4540
+ {
4541
+ ext: {
4542
+ key1: 'value1',
4543
+ key2: 'value2',
4544
+ key3: 'value3',
4545
+ },
4546
+ },
4547
+ ],
4548
+ },
4549
+ video: {
4550
+ ext: {}
4551
+ },
4552
+ ext: {
4553
+ key4: 'value4'
4554
+ }
4555
+ },
4556
+ ],
4557
+ };
4558
+
4559
+ const result = deduplicateImpExtFields(input);
4560
+ expect(result).to.deep.equal(expectedOutput);
4561
+ });
4562
+
4563
+ it('should remove duplicate keys from video.ext', () => {
4564
+ const input = {
4565
+ imp: [
4566
+ {
4567
+ video: {
4568
+ ext: {
4569
+ key1: 'value1',
4570
+ key2: 'value2',
4571
+ key3: 'value3',
4572
+ key4: 'value4', // duplicate value
4573
+ },
4574
+ },
4575
+ banner: {
4576
+ ext: {
4577
+ key1: 'value1',
4578
+ }
4579
+ },
4580
+ ext: {
4581
+ key4: 'value4'
4582
+ }
4583
+ },
4584
+ ],
4585
+ };
4586
+
4587
+ const expectedOutput = {
4588
+ imp: [
4589
+ {
4590
+ video: {
4591
+ ext: {
4592
+ key1: 'value1',
4593
+ key2: 'value2',
4594
+ key3: 'value3',
4595
+ },
4596
+ },
4597
+ banner: {
4598
+ ext: {
4599
+ key1: 'value1',
4600
+ }
4601
+ },
4602
+ ext: {
4603
+ key4: 'value4'
4604
+ }
4605
+ },
4606
+ ],
4607
+ };
4608
+
4609
+ const result = deduplicateImpExtFields(input);
4610
+ expect(result).to.deep.equal(expectedOutput);
4611
+ });
4612
+
4613
+ it('should remove duplicate keys from native.ext', () => {
4614
+ const input = {
4615
+ imp: [
4616
+ {
4617
+ native: {
4618
+ ext: {
4619
+ key1: 'value1',
4620
+ key2: 'value2',
4621
+ key3: 'value3',
4622
+ key4: 'value4', // duplicate value
4623
+ },
4624
+ },
4625
+ banner: {
4626
+ ext: {
4627
+ key1: 'value1',
4628
+ }
4629
+ },
4630
+ ext: {
4631
+ key4: 'value4'
4632
+ }
4633
+ },
4634
+ ],
4635
+ };
4636
+
4637
+ const expectedOutput = {
4638
+ imp: [
4639
+ {
4640
+ native: {
4641
+ ext: {
4642
+ key1: 'value1',
4643
+ key2: 'value2',
4644
+ key3: 'value3',
4645
+ },
4646
+ },
4647
+ banner: {
4648
+ ext: {
4649
+ key1: 'value1',
4650
+ }
4651
+ },
4652
+ ext: {
4653
+ key4: 'value4'
4654
+ }
4655
+ }
4656
+ ],
4657
+ };
4658
+
4659
+ const result = deduplicateImpExtFields(input);
4660
+ expect(result).to.deep.equal(expectedOutput);
4661
+ });
4662
+
4663
+ it('should return the input unchanged when there is no imp.ext', () => {
4664
+ const input = {
4665
+ imp: [
4666
+ {
4667
+ banner: {
4668
+ ext: {
4669
+ key1: 'value1',
4670
+ key2: 'value2',
4671
+ key3: 'value3',
4672
+ },
4673
+ },
4674
+ video: {
4675
+ ext: {
4676
+ key4: 'value4',
4677
+ key5: 'value5',
4678
+ key6: 'value6',
4679
+ },
4680
+ },
4681
+ native: {
4682
+ ext: {
4683
+ key7: 'value7',
4684
+ key8: 'value8',
4685
+ key9: 'value9',
4686
+ },
4687
+ },
4688
+ },
4689
+ ],
4690
+ };
4691
+
4692
+ const result = deduplicateImpExtFields(input);
4693
+ expect(result).to.deep.equal(input);
4694
+ });
4695
+ });
4696
+
4697
+ describe('removeSiteIDs', () => {
4698
+ it('should remove siteIDs from banner / video / native format', () => {
4699
+ const request = {
4700
+ imp: [
4701
+ {
4702
+ banner: {
4703
+ format: [
4704
+ {
4705
+ ext: {
4706
+ siteID: '123'
4707
+ }
4708
+ },
4709
+ {
4710
+ ext: {
4711
+ siteID: '123'
4712
+ }
4713
+ }
4714
+ ],
4715
+ ext: {
4716
+ siteID: '123'
4717
+ }
4718
+ },
4719
+ video: {
4720
+ ext: {
4721
+ siteID: '123'
4722
+ }
4723
+ },
4724
+ native: {
4725
+ ext: {
4726
+ siteID: '123'
4727
+ }
4728
+ },
4729
+ ext: {
4730
+ siteID: '123'
4731
+ }
4732
+ }
4733
+ ]
4734
+ };
4735
+
4736
+ const expected = {
4737
+ ext: {
4738
+ ixdiag: {
4739
+ usid: true
4740
+ }
4741
+ },
4742
+ imp: [
4743
+ {
4744
+ banner: {
4745
+ format: [
4746
+ {
4747
+ ext: {}
4748
+ },
4749
+ {
4750
+ ext: {}
4751
+ }
4752
+ ],
4753
+ ext: {}
4754
+ },
4755
+ video: {
4756
+ ext: {}
4757
+ },
4758
+ native: {
4759
+ ext: {}
4760
+ },
4761
+ ext: {
4762
+ 'siteID': '123'
4763
+ }
4764
+ }
4765
+ ]
4766
+ };
4767
+
4768
+ expect(removeSiteIDs(request)).to.deep.equal(expected);
4769
+ });
4770
+
4771
+ it('should not modify the request when imp.ext is not present', () => {
4772
+ const request = {
4773
+ imp: [
4774
+ {
4775
+ banner: {
4776
+ ext: {
4777
+ siteID: '123'
4778
+ }
4779
+ }
4780
+ }
4781
+ ]
4782
+ };
4783
+
4784
+ const expected = {
4785
+ imp: [
4786
+ {
4787
+ banner: {
4788
+ ext: {
4789
+ siteID: '123'
4790
+ }
4791
+ },
4792
+ }
4793
+ ]
4794
+ };
4795
+
4796
+ expect(removeSiteIDs(request)).to.deep.equal(expected);
4797
+ });
4798
+ });
4057
4799
  });