prebid.js 6.0.0 → 6.4.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 (201) hide show
  1. package/.babelrc.js +1 -7
  2. package/.circleci/config.yml +1 -1
  3. package/README.md +1 -1
  4. package/browsers.json +13 -29
  5. package/gulpfile.js +88 -82
  6. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  7. package/karma.conf.maker.js +2 -2
  8. package/modules/33acrossBidAdapter.js +189 -102
  9. package/modules/adagioBidAdapter.js +1 -1
  10. package/modules/addefendBidAdapter.js +1 -0
  11. package/modules/adheseBidAdapter.js +7 -2
  12. package/modules/adkernelBidAdapter.js +147 -61
  13. package/modules/adlivetechBidAdapter.md +61 -0
  14. package/modules/adlooxAdServerVideo.js +2 -2
  15. package/modules/adlooxAnalyticsAdapter.js +4 -4
  16. package/modules/admanBidAdapter.js +1 -0
  17. package/modules/admixerBidAdapter.js +3 -2
  18. package/modules/adnuntiusBidAdapter.js +5 -2
  19. package/modules/adomikAnalyticsAdapter.js +16 -4
  20. package/modules/adplusBidAdapter.js +203 -0
  21. package/modules/adplusBidAdapter.md +39 -0
  22. package/modules/adxcgBidAdapter.js +311 -359
  23. package/modules/adxcgBidAdapter.md +22 -21
  24. package/modules/adyoulikeBidAdapter.js +7 -2
  25. package/modules/aniviewBidAdapter.js +1 -1
  26. package/modules/appnexusBidAdapter.js +23 -3
  27. package/modules/beachfrontBidAdapter.js +14 -17
  28. package/modules/beopBidAdapter.js +6 -4
  29. package/modules/bidViewability.js +3 -3
  30. package/modules/bidViewabilityIO.js +3 -3
  31. package/modules/codefuelBidAdapter.js +1 -3
  32. package/modules/codefuelBidAdapter.md +3 -3
  33. package/modules/colossussspBidAdapter.js +7 -0
  34. package/modules/compassBidAdapter.js +201 -0
  35. package/modules/compassBidAdapter.md +79 -0
  36. package/modules/craftBidAdapter.js +5 -3
  37. package/modules/criteoBidAdapter.js +1 -1
  38. package/modules/currency.js +2 -2
  39. package/modules/cwireBidAdapter.js +3 -0
  40. package/modules/dailyhuntBidAdapter.js +435 -0
  41. package/modules/dailyhuntBidAdapter.md +4 -0
  42. package/modules/datablocksBidAdapter.js +3 -3
  43. package/modules/dchain.js +149 -0
  44. package/modules/dchain.md +45 -0
  45. package/modules/deepintentBidAdapter.js +1 -1
  46. package/modules/dspxBidAdapter.js +1 -1
  47. package/modules/emx_digitalBidAdapter.js +9 -1
  48. package/modules/engageyaBidAdapter.js +68 -54
  49. package/modules/feedadBidAdapter.js +2 -2
  50. package/modules/feedadBidAdapter.md +4 -2
  51. package/modules/freewheel-sspBidAdapter.js +6 -0
  52. package/modules/futureads.md +48 -0
  53. package/modules/glimpseBidAdapter.js +44 -16
  54. package/modules/goldbachBidAdapter.js +1176 -0
  55. package/modules/goldbachBidAdapter.md +151 -0
  56. package/modules/gptPreAuction.js +11 -5
  57. package/modules/gridBidAdapter.js +5 -4
  58. package/modules/gumgumBidAdapter.js +7 -3
  59. package/modules/id5IdSystem.md +6 -6
  60. package/modules/imRtdProvider.js +31 -0
  61. package/modules/improvedigitalBidAdapter.js +19 -3
  62. package/modules/instreamTracking.js +4 -4
  63. package/modules/intersectionRtdProvider.js +114 -0
  64. package/modules/invibesBidAdapter.js +64 -14
  65. package/modules/invibesBidAdapter.md +2 -1
  66. package/modules/ipromBidAdapter.js +79 -0
  67. package/modules/ixBidAdapter.js +185 -22
  68. package/modules/kinessoIdSystem.js +1 -1
  69. package/modules/limelightDigitalBidAdapter.js +2 -1
  70. package/modules/livewrappedBidAdapter.js +8 -2
  71. package/modules/lotamePanoramaIdSystem.js +80 -8
  72. package/modules/luponmediaBidAdapter.js +570 -0
  73. package/modules/mediasquareBidAdapter.js +1 -9
  74. package/modules/merkleIdSystem.js +5 -0
  75. package/modules/missenaBidAdapter.js +89 -0
  76. package/modules/nativoBidAdapter.js +27 -1
  77. package/modules/nextMillenniumBidAdapter.js +37 -7
  78. package/modules/oguryBidAdapter.js +2 -1
  79. package/modules/openxBidAdapter.js +6 -1
  80. package/modules/prebidServerBidAdapter/index.js +19 -15
  81. package/modules/pubgeniusBidAdapter.js +1 -1
  82. package/modules/pubmaticBidAdapter.js +5 -3
  83. package/modules/pubxaiAnalyticsAdapter.js +17 -0
  84. package/modules/relaidoBidAdapter.js +86 -65
  85. package/modules/richaudienceBidAdapter.js +2 -3
  86. package/modules/rtdModule/index.js +48 -18
  87. package/modules/rubiconBidAdapter.js +31 -19
  88. package/modules/saambaaBidAdapter.js +420 -0
  89. package/modules/saambaaBidAdapter.md +65 -68
  90. package/modules/seedtagBidAdapter.js +6 -0
  91. package/modules/sharedIdSystem.js +27 -1
  92. package/modules/smaatoBidAdapter.js +9 -1
  93. package/modules/smartxBidAdapter.js +17 -1
  94. package/modules/sspBCBidAdapter.js +34 -3
  95. package/modules/tappxBidAdapter.js +3 -1
  96. package/modules/targetVideoBidAdapter.js +187 -0
  97. package/modules/targetVideoBidAdapter.md +34 -0
  98. package/modules/telariaBidAdapter.js +2 -2
  99. package/modules/trustxBidAdapter.js +18 -17
  100. package/modules/undertoneBidAdapter.js +8 -1
  101. package/modules/userId/index.js +27 -2
  102. package/modules/ventes.md +71 -0
  103. package/modules/ventesBidAdapter.js +104 -64
  104. package/modules/ventesBidAdapter.md +0 -1
  105. package/modules/vidoomyBidAdapter.js +65 -108
  106. package/modules/visxBidAdapter.js +20 -3
  107. package/modules/visxBidAdapter.md +4 -6
  108. package/modules/weboramaRtdProvider.js +288 -73
  109. package/modules/weboramaRtdProvider.md +27 -10
  110. package/modules/yahoosspBidAdapter.js +5 -1
  111. package/modules/yahoosspBidAdapter.md +1 -1
  112. package/modules/yieldlabBidAdapter.js +41 -10
  113. package/modules/yieldlabBidAdapter.md +91 -48
  114. package/modules/yieldoneBidAdapter.js +115 -11
  115. package/modules/zetaSspBidAdapter.md +33 -1
  116. package/modules/zeta_global_sspBidAdapter.js +22 -1
  117. package/package.json +6 -1
  118. package/plugins/pbjsGlobals.js +28 -1
  119. package/src/adapterManager.js +14 -8
  120. package/src/auction.js +5 -4
  121. package/src/prebid.js +1 -2
  122. package/src/targeting.js +24 -3
  123. package/src/utils.js +41 -7
  124. package/test/helpers/prebidGlobal.js +1 -0
  125. package/test/spec/integration/faker/googletag.js +6 -0
  126. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  127. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  128. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  129. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  130. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
  131. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  132. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  133. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  134. package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
  135. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  136. package/test/spec/modules/beopBidAdapter_spec.js +1 -1
  137. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  138. package/test/spec/modules/bidViewability_spec.js +4 -4
  139. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  140. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  141. package/test/spec/modules/compassBidAdapter_spec.js +397 -0
  142. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  143. package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
  144. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  145. package/test/spec/modules/dchain_spec.js +329 -0
  146. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  147. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  148. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  149. package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
  150. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  151. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  152. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  153. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  154. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  155. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  156. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
  157. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  158. package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
  159. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  160. package/test/spec/modules/ixBidAdapter_spec.js +293 -2
  161. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  162. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  163. package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
  164. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  165. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  166. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  167. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  168. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  169. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  170. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
  171. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  172. package/test/spec/modules/openxBidAdapter_spec.js +5 -0
  173. package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
  174. package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
  175. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  176. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
  177. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  178. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  179. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  180. package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
  181. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  182. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  183. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  184. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  185. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  186. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  187. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  188. package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
  189. package/test/spec/modules/userId_spec.js +51 -0
  190. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  191. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  192. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  193. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  194. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  195. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  196. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  197. package/test/spec/unit/core/adapterManager_spec.js +24 -6
  198. package/test/spec/unit/core/targeting_spec.js +116 -0
  199. package/test/spec/utils_spec.js +38 -0
  200. package/test/test_deps.js +3 -0
  201. package/test/test_index.js +1 -3
@@ -590,6 +590,32 @@ describe('Adyoulike Adapter', function () {
590
590
  expect(payload.gdprConsent.consentRequired).to.be.null;
591
591
  });
592
592
 
593
+ it('should add userid eids information to the request', function () {
594
+ let bidderRequest = {
595
+ 'auctionId': '1d1a030790a475',
596
+ 'bidderRequestId': '22edbae2733bf6',
597
+ 'timeout': 3000,
598
+ 'userId': {
599
+ pubcid: '01EAJWWNEPN3CYMM5N8M5VXY22',
600
+ unsuported: '666'
601
+ }
602
+ };
603
+
604
+ bidderRequest.bids = bidRequestWithSinglePlacement;
605
+
606
+ const request = spec.buildRequests(bidRequestWithSinglePlacement, bidderRequest);
607
+ const payload = JSON.parse(request.data);
608
+
609
+ expect(payload.userId).to.exist;
610
+ expect(payload.userId).to.deep.equal([{
611
+ 'source': 'pubcid.org',
612
+ 'uids': [{
613
+ 'atype': 1,
614
+ 'id': '01EAJWWNEPN3CYMM5N8M5VXY22'
615
+ }]
616
+ }]);
617
+ });
618
+
593
619
  it('sends bid request to endpoint with single placement', function () {
594
620
  const request = spec.buildRequests(bidRequestWithSinglePlacement, bidderRequest);
595
621
  const payload = JSON.parse(request.data);
@@ -1004,12 +1004,16 @@ describe('AppNexusAdapter', function () {
1004
1004
 
1005
1005
  describe('interpretResponse', function () {
1006
1006
  let bfStub;
1007
+ let bidderSettingsStorage;
1008
+
1007
1009
  before(function() {
1008
1010
  bfStub = sinon.stub(bidderFactory, 'getIabSubCategory');
1011
+ bidderSettingsStorage = $$PREBID_GLOBAL$$.bidderSettings;
1009
1012
  });
1010
1013
 
1011
1014
  after(function() {
1012
1015
  bfStub.restore();
1016
+ $$PREBID_GLOBAL$$.bidderSettings = bidderSettingsStorage;
1013
1017
  });
1014
1018
 
1015
1019
  let response = {
@@ -1077,6 +1081,15 @@ describe('AppNexusAdapter', function () {
1077
1081
  'adUnitCode': 'code',
1078
1082
  'appnexus': {
1079
1083
  'buyerMemberId': 958
1084
+ },
1085
+ 'meta': {
1086
+ 'dchain': {
1087
+ 'ver': '1.0',
1088
+ 'complete': 0,
1089
+ 'nodes': [{
1090
+ 'bsid': '958'
1091
+ }]
1092
+ }
1080
1093
  }
1081
1094
  }
1082
1095
  ];
@@ -1085,11 +1098,46 @@ describe('AppNexusAdapter', function () {
1085
1098
  bidId: '3db3773286ee59',
1086
1099
  adUnitCode: 'code'
1087
1100
  }]
1088
- }
1101
+ };
1089
1102
  let result = spec.interpretResponse({ body: response }, {bidderRequest});
1090
1103
  expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
1091
1104
  });
1092
1105
 
1106
+ it('should reject 0 cpm bids', function () {
1107
+ let zeroCpmResponse = deepClone(response);
1108
+ zeroCpmResponse.tags[0].ads[0].cpm = 0;
1109
+
1110
+ let bidderRequest = {
1111
+ bidderCode: 'appnexus'
1112
+ };
1113
+
1114
+ let result = spec.interpretResponse({ body: zeroCpmResponse }, { bidderRequest });
1115
+ expect(result.length).to.equal(0);
1116
+ });
1117
+
1118
+ it('should allow 0 cpm bids if allowZeroCpmBids setConfig is true', function () {
1119
+ $$PREBID_GLOBAL$$.bidderSettings = {
1120
+ appnexus: {
1121
+ allowZeroCpmBids: true
1122
+ }
1123
+ };
1124
+
1125
+ let zeroCpmResponse = deepClone(response);
1126
+ zeroCpmResponse.tags[0].ads[0].cpm = 0;
1127
+
1128
+ let bidderRequest = {
1129
+ bidderCode: 'appnexus',
1130
+ bids: [{
1131
+ bidId: '3db3773286ee59',
1132
+ adUnitCode: 'code'
1133
+ }]
1134
+ };
1135
+
1136
+ let result = spec.interpretResponse({ body: zeroCpmResponse }, { bidderRequest });
1137
+ expect(result.length).to.equal(1);
1138
+ expect(result[0].cpm).to.equal(0);
1139
+ });
1140
+
1093
1141
  it('handles nobid responses', function () {
1094
1142
  let response = {
1095
1143
  'version': '0.0.1',
@@ -1335,6 +1383,20 @@ describe('AppNexusAdapter', function () {
1335
1383
  expect(Object.keys(result[0].meta)).to.include.members(['advertiserId']);
1336
1384
  });
1337
1385
 
1386
+ it('should add brand id', function() {
1387
+ let responseBrandId = deepClone(response);
1388
+ responseBrandId.tags[0].ads[0].brand_id = 123;
1389
+
1390
+ let bidderRequest = {
1391
+ bids: [{
1392
+ bidId: '3db3773286ee59',
1393
+ adUnitCode: 'code'
1394
+ }]
1395
+ }
1396
+ let result = spec.interpretResponse({ body: responseBrandId }, {bidderRequest});
1397
+ expect(Object.keys(result[0].meta)).to.include.members(['brandId']);
1398
+ });
1399
+
1338
1400
  it('should add advertiserDomains', function() {
1339
1401
  let responseAdvertiserId = deepClone(response);
1340
1402
  responseAdvertiserId.tags[0].ads[0].adomain = ['123'];
@@ -1,6 +1,7 @@
1
1
  import { expect } from 'chai';
2
2
  import { spec, VIDEO_ENDPOINT, BANNER_ENDPOINT, OUTSTREAM_SRC, DEFAULT_MIMES } from 'modules/beachfrontBidAdapter.js';
3
- import { parseUrl } from 'src/utils.js';
3
+ import { config } from 'src/config.js';
4
+ import { parseUrl, deepAccess } from 'src/utils.js';
4
5
 
5
6
  describe('BeachfrontAdapter', function () {
6
7
  let bidRequests;
@@ -556,6 +557,69 @@ describe('BeachfrontAdapter', function () {
556
557
  });
557
558
  });
558
559
 
560
+ describe('with first-party data', function () {
561
+ let sandbox
562
+
563
+ beforeEach(function () {
564
+ sandbox = sinon.sandbox.create();
565
+ });
566
+
567
+ afterEach(function () {
568
+ sandbox.restore();
569
+ });
570
+
571
+ it('must add first-party data to the video bid request', function () {
572
+ sandbox.stub(config, 'getConfig').callsFake(key => {
573
+ const cfg = {
574
+ ortb2: {
575
+ site: {
576
+ keywords: 'test keyword'
577
+ },
578
+ user: {
579
+ data: 'some user data'
580
+ }
581
+ }
582
+ };
583
+ return deepAccess(cfg, key);
584
+ });
585
+ const bidRequest = bidRequests[0];
586
+ bidRequest.mediaTypes = { video: {} };
587
+ const bidderRequest = {
588
+ refererInfo: {
589
+ referer: 'http://example.com/page.html'
590
+ }
591
+ };
592
+ const requests = spec.buildRequests([ bidRequest ], bidderRequest);
593
+ const data = requests[0].data;
594
+ expect(data.user.data).to.equal('some user data');
595
+ expect(data.site.keywords).to.equal('test keyword');
596
+ expect(data.site.page).to.equal('http://example.com/page.html');
597
+ expect(data.site.domain).to.equal('example.com');
598
+ });
599
+
600
+ it('must add first-party data to the banner bid request', function () {
601
+ sandbox.stub(config, 'getConfig').callsFake(key => {
602
+ const cfg = {
603
+ ortb2: {
604
+ site: {
605
+ keywords: 'test keyword'
606
+ },
607
+ user: {
608
+ data: 'some user data'
609
+ }
610
+ }
611
+ };
612
+ return deepAccess(cfg, key);
613
+ });
614
+ const bidRequest = bidRequests[0];
615
+ bidRequest.mediaTypes = { banner: {} };
616
+ const requests = spec.buildRequests([ bidRequest ]);
617
+ const data = requests[0].data;
618
+ expect(data.ortb2.user.data).to.equal('some user data');
619
+ expect(data.ortb2.site.keywords).to.equal('test keyword');
620
+ });
621
+ });
622
+
559
623
  describe('for multi-format bids', function () {
560
624
  it('should create a POST request for each bid format', function () {
561
625
  const width = 300;
@@ -124,7 +124,7 @@ describe('BeOp Bid Adapter tests', () => {
124
124
  expect(payload.tc_string).to.exist;
125
125
  expect(payload.tc_string).to.equal('BOJ8RZsOJ8RZsABAB8AAAAAZ+A==');
126
126
  expect(payload.url).to.exist;
127
- expect(payload.url).to.equal('http://test.te');
127
+ expect(payload.url).to.equal('http://localhost:9876/context.html');
128
128
  });
129
129
  });
130
130
 
@@ -3,7 +3,7 @@ import * as events from 'src/events.js';
3
3
  import * as utils from 'src/utils.js';
4
4
  import * as sinon from 'sinon';
5
5
  import { expect } from 'chai';
6
- import { EVENTS } from 'src/constants.json';
6
+ import CONSTANTS from 'src/constants.json';
7
7
 
8
8
  describe('#bidViewabilityIO', function() {
9
9
  const makeElement = (id) => {
@@ -97,7 +97,7 @@ describe('#bidViewabilityIO', function() {
97
97
  expect(mockObserver.unobserve.calledOnce).to.be.true;
98
98
  expect(emitSpy.calledOnce).to.be.true;
99
99
  // expect(emitSpy.firstCall.args).to.be.false;
100
- expect(emitSpy.firstCall.args[0]).to.eq(EVENTS.BID_VIEWABLE);
100
+ expect(emitSpy.firstCall.args[0]).to.eq(CONSTANTS.EVENTS.BID_VIEWABLE);
101
101
  });
102
102
  })
103
103
 
@@ -5,7 +5,7 @@ import * as utils from 'src/utils.js';
5
5
  import * as sinon from 'sinon';
6
6
  import {expect, spy} from 'chai';
7
7
  import * as prebidGlobal from 'src/prebidGlobal.js';
8
- import { EVENTS } from 'src/constants.json';
8
+ import CONSTANTS from 'src/constants.json';
9
9
  import adapterManager, { gdprDataHandler, uspDataHandler } from 'src/adapterManager.js';
10
10
  import parse from 'url-parse';
11
11
 
@@ -279,9 +279,9 @@ describe('#bidViewability', function() {
279
279
  let call = callBidViewableBidderSpy.getCall(0);
280
280
  expect(call.args[0]).to.equal(PBJS_WINNING_BID.bidder);
281
281
  expect(call.args[1]).to.deep.equal(PBJS_WINNING_BID);
282
- // EVENTS.BID_VIEWABLE is triggered
282
+ // CONSTANTS.EVENTS.BID_VIEWABLE is triggered
283
283
  call = eventsEmitSpy.getCall(0);
284
- expect(call.args[0]).to.equal(EVENTS.BID_VIEWABLE);
284
+ expect(call.args[0]).to.equal(CONSTANTS.EVENTS.BID_VIEWABLE);
285
285
  expect(call.args[1]).to.deep.equal(PBJS_WINNING_BID);
286
286
  });
287
287
 
@@ -290,7 +290,7 @@ describe('#bidViewability', function() {
290
290
  expect(triggerPixelSpy.callCount).to.equal(0);
291
291
  // adapterManager.callBidViewableBidder is NOT called
292
292
  expect(callBidViewableBidderSpy.callCount).to.equal(0);
293
- // EVENTS.BID_VIEWABLE is NOT triggered
293
+ // CONSTANTS.EVENTS.BID_VIEWABLE is NOT triggered
294
294
  expect(eventsEmitSpy.callCount).to.equal(0);
295
295
  });
296
296
  });
@@ -183,7 +183,7 @@ describe('Codefuel Adapter', function () {
183
183
  tmax: 500
184
184
  }
185
185
  const res = spec.buildRequests([bidRequest], commonBidderRequest)
186
- expect(res.url).to.equal('https://bidder-url.com')
186
+ expect(res.url).to.equal('https://ai-p-codefuel-ds-rtb-us-east-1-k8s.seccint.com/prebid')
187
187
  expect(res.data).to.deep.equal(expectedData)
188
188
  })
189
189
 
@@ -186,6 +186,15 @@ describe('ColossussspAdapter', function () {
186
186
  });
187
187
  });
188
188
 
189
+ describe('onBidWon', function () {
190
+ it('should make an ajax call', function () {
191
+ const bid = {
192
+ nurl: 'http://example.com/win',
193
+ };
194
+ expect(spec.onBidWon(bid)).to.equals(undefined);
195
+ });
196
+ })
197
+
189
198
  describe('getUserSyncs', function () {
190
199
  let userSync = spec.getUserSyncs();
191
200
  it('Returns valid URL and type', function () {
@@ -0,0 +1,397 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/compassBidAdapter.js';
3
+ import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
+ import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
+
6
+ const bidder = 'compass'
7
+
8
+ describe('CompassBidAdapter', function () {
9
+ const bids = [
10
+ {
11
+ bidId: getUniqueIdentifierStr(),
12
+ bidder: bidder,
13
+ mediaTypes: {
14
+ [BANNER]: {
15
+ sizes: [[300, 250]]
16
+ }
17
+ },
18
+ params: {
19
+ placementId: 'testBanner',
20
+ }
21
+ },
22
+ {
23
+ bidId: getUniqueIdentifierStr(),
24
+ bidder: bidder,
25
+ mediaTypes: {
26
+ [VIDEO]: {
27
+ playerSize: [[300, 300]],
28
+ minduration: 5,
29
+ maxduration: 60
30
+ }
31
+ },
32
+ params: {
33
+ placementId: 'testVideo',
34
+ }
35
+ },
36
+ {
37
+ bidId: getUniqueIdentifierStr(),
38
+ bidder: bidder,
39
+ mediaTypes: {
40
+ [NATIVE]: {
41
+ native: {
42
+ title: {
43
+ required: true
44
+ },
45
+ body: {
46
+ required: true
47
+ },
48
+ icon: {
49
+ required: true,
50
+ size: [64, 64]
51
+ }
52
+ }
53
+ }
54
+ },
55
+ params: {
56
+ placementId: 'testNative',
57
+ }
58
+ }
59
+ ];
60
+
61
+ const invalidBid = {
62
+ bidId: getUniqueIdentifierStr(),
63
+ bidder: bidder,
64
+ mediaTypes: {
65
+ [BANNER]: {
66
+ sizes: [[300, 250]]
67
+ }
68
+ },
69
+ params: {
70
+
71
+ }
72
+ }
73
+
74
+ const bidderRequest = {
75
+ uspConsent: '1---',
76
+ gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
77
+ refererInfo: {
78
+ referer: 'https://test.com'
79
+ }
80
+ };
81
+
82
+ describe('isBidRequestValid', function () {
83
+ it('Should return true if there are bidId, params and key parameters present', function () {
84
+ expect(spec.isBidRequestValid(bids[0])).to.be.true;
85
+ });
86
+ it('Should return false if at least one of parameters is not present', function () {
87
+ expect(spec.isBidRequestValid(invalidBid)).to.be.false;
88
+ });
89
+ });
90
+
91
+ describe('buildRequests', function () {
92
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
93
+
94
+ it('Creates a ServerRequest object with method, URL and data', function () {
95
+ expect(serverRequest).to.exist;
96
+ expect(serverRequest.method).to.exist;
97
+ expect(serverRequest.url).to.exist;
98
+ expect(serverRequest.data).to.exist;
99
+ });
100
+
101
+ it('Returns POST method', function () {
102
+ expect(serverRequest.method).to.equal('POST');
103
+ });
104
+
105
+ it('Returns valid URL', function () {
106
+ expect(serverRequest.url).to.equal('https://sa-lb.deliverimp.com/pbjs');
107
+ });
108
+
109
+ it('Returns general data valid', function () {
110
+ let data = serverRequest.data;
111
+ expect(data).to.be.an('object');
112
+ expect(data).to.have.all.keys('deviceWidth',
113
+ 'deviceHeight',
114
+ 'language',
115
+ 'secure',
116
+ 'host',
117
+ 'page',
118
+ 'placements',
119
+ 'coppa',
120
+ 'ccpa',
121
+ 'gdpr',
122
+ 'tmax'
123
+ );
124
+ expect(data.deviceWidth).to.be.a('number');
125
+ expect(data.deviceHeight).to.be.a('number');
126
+ expect(data.language).to.be.a('string');
127
+ expect(data.secure).to.be.within(0, 1);
128
+ expect(data.host).to.be.a('string');
129
+ expect(data.page).to.be.a('string');
130
+ expect(data.coppa).to.be.a('number');
131
+ expect(data.gdpr).to.be.a('string');
132
+ expect(data.ccpa).to.be.a('string');
133
+ expect(data.tmax).to.be.a('number');
134
+ expect(data.placements).to.have.lengthOf(3);
135
+ });
136
+
137
+ it('Returns valid placements', function () {
138
+ const { placements } = serverRequest.data;
139
+ for (let i = 0, len = placements.length; i < len; i++) {
140
+ const placement = placements[i];
141
+ expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
142
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
143
+ expect(placement.bidId).to.be.a('string');
144
+ expect(placement.schain).to.be.an('object');
145
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
146
+
147
+ if (placement.adFormat === BANNER) {
148
+ expect(placement.sizes).to.be.an('array');
149
+ }
150
+ switch (placement.adFormat) {
151
+ case BANNER:
152
+ expect(placement.sizes).to.be.an('array');
153
+ break;
154
+ case VIDEO:
155
+ expect(placement.playerSize).to.be.an('array');
156
+ expect(placement.minduration).to.be.an('number');
157
+ expect(placement.maxduration).to.be.an('number');
158
+ break;
159
+ case NATIVE:
160
+ expect(placement.native).to.be.an('object');
161
+ break;
162
+ }
163
+ }
164
+ });
165
+
166
+ it('Returns data with gdprConsent and without uspConsent', function () {
167
+ delete bidderRequest.uspConsent;
168
+ serverRequest = spec.buildRequests(bids, bidderRequest);
169
+ let data = serverRequest.data;
170
+ expect(data.gdpr).to.exist;
171
+ expect(data.gdpr).to.be.a('string');
172
+ expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
173
+ expect(data.ccpa).to.not.exist;
174
+ delete bidderRequest.gdprConsent;
175
+ });
176
+
177
+ it('Returns data with uspConsent and without gdprConsent', function () {
178
+ bidderRequest.uspConsent = '1---';
179
+ delete bidderRequest.gdprConsent;
180
+ serverRequest = spec.buildRequests(bids, bidderRequest);
181
+ let data = serverRequest.data;
182
+ expect(data.ccpa).to.exist;
183
+ expect(data.ccpa).to.be.a('string');
184
+ expect(data.ccpa).to.equal(bidderRequest.uspConsent);
185
+ expect(data.gdpr).to.not.exist;
186
+ });
187
+
188
+ it('Returns empty data if no valid requests are passed', function () {
189
+ serverRequest = spec.buildRequests([], bidderRequest);
190
+ let data = serverRequest.data;
191
+ expect(data.placements).to.be.an('array').that.is.empty;
192
+ });
193
+ });
194
+
195
+ describe('interpretResponse', function () {
196
+ it('Should interpret banner response', function () {
197
+ const banner = {
198
+ body: [{
199
+ mediaType: 'banner',
200
+ width: 300,
201
+ height: 250,
202
+ cpm: 0.4,
203
+ ad: 'Test',
204
+ requestId: '23fhj33i987f',
205
+ ttl: 120,
206
+ creativeId: '2',
207
+ netRevenue: true,
208
+ currency: 'USD',
209
+ dealId: '1',
210
+ meta: {
211
+ advertiserDomains: ['google.com'],
212
+ advertiserId: 1234
213
+ }
214
+ }]
215
+ };
216
+ let bannerResponses = spec.interpretResponse(banner);
217
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
218
+ let dataItem = bannerResponses[0];
219
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
220
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
221
+ expect(dataItem.requestId).to.equal(banner.body[0].requestId);
222
+ expect(dataItem.cpm).to.equal(banner.body[0].cpm);
223
+ expect(dataItem.width).to.equal(banner.body[0].width);
224
+ expect(dataItem.height).to.equal(banner.body[0].height);
225
+ expect(dataItem.ad).to.equal(banner.body[0].ad);
226
+ expect(dataItem.ttl).to.equal(banner.body[0].ttl);
227
+ expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
228
+ expect(dataItem.netRevenue).to.be.true;
229
+ expect(dataItem.currency).to.equal(banner.body[0].currency);
230
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
231
+ });
232
+ it('Should interpret video response', function () {
233
+ const video = {
234
+ body: [{
235
+ vastUrl: 'test.com',
236
+ mediaType: 'video',
237
+ cpm: 0.5,
238
+ requestId: '23fhj33i987f',
239
+ ttl: 120,
240
+ creativeId: '2',
241
+ netRevenue: true,
242
+ currency: 'USD',
243
+ dealId: '1',
244
+ meta: {
245
+ advertiserDomains: ['google.com'],
246
+ advertiserId: 1234
247
+ }
248
+ }]
249
+ };
250
+ let videoResponses = spec.interpretResponse(video);
251
+ expect(videoResponses).to.be.an('array').that.is.not.empty;
252
+
253
+ let dataItem = videoResponses[0];
254
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
255
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
256
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
257
+ expect(dataItem.cpm).to.equal(0.5);
258
+ expect(dataItem.vastUrl).to.equal('test.com');
259
+ expect(dataItem.ttl).to.equal(120);
260
+ expect(dataItem.creativeId).to.equal('2');
261
+ expect(dataItem.netRevenue).to.be.true;
262
+ expect(dataItem.currency).to.equal('USD');
263
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
264
+ });
265
+ it('Should interpret native response', function () {
266
+ const native = {
267
+ body: [{
268
+ mediaType: 'native',
269
+ native: {
270
+ clickUrl: 'test.com',
271
+ title: 'Test',
272
+ image: 'test.com',
273
+ impressionTrackers: ['test.com'],
274
+ },
275
+ ttl: 120,
276
+ cpm: 0.4,
277
+ requestId: '23fhj33i987f',
278
+ creativeId: '2',
279
+ netRevenue: true,
280
+ currency: 'USD',
281
+ meta: {
282
+ advertiserDomains: ['google.com'],
283
+ advertiserId: 1234
284
+ }
285
+ }]
286
+ };
287
+ let nativeResponses = spec.interpretResponse(native);
288
+ expect(nativeResponses).to.be.an('array').that.is.not.empty;
289
+
290
+ let dataItem = nativeResponses[0];
291
+ expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
292
+ expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
293
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
294
+ expect(dataItem.cpm).to.equal(0.4);
295
+ expect(dataItem.native.clickUrl).to.equal('test.com');
296
+ expect(dataItem.native.title).to.equal('Test');
297
+ expect(dataItem.native.image).to.equal('test.com');
298
+ expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
299
+ expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
300
+ expect(dataItem.ttl).to.equal(120);
301
+ expect(dataItem.creativeId).to.equal('2');
302
+ expect(dataItem.netRevenue).to.be.true;
303
+ expect(dataItem.currency).to.equal('USD');
304
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
305
+ });
306
+ it('Should return an empty array if invalid banner response is passed', function () {
307
+ const invBanner = {
308
+ body: [{
309
+ width: 300,
310
+ cpm: 0.4,
311
+ ad: 'Test',
312
+ requestId: '23fhj33i987f',
313
+ ttl: 120,
314
+ creativeId: '2',
315
+ netRevenue: true,
316
+ currency: 'USD',
317
+ dealId: '1'
318
+ }]
319
+ };
320
+
321
+ let serverResponses = spec.interpretResponse(invBanner);
322
+ expect(serverResponses).to.be.an('array').that.is.empty;
323
+ });
324
+ it('Should return an empty array if invalid video response is passed', function () {
325
+ const invVideo = {
326
+ body: [{
327
+ mediaType: 'video',
328
+ cpm: 0.5,
329
+ requestId: '23fhj33i987f',
330
+ ttl: 120,
331
+ creativeId: '2',
332
+ netRevenue: true,
333
+ currency: 'USD',
334
+ dealId: '1'
335
+ }]
336
+ };
337
+ let serverResponses = spec.interpretResponse(invVideo);
338
+ expect(serverResponses).to.be.an('array').that.is.empty;
339
+ });
340
+ it('Should return an empty array if invalid native response is passed', function () {
341
+ const invNative = {
342
+ body: [{
343
+ mediaType: 'native',
344
+ clickUrl: 'test.com',
345
+ title: 'Test',
346
+ impressionTrackers: ['test.com'],
347
+ ttl: 120,
348
+ requestId: '23fhj33i987f',
349
+ creativeId: '2',
350
+ netRevenue: true,
351
+ currency: 'USD',
352
+ }]
353
+ };
354
+ let serverResponses = spec.interpretResponse(invNative);
355
+ expect(serverResponses).to.be.an('array').that.is.empty;
356
+ });
357
+ it('Should return an empty array if invalid response is passed', function () {
358
+ const invalid = {
359
+ body: [{
360
+ ttl: 120,
361
+ creativeId: '2',
362
+ netRevenue: true,
363
+ currency: 'USD',
364
+ dealId: '1'
365
+ }]
366
+ };
367
+ let serverResponses = spec.interpretResponse(invalid);
368
+ expect(serverResponses).to.be.an('array').that.is.empty;
369
+ });
370
+ });
371
+
372
+ describe('getUserSyncs', function() {
373
+ it('Should return array of objects with proper sync config , include GDPR', function() {
374
+ const syncData = spec.getUserSyncs({}, {}, {
375
+ consentString: 'ALL',
376
+ gdprApplies: true,
377
+ }, {});
378
+ expect(syncData).to.be.an('array').which.is.not.empty;
379
+ expect(syncData[0]).to.be.an('object')
380
+ expect(syncData[0].type).to.be.a('string')
381
+ expect(syncData[0].type).to.equal('image')
382
+ expect(syncData[0].url).to.be.a('string')
383
+ expect(syncData[0].url).to.equal('https://sa-cs.deliverimp.com/image?pbjs=1&gdpr=1&gdpr_consent=ALL&coppa=0')
384
+ });
385
+ it('Should return array of objects with proper sync config , include CCPA', function() {
386
+ const syncData = spec.getUserSyncs({}, {}, {}, {
387
+ consentString: '1---'
388
+ });
389
+ expect(syncData).to.be.an('array').which.is.not.empty;
390
+ expect(syncData[0]).to.be.an('object')
391
+ expect(syncData[0].type).to.be.a('string')
392
+ expect(syncData[0].type).to.equal('image')
393
+ expect(syncData[0].url).to.be.a('string')
394
+ expect(syncData[0].url).to.equal('https://sa-cs.deliverimp.com/image?pbjs=1&ccpa_consent=1---&coppa=0')
395
+ });
396
+ });
397
+ });