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